Jak wyświetlić podgląd wiadomości e-mail w Railsach?

116

To może być głupie pytanie, ale kiedy przygotowuję wiadomość e-mail w formacie HTML w Railsach, czy istnieje szczególnie łatwy wbudowany sposób podglądania szablonu w przeglądarce, czy też muszę napisać jakiś niestandardowy kontroler, który go pobiera w jego opinii?

Peter Nixey
źródło
2
Najwyraźniej nie ma głupich pytań: D
knagode

Odpowiedzi:

133

Action Mailer ma teraz wbudowany sposób podglądu e-maili w Railsach 4.1 . Na przykład sprawdź to:

# located in test/mailers/previews/notifier_mailer_preview.rb

class NotifierPreview < ActionMailer::Preview
  # Accessible from http://localhost:3000/rails/mailers/notifier/welcome
  def welcome
    Notifier.welcome(User.first)
  end
end
benjaminjosephw
źródło
5
@andres Jestem pewien, że jest to zgodne z projektem - nie chcesz, aby użytkownicy przeglądali Twoją pocztę na serwerach produkcyjnych, jest to przeznaczone tylko do lokalnego programowania.
Uruchomiono
1
@mpowered A co, jeśli chcę, aby użytkownicy mogli przeglądać / modyfikować wiadomości e-mail, które mają zamiar wysłać? (Np. Menedżer odrzuca zgłoszenie użytkownika i wysyłany jest e-mail z ostrzeżeniem)
Cyril Duchon-Doris
2
@CyrilDD Musiałbyś sam zbudować coś takiego, nie sądzę, żeby to było narzędzie do tej pracy.
benjaminjosephw
8
Jeśli używasz Rspec, pojawią się Twoje podglądyspec/mailers/previews
Drew Stephens
73

Odpowiedź Daniela to dobry początek, ale jeśli szablony wiadomości e-mail zawierają dynamiczne dane, to nie zadziała. Załóżmy np., Że Twój e-mail jest potwierdzeniem zamówienia i w nim drukujesz @order.total_price- przy użyciu poprzedniej metody @orderzmienna będzie zerowa.

Oto mały przepis, którego używam:

Po pierwsze, ponieważ ta funkcja podglądu e-mail jest zdecydowanie przeznaczona tylko do użytku wewnętrznego, skonfigurowałem kilka ogólnych tras w przestrzeni nazw administratora:

#routes.rb

MySite::Application.routes.draw do
  namespace :admin do
    match 'mailer(/:action(/:id(.:format)))' => 'mailer#:action'
  end
end

Następnie tworzę kontroler. W tym kontrolerze tworzę jedną metodę na szablon wiadomości e-mail. Ponieważ większość wiadomości e-mail zawiera dane dynamiczne, musimy wypełnić wszelkie zmienne składowe, których oczekuje szablon.

Można to zrobić za pomocą urządzeń, ale zazwyczaj wolę po prostu pobrać pseudolosowe rzeczywiste dane. Pamiętaj - to NIE jest test jednostkowy - to wyłącznie pomoc rozwojowa. Nie musi dawać tego samego wyniku za każdym razem - w rzeczywistości - prawdopodobnie lepiej, jeśli nie!

#app/controllers/admin/mailer_controller.rb
class Admin::MailerController < Admin::ApplicationController

  def preview_welcome()
    @user = User.last
    render :file => 'mailer/welcome.html.erb', :layout => 'mailer'
  end

end

Zauważ, że kiedy renderujemy szablon, używamy layout=>:mailer. Powoduje to osadzenie treści wiadomości e-mail w układzie wiadomości e-mail w formacie HTML, który utworzyłeś, zamiast w typowym układzie aplikacji internetowej (np application.html.erb.).

I to wszystko. Teraz mogę odwiedzić http://example.com/admin/mailer/preview_welcome, aby wyświetlić podgląd zmiany w moim szablonie powitalnej wiadomości e-mail.

cailinanne
źródło
To było dokładnie to podejście, które przyjąłem i właśnie zakodowałem, kiedy zacząłem czytać twoją odpowiedź - dziękuję :)
Peter Nixey
Świetna odpowiedź! Dokładnie to, czego potrzebowałem!
Kulgar
To smaczny przepis! Dzięki za świetną odpowiedź!
Rob Cooper
To niesamowita odpowiedź! Dziękuję Ci!
OzBandit,
5
Trasa powinna być get 'mailer...teraz zamiast match.
Patrick Berkeley,
18

37Signals ma również swój własny klejnot do testowania poczty o nazwie mail_view . To całkiem fantastyczne.

Marc
źródło
Nie ma problemu. W jaki sposób ostatecznie użyłeś?
Marc
Bac, kiedy to opublikowałem, rozwiązałem problem za pomocą niestandardowego kontrolera, który napisałem sam, ale mam zamiar wkrótce to powtórzyć, więc będę z tym eksperymentował
Peter Nixey
16

Najłatwiejszą konfiguracją, jaką widziałem, jest MailCatcher . Konfiguracja zajęła 2 minuty i działa w przypadku nowych przesyłek po wyjęciu z pudełka.

Galen
źródło
To naprawdę świetne. Konfiguracja jest bardzo szybka i działa dla wszystkich mailerów! Świetna wskazówka!
rept
5

Niedawno napisałem klejnot o nazwie Maily, aby przeglądać, edytować (plik szablonu) i dostarczać wiadomości e-mail aplikacji przez przeglądarkę. Zapewnia również przyjazny sposób przechwytywania danych, elastyczny system autoryzacji i minimalistyczny interfejs użytkownika.

