Edited at

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

More than 1 year has passed since last update.


はじめに

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