Как просмотреть электронные письма в Rails?

116

Это может быть глупый вопрос, но когда я собираю HTML-письмо в Rails, есть ли особенно простой встроенный способ предварительного просмотра шаблона в браузере или мне нужно написать какой-то настраиваемый контроллер, который его вытягивает в качестве своей точки зрения?

Питер Никси
источник
2
Видимо нет тупых вопросов: D
knagode

Ответы:

134

Action Mailer теперь имеет встроенный способ предварительного просмотра писем в Rails 4.1 . Например, посмотрите это:

# 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
источник
5
@andres Совершенно уверен, что это сделано специально - вы не хотите, чтобы пользователи просматривали вашу почту на производственных серверах, это предназначено только для локальной разработки.
mpowered
1
@mpowered А что, если я ДЕЙСТВИТЕЛЬНО хочу, чтобы пользователи могли просматривать / изменять письма, которые они собираются отправить? (Пример: менеджер отклоняет заявку пользователя, и отправляется электронное письмо с предупреждением заявителю)
Сирил Дюшон-Дорис
2
@CyrilDD Тебе пришлось бы построить что-то подобное самому, я не думаю, что это был бы инструмент для этой работы.
benjaminjosephw
1
Предварительный просмотр доступен в localhost: 3000 / rails / mailers / notifier / welcome , а их список - в localhost: 3000 / rails / mailers .
zires 07
8
Если вы используете Rspec, ваши превью войдутspec/mailers/previews
Дрю Стивенс
73

Ответ Даниэля - хорошее начало, но если ваши шаблоны писем содержат какие-либо динамические данные, это не сработает. Например, предположим, что ваша электронная почта - это квитанция о заказе, и вы распечатываете ее @order.total_price- при использовании предыдущего метода @orderпеременная будет равна нулю.

Вот небольшой рецепт, который я использую:

Во-первых, поскольку эта функция предварительного просмотра электронной почты определенно предназначена только для внутреннего использования, я настроил несколько общих маршрутов в пространстве имен администратора:

#routes.rb

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

Далее я создаю контроллер. В этом контроллере я создаю один метод для каждого шаблона электронной почты. Поскольку большинство электронных писем содержат динамические данные, нам необходимо заполнить любые переменные-члены, которые ожидает шаблон.

Это можно сделать с помощью фикстур, но я обычно предпочитаю просто получать некоторые псевдослучайные реальные данные. Помните - это НЕ модульный тест - это просто помощь в разработке. Необязательно давать один и тот же результат каждый раз - на самом деле, наверное, лучше, если это не так!

#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

Обратите внимание, что при рендеринге шаблона мы используем layout=>:mailer. Это встраивает тело вашего электронного письма в созданный вами HTML-макет электронной почты, а не в типичный макет веб-приложения (например application.html.erb).

И это почти все. Теперь я могу посетить http://example.com/admin/mailer/preview_welcome, чтобы просмотреть изменения в моем шаблоне приветственного письма.

cailinanne
источник
Фактически, это был именно тот подход, который я использовал и просто закодировал, когда начал читать ваш ответ - спасибо :)
Питер Никси
Отличный ответ! Именно то, что мне нужно!
Kulgar
Вот и вкусный рецепт! Спасибо за отличный ответ!
Роб Купер
Это отличный ответ! Спасибо!
OzBandit 05
5
Маршрут должен быть get 'mailer...теперь вместо match.
Патрик Беркли
18

37Signals также имеет свой собственный гем тестирования почты под названием mail_view . Это просто фантастика.

Марк
источник
Нет проблем. Каким способом вы в конечном итоге воспользовались?
Марк
Bac, когда я опубликовал это, я решил проблему с настраиваемым контроллером, который я написал сам, но скоро собираюсь использовать его снова, поэтому буду экспериментировать с этим
Питер Никси
16

Самая простая установка, которую я видел, - это MailCatcher . Установка заняла 2 минуты, и для новых почтовых программ работает из коробки.

гален
источник
Это действительно здорово. Установка очень быстрая и работает для всех почтовых программ! Отличный совет!
ответ
5

