Comment prévisualiser les e-mails dans Rails?

116

Cela peut être une question stupide, mais lorsque je mets en place un e-mail HTML dans Rails, existe-t-il un moyen intégré particulièrement simple de prévisualiser le modèle dans le navigateur ou dois-je écrire une sorte de contrôleur personnalisé qui le tire en tant que son point de vue?

Peter Nixey
la source
2
Apparemment, il n'y a pas de questions stupides: D
knagode

Réponses:

134

Action Mailer dispose désormais d'un moyen intégré de prévisualiser les e-mails dans Rails 4.1 . Par exemple, vérifiez ceci:

# 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
la source
5
@andres Bien sûr, c'est par conception - vous ne voulez pas que les utilisateurs prévisualisent votre courrier sur les serveurs de production, c'est uniquement destiné au développement local.
mpowered le
1
@mpowered Et si je veux que les utilisateurs puissent prévisualiser / modifier les e-mails qu'ils sont sur le point d'envoyer? (Ex: un responsable refuse une candidature utilisateur, et un email est envoyé pour avertir le candidat)
Cyril Duchon-Doris
2
@CyrilDD Vous auriez à construire quelque chose comme ça vous-même, je ne pense pas que ce serait l'outil pour ce travail.
benjaminjosephw
1
L'aperçu est disponible dans localhost: 3000 / rails / mailers / notifier / welcome , et une liste d'entre eux dans localhost: 3000 / rails / mailers .
zires
8
Si vous utilisez Rspec, vos aperçus vont dansspec/mailers/previews
Drew Stephens
73

La réponse de Daniel est un bon début, mais si vos modèles de courrier électronique contiennent des données dynamiques, cela ne fonctionnera pas. Par exemple, supposons que votre e-mail soit un reçu de commande et que vous y imprimiez @order.total_price- en utilisant la méthode précédente, la @ordervariable sera nulle.

Voici une petite recette que j'utilise:

Tout d'abord, puisque cette fonctionnalité de prévisualisation des e-mails est définitivement à usage interne uniquement, j'ai configuré des routes génériques dans l'espace de noms admin:

#routes.rb

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

Ensuite, je crée le contrôleur. Dans ce contrôleur, je crée une méthode par modèle d'e-mail. Étant donné que la plupart des e-mails contiennent des données dynamiques, nous devons renseigner les variables membres attendues par le modèle.

Cela pourrait être fait avec des appareils, mais je préfère généralement récupérer des données réelles pseudo-aléatoires. N'oubliez pas - ce n'est PAS un test unitaire - c'est purement une aide au développement. Il n'a pas besoin de produire le même résultat à chaque fois - en fait, c'est probablement mieux si ce n'est pas le cas!

#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

Notez que lorsque nous rendons le modèle, nous utilisons layout=>:mailer. Cela intègre le corps de votre e-mail dans la mise en page HTML que vous avez créée au lieu de l'intérieur de la mise en page typique de votre application Web (par exemple application.html.erb).

Et c'est à peu près tout. Je peux maintenant visiter http://example.com/admin/mailer/preview_welcome pour prévisualiser les modifications apportées à mon modèle d'e-mail de bienvenue.

Cailinanne
la source
C'était en fait exactement l'approche que j'avais adoptée et que je viens de coder au moment où j'ai commencé à lire votre réponse - merci :)
Peter Nixey
Très bonne réponse! Exactement ce dont j'avais besoin!
Kulgar
Voilà une recette savoureuse! Merci pour la bonne réponse!
Rob Cooper
C'est une réponse géniale! Je vous remercie!
OzBandit
5
L'itinéraire devrait être get 'mailer...maintenant au lieu de match.
Patrick Berkeley
18

37Signals possède également son propre gem de test de messagerie appelé mail_view . C'est assez fantastique.

Marc
la source
Aucun problème. Quelle manière avez-vous fini par utiliser?
Marc
Bac quand j'ai posté ceci, j'ai résolu le problème avec un contrôleur personnalisé que j'ai écrit moi-même mais je vais le refaire bientôt, je vais donc faire des expériences avec cela
Peter Nixey
16

La configuration la plus simple que j'ai vue est MailCatcher . L'installation a pris 2 minutes et fonctionne pour les nouveaux expéditeurs prêts à l'emploi.

Galien
la source
C'est vraiment génial. La configuration est très rapide et fonctionne pour tous les expéditeurs! Bon conseil!
rept
5

