Wie kann ich eine Vorschau von E-Mails in Rails anzeigen?


116

Dies mag eine dumme Frage sein, aber wenn ich eine HTML-E-Mail in Rails zusammenstelle, gibt es eine besonders einfache integrierte Möglichkeit, eine Vorschau der Vorlage im Browser anzuzeigen, oder muss ich eine Art benutzerdefinierten Controller schreiben, der sie abruft in wie seine Ansicht?


2
Anscheinend gibt es keine dummen Fragen: D
Knagode

Antworten:


133

Action Mailer verfügt jetzt über eine integrierte Vorschau von E-Mails in Rails 4.1 . Überprüfen Sie dies zum Beispiel:

# 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 Ziemlich sicher, dass dies beabsichtigt ist - Sie möchten nicht, dass Benutzer eine Vorschau Ihrer E-Mails auf Produktionsservern anzeigen, sondern nur für die lokale Entwicklung.
mpowered

1
@mpowered Und was ist, wenn ich möchte, dass Benutzer E-Mails, die sie senden möchten, in der Vorschau anzeigen / ändern können? (Beispiel: Ein Manager lehnt eine Benutzeranwendung ab und eine E-Mail wird gesendet, um den Antragsteller zu warnen.)
Cyril Duchon-Doris

2
@CyrilDD Du müsstest so etwas selbst bauen, ich glaube nicht, dass dies das Werkzeug für diesen Job wäre.
Benjaminjosephw

1
Die Vorschau ist in localhost verfügbar : 3000 / Rails / Mailer / Notifier / Welcome , und eine Liste davon in localhost: 3000 / Rails / Mailer .
Zires

8
Wenn Sie Rspec verwenden, gehen Ihre Vorschauen inspec/mailers/previews
Drew Stephens

73

Daniels Antwort ist ein guter Anfang, aber wenn Ihre E-Mail-Vorlagen dynamische Daten enthalten, funktioniert dies nicht. Angenommen, Ihre E-Mail ist eine Bestellbestätigung und Sie drucken sie aus. @order.total_priceMit der vorherigen Methode ist die @orderVariable Null.

Hier ist ein kleines Rezept, das ich benutze:

Da diese E-Mail-Vorschau-Funktion definitiv nur für den internen Gebrauch bestimmt ist, habe ich zunächst einige generische Routen im Admin-Namespace eingerichtet:

#routes.rb

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

Als nächstes erstelle ich den Controller. In diesem Controller erstelle ich eine Methode pro E-Mail-Vorlage. Da die meisten E-Mails dynamische Daten enthalten, müssen alle von der Vorlage erwarteten Mitgliedsvariablen ausgefüllt werden.

Dies könnte mit Fixtures gemacht werden, aber ich ziehe es normalerweise vor, nur einige pseudozufällige reale Daten zu erfassen. Denken Sie daran - dies ist KEIN Komponententest - dies ist lediglich eine Entwicklungshilfe. Es muss nicht jedes Mal das gleiche Ergebnis erzielen - tatsächlich ist es wahrscheinlich besser, wenn dies nicht der Fall ist!

#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

Beachten Sie, dass wir beim Rendern der Vorlage verwenden layout=>:mailer. Dadurch wird der Text Ihrer E-Mail in das von Ihnen erstellte HTML-E-Mail-Layout eingebettet, anstatt in Ihr typisches Webanwendungslayout (z application.html.erb. B. ).

Und das war's auch schon. Jetzt kann ich http://example.com/admin/mailer/preview_welcome besuchen, um eine Vorschau der Änderung meiner Begrüßungs-E-Mail-Vorlage anzuzeigen.


Dies war in der Tat genau der Ansatz, den ich gewählt und gerade codiert hatte, als ich anfing, Ihre Antwort zu lesen - danke :)
Peter Nixey

Gute Antwort! Genau das, was ich brauchte!
Kulgar

Das ist ein leckeres Rezept! Danke für die tolle Antwort!
Rob Cooper

Das ist eine großartige Antwort! Danke dir!
OzBandit

5
Die Route sollte get 'mailer...jetzt statt sein match.
Patrick Berkeley

18

37Signals hat auch ein eigenes Mail-Test-Juwel namens mail_view . Es ist ziemlich fantastisch.


Kein Problem. Welchen Weg haben Sie letztendlich beschritten?
Marc

Bac, als ich dies gepostet habe, habe ich das Problem mit einem benutzerdefinierten Controller gelöst, den ich selbst geschrieben habe, aber ich werde es bald wieder treffen, also werde ich damit experimentieren
Peter Nixey