Недавно я написал гем под названием Maily для предварительного просмотра, редактирования (файла шаблона) и доставки электронных писем приложения через браузер. Он также обеспечивает удобный способ подключения данных, гибкую систему авторизации и минималистичный пользовательский интерфейс.

Я планировал добавить новые функции в ближайшем будущем, например:

  • Несколько хуков на электронную почту
  • Параметризация писем через пользовательский интерфейс (аргументы метода рассылки)
  • Играйте с клавишами перевода (список, выделение, ...)

Надеюсь, это поможет тебе.

рынки
источник
4

Вы можете использовать предварительный просмотр электронной почты Rails

Скриншот rails-email-preview

REP является рельсам двигатель предварительного просмотра и отправки тестового сообщения электронной почты, с поддержкой I18n, легкой интеграции premailer и факультативных CMS редактирования с comfortable_mexican_sofa .

glebm
источник
Есть ли примеры того, как на самом деле выполнить интеграцию между REP и CMS?
danieldekay 05
Я не знаю никаких демонстрационных приложений, но в вики
glebm
4

railsгенерирует предварительный просмотр почты, если вы используете rails g mailer CustomMailer. Вы получите файл CustomMailerPreviewвнутри spec/mailers/previewsпапки.

Здесь вы можете написать свой метод, который будет вызывать почтовую программу и генерировать предварительный просмотр.

Для бывшего -

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

Предварительный просмотр всех писем на http: // localhost: 3000 / rails / mailers / custom_mailer

свопы
источник
Для моего приложения с rspec я добавил config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Мауро
3

Rails Email Preview помогает нам быстро просматривать электронную почту в веб-браузере в режиме разработки.

1) Добавить “gem ‘rails_email_preview’, ‘~> 0.2.29’ “в гем-файл и установить пакет.

2) Запустите “rails g rails_email_preview:install”это создает инициализатор в папке конфигурации и добавляет маршруты.

3) Запустите “rails g rails_email_preview:update_previews”эту папку crates mailer_previews в каталоге приложения.

Генератор добавит заглушку к каждому из ваших писем, а затем заполнит заглушку фиктивными данными.

Пример:

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) Параметры в поисковом запросе будут доступны как переменная экземпляра для класса предварительного просмотра. Пример: если у нас есть URL-адрес, подобный “/emails/user_mailer_preview-welcome?user_id=1” @user_idопределенному в методе приветствия, UserMailerPreviewон помогает нам отправлять почту конкретному пользователю.

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

5) Чтобы получить доступ к URL-адресу REP, подобному этому

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

6) Мы можем отправлять электронные письма через REP, это будет использовать настройки почтовой программы среды. Раскомментируйте эту строку в инициализаторе, чтобы отключить отправку почты в тестовой среде.

config.enable_send_email = false

Источник: Блог RailsCarma : предварительный просмотр писем в приложениях Rails с помощью Mail_View Gem

Carma Tec
источник
3

Я удивлен, что никто не упомянул letter_opener . Это драгоценный камень, который будет отображать и открывать электронные письма как страницу браузера всякий раз, когда электронное письмо доставляется в dev.

KurtPreston
источник
1
letter_opener - классная жемчужина, и она просто необходима. Но иногда почта начинается со специальных событий, которые вы не хотите воспроизводить, чтобы просто проверить html / css письма.
Mauro
2

Невозможно предварительно просмотреть его прямо из почтовой программы. Но как вы писали, вы можете написать контроллер, который выглядит примерно так.

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

Но я думаю, что это не лучший способ проверять письма, если они правильно выглядят.

Даниэль Спангенберг
источник
3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'вставит тело письма в HTML-макет электронного письма, созданный для вашего приложения.
Декстер
Спасибо за это - я не хочу дважды проверять совместимость браузера, я бы рассмотрел это отдельно, я просто хочу быстро рассказать об этом и посмотреть, как это выглядит - я думаю, что ваш подход подходит для этого
Питер Никси
1

Я предпочитаю gem mails_viewer . Этот драгоценный камень весьма полезен, поскольку он сохраняет шаблон HTML в папке tmp.

Trung Lê
источник