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?

Peter Nixey
quelle
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
benjaminjosephw
quelle
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.

Cailinanne
quelle
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.

Marc
quelle
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.

Galen
quelle
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.

Märkte
quelle
4

Sie können die E-Mail-Vorschau von Rails verwenden

Rails-E-Mail-Vorschau Screenshot

REP ist eine Rails-Engine zum Anzeigen und Testen des Sendens von E-Mails mit I18n-Unterstützung, einfacher Premailer-Integration und optionaler CMS-Bearbeitung mit komfortabler_mexican_sofa .

glebm
quelle
Gibt es Beispiele dafür, wie die Integration zwischen REP und CMS tatsächlich durchgeführt wird?
Danieldekay
Ich kenne keine Demo-Anwendungen, aber es gibt einen umfassenden Artikel im Wiki
Glebm
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

Swaps
quelle
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

Carma Tec
quelle
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.

KurtPreston
quelle
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.

Daniel Spangenberg
quelle
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
1

Ich bevorzuge mails_viewer gem. Dieses Juwel ist sehr nützlich, da es die HTML-Vorlage im tmp-Ordner speichert.

Trung Lê
quelle