J'ai récemment écrit un joyau nommé Maily pour prévisualiser, éditer (fichier modèle) et envoyer les e-mails de l'application via un navigateur. Il fournit également un moyen convivial de raccorder des données, un système d'autorisation flexible et une interface utilisateur minimaliste.

J'ai prévu d'ajouter de nouvelles fonctionnalités dans un proche avenir, comme:

  • Plusieurs crochets par e-mail
  • Paramétrer les e-mails via l'interface utilisateur (arguments de la méthode mailer)
  • Jouez avec les touches de traduction (liste, surlignage, ...)

J'espère que cela peut vous aider.

marchés
la source
4

Vous pouvez utiliser Rails Email Preview

Capture d'écran de rails-email-preview

REP est un moteur rails aux e - mails de prévisualisation et envoi de test, avec le soutien de I18n, l' intégration de premailer facile et CMS en option d' édition avec comfortable_mexican_sofa .

glebm
la source
Existe-t-il des exemples sur la manière de réaliser l'intégration entre REP et CMS?
danieldekay
Je ne connais aucune application de démonstration, mais il y a un article
glebm
4

railsgénère un aperçu du courrier si vous utilisez rails g mailer CustomMailer. Vous obtiendrez un fichier CustomMailerPreviewdans le spec/mailers/previewsdossier.

Ici, vous pouvez écrire votre méthode qui appellera le mailer et générera un aperçu.

Pour ex -

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

Prévisualisez tous les e-mails sur http: // localhost: 3000 / rails / mailers / custom_mailer

Swaps
la source
Pour mon application avec rspec, j'ai ajouté config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro
3

Rails Email Preview nous aide à visualiser rapidement l'e-mail dans le navigateur Web en mode développement.

1) Ajouter “gem ‘rails_email_preview’, ‘~> 0.2.29’ “au fichier gem et installer l'ensemble.

2) Courir “rails g rails_email_preview:install” ceci crée un initialiseur dans le dossier de configuration et ajoutez des routes.

3) Exécutez “rails g rails_email_preview:update_previews”ce dossier crates mailer_previews dans le répertoire de l'application.

Generator ajoutera un stub à chacun de vos e-mails, puis vous remplissez le stub avec des données factices.

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) Les paramètres de la requête de recherche seront disponibles en tant que variable d'instance pour prévisualiser la classe. Ex: si nous avons une URL telle que “/emails/user_mailer_preview-welcome?user_id=1” @user_iddéfinie dans la méthode de bienvenue, UserMailerPreviewcela nous aide à envoyer du courrier à un utilisateur spécifique.

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

5) Pour accéder aux URL de REP comme celle-ci

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

6) Nous pouvons envoyer des e-mails via REP, cela utilisera les paramètres d'environnement de messagerie. Décommentez cette ligne dans l'initialiseur pour désactiver l'envoi de courrier dans l'environnement de test.

config.enable_send_email = false

Source: Blog RailsCarma: Aperçu des e-mails dans les applications Rails avec la gemme Mail_View

Carma Tec
la source
3

Je suis surpris que personne n'ait mentionné letter_opener . C'est un joyau qui rendra et ouvrira les e-mails en tant que page de navigateur chaque fois qu'un e-mail est livré en dev.

KurtPreston
la source
1
letter_opener est un joyau cool et c'est un must have. Mais parfois, le courrier part d'événements spéciaux que vous voulez éviter de jouer pour vérifier uniquement le html / css du courrier.
Mauro
2

Il n'y a aucun moyen de le prévisualiser directement à partir du Mailer. Mais comme vous l'avez écrit, vous pouvez écrire un contrôleur, qui ressemble à quelque chose comme ça.

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

Mais je pense que ce n'est pas la meilleure façon de tester les e-mails, s'ils semblent corrects.

Daniel Spangenberg
la source
3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'intégrera le corps de l'e-mail dans la mise en page HTML que vous avez créée pour votre application.
dexter
Merci pour cela - je ne veux pas vérifier la compatibilité du navigateur, je traiterais cela séparément, je veux simplement recracher rapidement la chose et voir à quoi elle ressemble - je pense que votre approche fonctionne bien pour cela
Peter Nixey
1

Je préfère la gemme mails_viewer . Ce joyau est très utile car il enregistre le modèle HTML dans le dossier tmp.

Trung Lê
la source