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

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

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

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


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


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


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

```ruby: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段階認証を設定した上で[アプリパスワード](https://support.google.com/mail/answer/185833?hl=ja)という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クラスを編集
``` ruby: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の環境変数に指定し直します。

#メール用ビューを編集
```ryby: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も変更します。

```ruby: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も同様に。

```ruby: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アクションで取ってきたユーザさんのパラメータを使って、送信先メールアドレスを指定します。こんな感じ。

```ruby: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は完成です。

#メール用ビューを完成

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

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

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


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

```ruby: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してみてください。ちゃんとメールが送信されてるはず。

お疲れ様でした！