Rails'de e-postaları nasıl önizlerim?


116

Bu aptalca bir soru olabilir, ancak Rails'de bir HTML e-postasını bir araya getirdiğimde, şablonu tarayıcıda önizlemenin özellikle kolay yerleşik bir yolu var mı yoksa onu çeken bir tür özel denetleyici yazmam mı gerekiyor? onun görüşüne göre?


2
Görünüşe göre aptalca sorular yok: D
2016

Yanıtlar:


134

Action Mailer artık Rails 4.1'de e-postaları önizlemek için yerleşik bir yola sahip . Örneğin, şuna bir bakın:

# 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 Bunun tasarım gereği oldukça emin - kullanıcıların postanızı üretim sunucularında önizlemesini istemezsiniz, bu yalnızca yerel geliştirme içindir.
mpowered

1
@mpowered Peki ya kullanıcıların göndermek üzere oldukları postaları önizlemelerini / değiştirmelerini İSTERSEM? (Ör: bir yönetici bir kullanıcı başvurusunu reddeder ve başvuranı uyarmak için bir e-posta gönderilir)
Cyril Duchon-Doris

2
@CyrilDD Kendin böyle bir şey inşa etmelisin, bunun o iş için bir araç olacağını sanmıyorum.
benjaminjosephw


8
Rspec kullanıyorsanız, önizlemeleriniz girilirspec/mailers/previews
Drew Stephens

73

Daniel'in cevabı iyi bir başlangıç, ancak e-posta şablonlarınız herhangi bir dinamik veri içeriyorsa işe yaramayacaktır. Örneğin, e-postanızın bir sipariş makbuzu olduğunu ve bunun içinde yazdırdığınızı varsayalım @order.total_price- önceki yöntemi kullanarak @orderdeğişken sıfır olacaktır.

İşte kullandığım küçük bir tarif:

İlk olarak, bu e-posta önizleme işlevi kesinlikle yalnızca dahili kullanım için olduğundan, yönetici ad alanında bazı genel yollar ayarladım:

#routes.rb

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

Sonra, denetleyiciyi oluşturuyorum. Bu denetleyicide, e-posta şablonu başına bir yöntem oluşturuyorum. Çoğu e-posta dinamik veri içerdiğinden, şablonun beklediği üye değişkenlerini doldurmamız gerekir.

Bu, armatürlerle yapılabilir, ancak ben genellikle sadece bazı sahte rastgele gerçek verileri almayı tercih ederim. Unutmayın - bu bir birim testi DEĞİLDİR - bu tamamen bir geliştirme yardımıdır. Her seferinde aynı sonucu üretmesi gerekmez - aslında - yapmaması muhtemelen daha iyidir!

#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

Şablonu oluşturduğumuzda kullandığımızı unutmayın layout=>:mailer. Bu, e-postanızın gövdesini tipik web uygulaması düzeninizin (ör. application.html.erb) Yerine oluşturduğunuz HTML e-posta düzeninin içine yerleştirir .

Ve hemen hemen bu kadar. Şimdi hoş geldiniz e-posta şablonumdaki değişikliği önizlemek için http://example.com/admin/mailer/preview_welcome adresini ziyaret edebilirim .


Aslında bu tam olarak benim aldığım ve cevabınızı okumaya başladığımda kodladığım yaklaşımdı - teşekkür ederim :)
Peter Nixey

Mükemmel cevap! Tam olarak ihtiyacım olan şey!
Kulgar

İşte bu lezzetli bir tarif! Harika cevap için teşekkürler!
Rob Cooper

Bu harika bir cevap! Teşekkür ederim!
OzBandit

5
Rota get 'mailer...yerine şimdi olmalıdır match.
Patrick Berkeley


16

Gördüğüm en kolay kurulum MailCatcher . Kurulum 2 dakika sürdü ve kutudan çıkar çıkmaz yeni postalar için çalışıyor.


Bu gerçekten harika. Kurulum çok hızlıdır ve tüm postacılar için çalışır! Harika bir ipucu!
2016


