LoginSignup
4
7

More than 5 years have passed since last update.

[Rails]Action Mailerで送信するメールをプレビュー表示し、確認してから送信する方法

Last updated at Posted at 2017-05-28

はじめに

Action Mailerを使っている方は多々いると思いますが、
送信前にどのようなメールが送信されるか確認してメール送信したい時はありませんか?

例えば、Viewのフォームから入力された値をメール本文に入れてメールを送信するという場合、
送信者は合っているのか?本当にタイプミスは無いか?等です。

先日、上記機能を実装しようとしてググったらletter_openerでのプレビュー関連の情報しか出てこなくて、
「いやいや、productionでみたいんだよ!確認してから送信したいんだよ!」とイラッとしたので、
送信するメールの内容を確認してから送信する方法を簡単に記載します。

前提

Action Mailerを触ったことあることを前提として記載します。
ざっくりとした流れをメインにしますので細かいところは他で調べてください!

Rails 4.2.6
Ruby 2.3.1

やりたいこと

1.Viewのフォームで入力された値を取得
2.Action Mailerに渡して、メール作成
3.プレビュー表示
4.メールを送信

Let"s try!!

1.Viewのフォームで入力された値をcontrollerで受け取り、Maileのインスタンスを生成

フォームのPOST先アクション

customer_mail_controller.rb
def preview_information_mail
  subject = params[:subject] #フォームで入力された値の取得 
  mail_to = params[:mail_to] #フォームで入力された値の取得
  name = params[:name]
  message = params[:message] #フォームで入力された値の取得
  @mail = UserMailer.information_mail(subject, mail_to, name, message)
end

Action Mailerのメール送信アクション

user_mailer.rb
def information_mail(subject, mail_to, name, message)
  @name = name  
  @message = message
  mail to: mail_to, subject: subject
end

information_mailのメールテンプレート

information_mail.text.erb

<%= @name %> 様

いつもお世話になっております。

Hogehogeです。

<%= @message %>

よろしくお願いします。

2.作成したメールインスタンスを使ってプレビュー画面を作成

作成したメールは、@mailインスタンスに入れました。
値は以下のように参照できますので、確認画面を好きなように編集してください。
(ちなみに私はJSで非同期でプレビューを表示するようにしました。)

@mail.subject メールのサブジェクト
@mail.message.body.raw_source メールの本文

なお、そのまま表示すると、改行が反映されないと思います。
その場合は、simple_format(@mail.message.body.raw_source)のようにしてあげると、
見やすく表示されます。

上記の他にも、様々なメールの情報が参照可能です。
Action Mailerは内部で以下のmail gemを使っているらしいので、
もし、本文以外の他の情報を参照したい場合はgemの参照してください。
https://github.com/mikel/mail/tree/master/lib/mail

3.メールの送信

メール送信のアクションに対して、POSTしてメールを送信します。
以下のアクションは、previewの時と同じパラメーター名で値を(hidden等で)送った場合の例です。

previewとsendのアクションは共通しているところが多いので、
実装するときはほぼ共通化(DRYに)できます。

メール送信のPOST先アクション

mail_send_controller.rb
def send_information_mail
  subject = params[:subject] #フォームで入力された値の取得 
  mail_to = params[:mail_to] #フォームで入力された値の取得
  name = params[:name]
  message = params[:message] #フォームで入力された値の取得
  @mail = UserMailer.information_mail(subject, mail_to, name, message)
  @mail.deliver_now!
end

参考にしたサイト

Action Mailerのdelivery_methodに独自の配信方法を追加する
 http://qiita.com/sheepland/items/0bbf5c6f9fba08caf0a6

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7