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?


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

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.


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.


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.


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.



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


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


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.