6
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【2019年度版】RailsのAction Mailerで会員登録時にメール送信する【heroku使うよ】

Last updated at Posted at 2019-06-10

仕事でホームページを作っているのですが、ユーザさんが会員登録した瞬間に登録完了の通知メールが来たら嬉しいなと思ったので、RailsのAction Mailerを使って作ってみました。

実はちょうど一年前くらいに別のアプリケーションを作った際Action Mailerは使ったので、今回は復習の意味も含めて触ってみました。思ったより難しくないので安心してください笑。

#Action Mailerとは
アプリケーションのMailerクラスやビューでメールの送受信を行えるやつです。動作はコントローラと似てます。

#Action Mailer使うのに適してる人
ユーザさんがSign upボタンをポチッと押した(会員登録された)瞬間、指定したアドレスから会員登録完了メールを送信する機能を作りたい人

#メールが送信されるまでの基本的な流れ
ユーザさんがSignupボタンを押した瞬間に、フォームに入力されたメアドをcreateアクションを通してmailerで処理し、指定した送信元メアドからユーザさんのメアドに送信する(長文)

#Action Mailerを利用する設定
今回使うのはGmailを想定しているので、Gmail用の設定を書きます。

config/environments/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 => "送信元メールアドレス",
    :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クラスを編集

app/mailers/user_notifier_mailer.rb
class UserNotifierMailer < ApplicationMailer
    default :from => "***@gmail.com(送信元アドレス)"

    def send_signup_email
        @greeting = "Hi"
        mail( :to => "***@gmail.com(実験用の受信元アドレス)", :subject => "会員登録が完了しました。" )
    end
end

default :fromは送信元アドレスを指定してください。あとでherokuの環境変数に指定し直します。

#メール用ビューを編集

app/views/user_notifier_mailer/send_signup_email.text.erb
<%= 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/environments/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/environments/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アクションで取ってきたユーザさんのパラメータを使って、送信先メールアドレスを指定します。こんな感じ。

app/mailers/user_notifier_mailer.rb
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は完成です。

#メール用ビューを完成

app/views/user_notifier_mailer/send_signup_email.text.erb
<%= @user.name %> 様

ホームページの会員登録が完了しました。
こちらから <%= @url %> ホームページへ行くことができます。

メールからホームページに直でいけるように@urlを指定しました。

#createアクションに定義
createアクションが走ったときにメール送信が行われるよう処理を書きます。

app/controllers/users_controller.rb
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してみてください。ちゃんとメールが送信されてるはず。

お疲れ様でした!

6
11
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
6
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?