仕事でホームページを作っているのですが、ユーザさんが会員登録した瞬間に登録完了の通知メールが来たら嬉しいなと思ったので、RailsのAction Mailerを使って作ってみました。
実はちょうど一年前くらいに別のアプリケーションを作った際Action Mailerは使ったので、今回は復習の意味も含めて触ってみました。思ったより難しくないので安心してください笑。
#Action Mailerとは
アプリケーションのMailerクラスやビューでメールの送受信を行えるやつです。動作はコントローラと似てます。
#Action Mailer使うのに適してる人
ユーザさんがSign upボタンをポチッと押した(会員登録された)瞬間、指定したアドレスから会員登録完了メールを送信する機能を作りたい人
#メールが送信されるまでの基本的な流れ
ユーザさんがSignupボタンを押した瞬間に、フォームに入力されたメアドをcreateアクションを通してmailerで処理し、指定した送信元メアドからユーザさんのメアドに送信する(長文)
#Action Mailerを利用する設定
今回使うのはGmailを想定しているので、Gmail用の設定を書きます。
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'gmail.com',
:user_name => "送信元メールアドレス",
:password => "アプリパスワード",
:authentication => :plain,
:enable_starttls_auto => true
}
:user_nameは送信元メールアドレスを指定してください。
ここで一つ注意なのが、:passwordです。Gmailに2段階認証を設定した上でアプリパスワードという16桁のパスワードを発行してそれを設定しないといけません。
設定し終わったら次に進みます。
#Mailerクラス作成
$rails g mailer UserNotifier
create app/mailers/user_notifier_mailer.rb
invoke erb
create app/views/user_notifier_mailer
invoke test_unit
create test/mailers/user_notifier_mailer_test.rb
create test/mailers/previews/user_notifier_mailer_preview.rb
#Mailerクラスを編集
class UserNotifierMailer < ApplicationMailer
default :from => "***@gmail.com(送信元アドレス)"
def send_signup_email
@greeting = "Hi"
mail( :to => "***@gmail.com(実験用の受信元アドレス)", :subject => "会員登録が完了しました。" )
end
end
default :fromは送信元アドレスを指定してください。あとでherokuの環境変数に指定し直します。
#メール用ビューを編集
<%= greeting %>
これで送信できるようになりました。コンソールを開いて試してみましょう。
$rails c
irb(main):003:0> UserNotifierMailer.send_signup_email.deliver
これで Hi と表示されていれば成功です。From:送信元アドレスとTo:実験用受信アドレスも表示されていると思います。Gmailも確認してもらえれば、実際に送られてるはず。
#本番用の設定
送信できるかの実験は終わったので、いよいよSignupボタンを押した瞬間にメール送信する設定にいきたいと思います。
#herokuに環境変数を設定
先ほどdevelopment.rbに送信用アドレスとアプリパスワードをベタ書きしましたが、セキュリティ的にやばいので環境変数の設定をします。
heroku >> settings >> Config VarsのReveal Config Varsを展開すると環境変数を入力できるフォームがあるので、KEY:VALUE形式で設定します。KEYはわかりやすい名前で大丈夫です。
PASSWORD:アプリパスワード16桁的な。設定したらdevelopment.rbも変更します。
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'gmail.com',
:user_name => ENV['USER_NAME'],
:password => ENV['PASSWORD'],
:authentication => :plain,
:enable_starttls_auto => true
}
production.rbも同様に。
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'gmail.com',
:user_name => ENV['USER_NAME'],
:password => ENV['PASSWORD'],
:authentication => :plain,
:enable_starttls_auto => true
}
Mailerのdefault: fromも環境変数に置き換えます。
これで環境変数の設定は終わりです。ターミナルで確かめましょう。
$heroku config
環境変数が指定されていればオッケーです。
#Mailerに引数を指定
createアクションで取ってきたユーザさんのパラメータを使って、送信先メールアドレスを指定します。こんな感じ。
class UserNotifierMailer < ApplicationMailer
default :from => ENV['USER_NAME']
def send_signup_email(user)
@user = user
@url = "ホームページのurl"
mail( :to => @user.email, :subject => "会員登録が完了しました。" )
end
end
これでMailerは完成です。
#メール用ビューを完成
<%= @user.name %> 様
ホームページの会員登録が完了しました。
こちらから <%= @url %> ホームページへ行くことができます。
メールからホームページに直でいけるように@urlを指定しました。
#createアクションに定義
createアクションが走ったときにメール送信が行われるよう処理を書きます。
def create
@user = User.new(user_params)
if @user.save
log_in @user
UserNotifierMailer.send_signup_email(@user).deliver
redirect_to @user
else
render "new"
end
end
これで全ての実装が終わりました。pushしてアプリケーションからsignupしてみてください。ちゃんとメールが送信されてるはず。
お疲れ様でした!