5

Kısa bir süre önce , uygulama e-postalarını bir tarayıcı aracılığıyla önizlemek, düzenlemek (şablon dosyası) ve teslim etmek için Maily adında bir mücevher yazdım . Ayrıca, verileri bağlamak için kolay bir yol, esnek bir yetkilendirme sistemi ve minimalist bir kullanıcı arayüzü sağlar.

Yakın gelecekte aşağıdakiler gibi yeni özellikler eklemeyi planladım:

  • E-posta başına birden çok kanca
  • E-postaları UI aracılığıyla parametrelendirme (postacı yönteminin bağımsız değişkenleri)
  • Çeviri tuşlarıyla oynayın (liste, vurgulama, ...)

Umarım size yardımcı olabilir.



4

railskullanırsanız bir posta önizlemesi oluşturur rails g mailer CustomMailer. Bir dosya alacak CustomMailerPreviewiçinispec/mailers/previewsKlasörün .

Burada, postayı çağıracak ve bir önizleme oluşturacak yönteminizi yazabilirsiniz.

Örneğin -

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

Tüm e-postaları http: // localhost: 3000 / rails / mailers / custom_mailer adresinde önizleyin


Rspec içeren uygulamam için ekledim config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro

3

Rails Email Preview, e-postayı geliştirme modunda web tarayıcısında hızlı bir şekilde görüntülememize yardımcı olur.

1) “gem ‘rails_email_preview’, ‘~> 0.2.29’ “Gem dosyasına ve paket kurulumuna ekleyin .

2) Çalıştır “rails g rails_email_preview:install” Bunu , yapılandırma klasöründe başlatıcı oluşturur ve rotalar ekler.

3) “rails g rails_email_preview:update_previews”Bu crates mailer_previews klasörünü uygulama dizininde çalıştırın.

Generator, e-postalarınızın her birine bir saplama ekleyecek, ardından saplamayı sahte verilerle dolduracaktır.

Ör:

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) Arama sorgusundaki parametreler, sınıfın önizlemesi için bir örnek değişken olarak mevcut olacaktır. Ör: “/emails/user_mailer_preview-welcome?user_id=1” @user_idHoşgeldin yönteminde tanımlandığı gibi bir URL'miz varsa UserMailerPreview, belirli bir kullanıcıya posta göndermemize yardımcı olur.

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

5) Bunun gibi REP url'lerine erişmek için

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

6) REP yoluyla e-posta gönderebiliriz, bu ortam posta ayarlarını kullanacaktır. Test ortamında posta göndermeyi devre dışı bırakmak için başlatıcıdaki bu satırın açıklamasını kaldırın.

config.enable_send_email = false

Kaynak: RailsCarma Blog: Mail_View Gem ile Rails Uygulamalarında E-postaları Önizleme


3

Hiç kimsenin letter_opener'dan bahsetmemesine şaşırdım . Dev'de bir e-posta teslim edildiğinde e-postaları bir tarayıcı sayfası olarak işleyecek ve açacak bir mücevher.


1
letter_opener harika bir mücevher ve sahip olunması gereken bir şey. Ancak bazen posta, yalnızca postanın html / css'sini kontrol etmek için oynamaktan kaçınmak istediğiniz özel olaylardan başlar.
Mauro

2

Doğrudan Postadan önizlemenin bir yolu yoktur. Ama yazdığınız gibi, buna benzer bir kontrolör yazabilirsiniz.

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

Ama bence, doğru görünüyorlarsa, e-postaları test etmenin en iyi yolu bu değil.


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'e-postanın gövdesini uygulamanız için oluşturduğunuz HTML e-posta düzeninin içine yerleştirir.
dexter

Bunun için teşekkürler - tarayıcı uyumluluğunu iki kez kontrol etmek istemiyorum, bunu ayrı ayrı ele alacağım, sadece bir şeyi çabucak tükürmek ve nasıl göründüğünü görmek istiyorum - yaklaşımınızın bunun için iyi olduğunu düşünüyorum
Peter Nixey

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.