W najbliższej przyszłości planowałem dodać nowe funkcje, takie jak:

  • Wiele haczyków na e-mail
  • Parametryzuj wiadomości e-mail za pomocą interfejsu użytkownika (argumenty metody mailer)
  • Graj z klawiszami tłumaczeń (lista, podświetlenie, ...)

Mam nadzieję, że może ci pomóc.

rynki
źródło
4

Możesz użyć Rails Email Preview

zrzut ekranu rails-email-preview

REP jest szynach maszyna do podglądu i testy wysyłać e-maile ze wsparciem I18n, łatwą integrację premailer i opcjonalnych CMS do edycji z comfortable_mexican_sofa .

glebm
źródło
Czy są jakieś przykłady, jak właściwie przeprowadzić integrację między REP i CMS?
danieldekay
Nie znam żadnych aplikacji demonstracyjnych, ale na wiki
glebm
4

railsgeneruje podgląd poczty, jeśli używasz rails g mailer CustomMailer. Dostaniesz plik w CustomMailerPreviewśrodkuspec/mailers/previews folderze.

Tutaj możesz napisać swoją metodę, która wywoła mailer i wygeneruje podgląd.

Dla ex -

class CustomMailerPreview < ActionMailer::Preview
  def contact_us_mail_preview
    CustomMailer.my_mail(user: User.first)
  end
end

Wyświetl podgląd wszystkich wiadomości e-mail pod adresem http: // localhost: 3000 / rails / mailers / custom_mailer

Swapy
źródło
Do mojej aplikacji z rspec dodałem config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro
3

Rails Email Preview pomaga nam szybko wyświetlić wiadomość e-mail w przeglądarce internetowej w trybie programistycznym.

1) Dodaj “gem ‘rails_email_preview’, ‘~> 0.2.29’ “do pliku gem i zainstaluj pakiet.

2) Uruchom “rails g rails_email_preview:install” to, aby utworzyć inicjator w folderze konfiguracyjnym i dodać trasy.

3) Uruchom “rails g rails_email_preview:update_previews”ten folder skrzynek mailer_previews w katalogu aplikacji.

Generator doda kod pośredniczący do każdej wiadomości e-mail, a następnie zapełni go fałszywymi danymi.

Dawny:

class UserMailerPreview
def invitation
UserMailer.invitation mock_user(‘Alice’), mock_user(‘Bob’)
end
def welcome
UserMailer.welcome mock_user
end
private
def mock_user(name = Bill Gates’)
fake_id User.new(name: name, email: user#{rand 100}@test.com”)
end
def fake_id(obj)
obj.define_singleton_method(:id) { 123 + rand(100) }
obj
end
end

4) Parametry w zapytaniu wyszukiwania będą dostępne jako zmienna instancji do podglądu klasy. Na przykład: jeśli mamy adres URL, taki jak “/emails/user_mailer_preview-welcome?user_id=1” @user_idjest zdefiniowany w metodzie powitalnej UserMailerPreview, pomaga nam to wysłać wiadomość do określonego użytkownika.

class UserMailerPreview
def welcome
user = @user_id ? User.find(@user_id) : mock_user
UserMailer.welcome(user)
end
end

5) Aby uzyskać dostęp do adresu URL REP w ten sposób

rails_email_preview.rep_root_url
rails_email_preview.rep_emails_url
rails_email_preview.rep_email_url(‘user_mailer-welcome’)

6) Możemy wysyłać e-maile przez REP, będzie to używać ustawień środowiska pocztowego. Usuń komentarz z tej linii w inicjatorze, aby wyłączyć wysyłanie poczty w środowisku testowym.

config.enable_send_email = false

Źródło: Blog RailsCarma: Podgląd wiadomości e-mail w aplikacjach Railsowych za pomocą klejnotu Mail_View

Carma Tec
źródło
3

Dziwię się, że nikt nie wspomniał o letter_opener . To klejnot, który będzie renderować i otwierać wiadomości e-mail jako strona przeglądarki za każdym razem, gdy wiadomość e-mail zostanie dostarczona w programie dev.

KurtPreston
źródło
1
letter_opener to fajny klejnot i trzeba go mieć. Ale czasami poczta zaczyna się od specjalnych wydarzeń, które chcesz uniknąć, aby sprawdzić czysto HTML / css wiadomości.
Mauro
2

Nie ma możliwości wyświetlenia podglądu bezpośrednio z Mailera. Ale tak jak napisałeś, możesz napisać kontroler, który wygląda mniej więcej tak.

class EmailPreviewsControllers < ActionController::Base
  def show
    render "#{params[:mailer]}_mailer/#{params[:method]}"
  end
end

Ale myślę, że to nie jest najlepszy sposób na testowanie e-maili, jeśli wyglądają poprawnie.

Daniel Spangenberg
źródło
3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'umieści treść wiadomości e-mail w układzie wiadomości e-mail HTML utworzonym dla Twojej aplikacji.
dexter
Dzięki za to - nie chcę podwójnie sprawdzać zgodności przeglądarki, potraktowałbym to osobno, po prostu chcę szybko wypluć i zobaczyć, jak to wygląda - myślę, że twoje podejście się sprawdza
Peter Nixey
1

Wolę gem mails_viewer . Ten klejnot jest bardzo przydatny, ponieważ zapisuje szablon HTML w folderze tmp.

Trung Lê
źródło