概要
Action Mailerを使ってメールの送信機能をつくります
今回は管理者がユーザーからのお問い合わせに対して、管理者画面から返事をすると、
ユーザーにメールで送信される機能を実装していきます。
学習メモとして記録
参考
(1)RAILS GUIDES: Action Mailer の基礎
(2)【Ruby on Rails】メール送信の実装手順(ActionMailer)とはまったエラーなど
(3)Railsでメール自動配信機能をつくるまでの道程
(4)Rails の ActionMailer でメール送信処理
(5)RailsのAction Mailerでメール送信
Action Mailerとは
Ruby on Rails に組み込まれているメール送信機能のこと。
Action Mailer を使うと、Ruby on Rails からメールを送信してくれます
・メールマガジンの一斉送信
・ウェブサイトに会員登録した時のthank youメール
・お問い合わせフォームの記入内容が管理者にメールでも送信される
のような時にアプリケーションからメールを送信する機能と解釈してます。
アプリケーションのメーラークラスやビューからメールを送信することができる便利な機能です!
導入手順
1. メイラーを生成
railsコマンド(rails generate
)で生成します。 ContactMailer は任意クラス名。
今回はお問い合わせ関係のメール送信機能を作成したいためContactMailerです。
$ rails generate mailer ContactMailer
↓
Running via Spring preloader in process 1893
create app/mailers/contact_mailer.rb
invoke erb
create app/views/contact_mailer
invoke rspec
create spec/mailers/contact_mailer_spec.rb
create spec/mailers/previews/contact_mailer_preview.rb
無事に生成されましたね
2. サーバーを設定
メールを送信するときは、送信するサーバーが必要。と言うことで、
config/environments/development.rb
にメール送信設定を記述します。
今回はg-mailを使う記載方法です。
Rails.application.configure do
#--- 中略 ---#
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
port: 587,
address: 'smtp.gmail.com',
domain: 'gmail.com',
user_name: '<YOUR EMAIL ADDRESS>',
password: '<YOUR EMAIL PASSWORD>',
authentication: 'login',
enable_starttls_auto: true
}
end
port:
も上記の数のままで大丈夫です。
上から順々に見ていきます。
ここでは、config.action_mailer
というパラメーターに色んなオプションを指定してます。
1行目 raise_delivery_errors
メールの送信に失敗した時にエラーを出すかどうか (出したいので true)
2行目 delivery_method
メールの送信方法。 デフォルトで :smtd
なので気にする必要もないのですが、
わたしみたいに「なにそれ!?」ってなった方は以下の引用を読んでみてください。
「SMTP」とは「Simple Mail Transfer Protocol(シンプル・メール・トランスファー・プロトコル)」の略で、あえて>訳せば「簡単なメールの送信の手順」というところだろうか。お約束ごとと考えてもいい。
あなたがメールを書き、宛先のアドレスを入力して「送信」アイコンをクリックする。このとき、あなたのスマホやパソコン>は、この「SMTP」のお約束ごとに従って、あなたが契約しているメールサーバーと、こんなやり取りをするのである。
「メールを送るよ〜」「ええで!」「宛先は〇◯だよ」「りょ」「本文はかくかくしかじかだよ」「受け取ったで!」――とまぁそんな具合。
出典: メール設定で最初につまずく「SMTP」「POP」「IMAP」。その意味&設定方法は?
3行目 smtp_settings
smtpの詳細設定って感じです。
- port => SMTPサーバーのポート番号
- address => SMTPサーバーのホスト名
- domain => HELOドメイン
- user_name => メール送信に使用するgmailのアカウント
- password => メール送信に使用するgmailのパスワード
- authentication => 認証方法
- enable_starttls_auto => メールの送信にTLS認証を使用するか
3. メーラーを編集
メーラーってRailsのコントローラーと似てるんですね。
「アクション」と呼ばれるメソッドがあり、メールの内容をつくるのにビューを使います。
生成直後は、以下のような application_mailer.rb と
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end
空のメーラー
class ContactMailer < ApplicationMailer
end
があるはずです。
application_mailer
には全メーラー共通の設定を、
sample_mailer
にはメーラー個別の設定をします。
application_mailerを編集します
class ApplicationMailer < ActionMailer::Base
default from: "管理人 <from@example.com>",
layout 'mailer'
end
共通の処理・設定を記述する場合にはdefaultメソッド
を使用します。
プロパティ | 役割 |
---|---|
to | 送信先の指定 |
cc | 一斉送信先の指定 |
bcc | 非表示送信先の指定 |
from | メールの送信元名 |
subject | メールタイトル |
date | メールの送信日時 |
reply_to | 返信用アドレスの指定 |
などが指定できます。
contact_mailer.rb を編集します
今回は管理者の返信がユーザーのe-mailに届くようにします。
なのでメソッドをsend_when_admin_reply
と定義しました。
class ContactMailer < ApplicationMailer
def send_when_admin_reply(user, contact) #メソッドに対して引数を設定
@user = user #ユーザー情報
@answer = contact.reply_text #返信内容
mail to: user.email, subject: '【サイト名】 お問い合わせありがとうございます'
end
end
個別の設定にはmailメソッド
を使用します。
send_when_replyedメソッド
を呼び出す時に渡されるユーザーの情報から、
emailアドレスだけを取り出してメールの送信先としてします。
mailメソッド
が呼び出されると、メール本文が記載されているビューが読み込まれます。
インスタンス変数(@xxx)でメーラービューに値を渡してあげたいので、インスタンス変数を用意してる感じです。
次は、そのメールの本文を作成していきます
4. メールの本文を作成する(メーラービューの作成)
app/views/contact_mailerディレクトリ
下にファイルを2つ作成します。
1つはHTMLフォーマット、もう一つはテキストメール。
顧客によってはHTMLフォーマットのメールを受け取ることができない / 受け取りたくない人もいるので、テキストメールも作成しておくのが最善です。
HTMLファイルの作成
<h2><%= @user.name %> 様</h2>
<p>この度は、お問い合わせありがとうございました。<br>
以下でご質問の回答となっておりますでしょうか。</p>
<p><%= @answer %></p>
<p>今後とも XXX をよろしくお願いいたします。</p>
テキストファイルの作成
===============================
<%= @user.name %> 様
===============================
この度は、お問い合わせありがとうございました。
以下でご質問の回答となっておりますでしょうか。
<%= @answer %>
今後とも XXX をよろしくお願いいたします。
5. 実際に処理を走らせるアクションにメール送信処理をさせる
メールの設定を記述しただけではメールは送信できません。
メーラー(ここではapplication_mailer.rb
/ contact_mailer.rb
)は各コントローラーのアクションからの呼び出しによって起動します。
管理者がアプリケーション管理画面フォームより返信を送信し、その内容をメールでユーザーに送信します。
実際に処理を走らせるアクションはadmin/contacts_controller.rb
となります。
class Admin::ContactsController < Admin::ApplicationController
def update
contact = Contact.find(params[:id]) #contact_mailer.rbの引数を指定
contact.update(contact_params)
user = contact.user
ContactMailer.send_when_admin_reply(user, contact).deliver
end
end
例えば、ユーザーが新規アカウント登録をしてメールを送信する場合は、
class UsersController < ApplicationController
before_action :set_user
def create
if @user.save #ユーザーのインスタンスが新しく生成されて保存されたら
NotificationMailer.send_when_signup(@user).deliver #確認メールを送信
redirect_to @user
else
render 'new'
end
end
end
createアクションに処理を走らせることになります。
わたしのアプリケーションでは、DBの設計上
ユーザーが問い合わせをした時点で、Contactsテーブルの中に、
1つレコードが準備されていて、その中に'返信'というカラムが用意されています。
なので、updateアクションを使って
すでにあるレコードの中に管理者の返信のデータだけを更新してあげる形になります
6. テストしてみる
以上でメーラーができるはずです・・!
実際にアプリケーションを動かしてみて、メールを受信できたら成功
以上、学習メモでした