16

Das einfachste Setup, das ich gesehen habe, ist MailCatcher . Die Einrichtung dauerte 2 Minuten und funktioniert sofort für neue Mailer.


Das ist in der Tat großartig. Das Setup ist sehr schnell und funktioniert für alle Mailer! Toller Tipp!
Rept


5

Ich habe kürzlich ein Juwel namens Maily geschrieben , um die Anwendungs-E-Mails in der Vorschau anzuzeigen , zu bearbeiten (Vorlagendatei) und über einen Browser zuzustellen. Es bietet auch eine benutzerfreundliche Möglichkeit, Daten zu verknüpfen, ein flexibles Autorisierungssystem und eine minimalistische Benutzeroberfläche.

Ich habe geplant, in naher Zukunft neue Funktionen hinzuzufügen, wie zum Beispiel:

  • Mehrere Hooks pro E-Mail
  • Parametrisieren Sie E-Mails über die Benutzeroberfläche (Argumente der Mailer-Methode)
  • Spielen Sie mit den Übersetzungstasten (Liste, Hervorhebung, ...)

Ich hoffe es kann dir helfen.



4

railsgeneriert eine E-Mail-Vorschau, wenn Sie verwenden rails g mailer CustomMailer. Sie erhalten eine Datei CustomMailerPreviewim spec/mailers/previewsOrdner.

Hier können Sie Ihre Methode schreiben, die den Mailer aufruft und eine Vorschau generiert.

Zum Beispiel -

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

Vorschau aller E-Mails unter http: // localhost: 3000 / Rails / Mailers / Custom_mailer


Für meine App mit rspec habe ich hinzugefügt config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro

3

Mit der E-Mail-Vorschau von Rails können wir die E-Mail im Entwicklungsmodus schnell im Webbrowser anzeigen.

1) “gem ‘rails_email_preview’, ‘~> 0.2.29’ “Zur Gem-Datei hinzufügen und Bundle installieren.

2) Führen Sie “rails g rails_email_preview:install”dies aus, um den Initialisierer im Konfigurationsordner zu erstellen und Routen hinzuzufügen.

3) Führen Sie “rails g rails_email_preview:update_previews”diesen Ordner mit den Kisten mailer_previews im App-Verzeichnis aus.

Der Generator fügt jeder Ihrer E-Mails einen Stub hinzu, und dann füllen Sie den Stub mit Scheindaten.

Ex:

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) Parameter in der Suchabfrage stehen als Instanzvariable für die Vorschau der Klasse zur Verfügung. Beispiel: Wenn wir eine URL haben, wie “/emails/user_mailer_preview-welcome?user_id=1” @user_idsie in der Begrüßungsmethode definiert ist, können UserMailerPreviewwir E-Mails an einen bestimmten Benutzer senden.

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

5) Um auf solche REP-URLs zuzugreifen

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

6) Wir können E-Mails über REP senden. Dabei werden die Einstellungen des Umgebungsmailers verwendet. Kommentieren Sie diese Zeile im Initialisierer aus, um das Senden von E-Mails in der Testumgebung zu deaktivieren.

config.enable_send_email = false

Quelle: RailsCarma Blog: Vorschau von E-Mails in Rails-Anwendungen mit dem Mail_View Gem


3

Ich bin überrascht, dass niemand letter_opener erwähnt hat . Es ist ein Juwel, das E-Mails als Browserseite rendert und öffnet, wenn eine E-Mail in dev zugestellt wird.


1
letter_opener ist ein cooles Juwel und ein Muss. Aber manchmal beginnt die Mail mit besonderen Ereignissen, die Sie vermeiden möchten, um nur das HTML / CSS der Mail zu überprüfen.
Mauro

2

Es gibt keine Möglichkeit, eine Vorschau direkt aus dem Mailer heraus anzuzeigen. Aber wie Sie geschrieben haben, können Sie einen Controller schreiben, der ungefähr so ​​aussieht.

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

Aber ich denke, das ist nicht der beste Weg, um E-Mails zu testen, wenn sie richtig aussehen.


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'Der Text der E-Mail wird in das HTML-E-Mail-Layout eingebettet, das Sie für Ihre App erstellt haben.
Dexter

Vielen Dank dafür - ich möchte die Browserkompatibilität nicht überprüfen, ich würde das separat behandeln, ich möchte das Ding einfach schnell ausspucken und sehen, wie es aussieht - ich denke, Ihr Ansatz funktioniert gut dafür
Peter Nixey

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.