ActionMailerでメールを送る

ActionMailerの基本的な使い方を確認したので、忘備録としてまとめておこうと思います。

メール送信の際に`Username and Password not accepted. Learn more at`というエラーが出る方の参考になるかもしれません。私はここで詰まりました、、、

# mailerとは直接関係しない部分（下準備）
mailerとは直接関係しませんが、今回はユーザー登録をした際にメールを送るようにしたいので、ユーザーを作成しました。本当にメーラーの挙動を確認するために最小限なので、バリデーションなども設定していません。

## ユーザーモデルを作成
```
rails g model User name:string email:string
```
## ユーザーコントローラーを作成
users_controller.rbの中に'UserMailer.welcome_email(@user).deliver'という記述がありますが、これが今回の本題です。後にこのクラスとクラスメソッドを定義していきます。
```
rails g controller users new show create
```

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def show
    @user = User.find(params[:id])
  end

  def create
    @user = User.create(user_params)
    
    if @user.save
      UserMailer.welcome_email(@user).deliver
      redirect_to @user
    else
      render :new
    end
  end

  private
  def user_params
   params.require(:user).permit(:name, :email)
  end
end
```

## viewファイルを作成
以下のviewファイルを作成します。
* new.html.haml
* show.html.haml
showについては、登録完了後にrender先として使用しているだけなので、別のところに飛ばすのであればなくてもいいです。
## 登録画面を作成
```new.html.haml
%h1 create account

= form_with model: @user, method: :post, local: true do |f|
  = f.label :name, :name
  = f.text_field :name
  = f.label :email, :email
  = f.email_field :email
  = f.submit '作成'
```

# ここから本題
さて、ここからいよいよ本題です。今回はメールをgmailを使用して送信しています。

ユーザーメーラの大きな流れは、以下の通りです。
* __メーラー作成__
* __メーラークラスとメソッド作成__
* __メール内容を決定__
* __メール設定__
 
## メーラーを作成
まずは、以下のコードでメーラーを作成します。
```
rails g mailer User
      create  app/mailers/user_mailer.rb
      invoke  erb
      create  app/views/user_mailer
      invoke  test_unit
      create  test/mailers/user_mailer_test.rb
      create  test/mailers/previews/user_mailer_preview.rb
```
色々作成されますが、送る上で重要なのは以下の２つです。
今回はこの２つの設定をしていきます。

* app/mailers/user_mailer.rb
* app/views/user_mailer

## メーラークラスとクラスメソッドを作成
今回はuser_mailerの方を使用します。
application_mailerは放置でいいです。これは全体で共通的に使用するものなので、その必要がある場合はapplication_mailerを使用します。

```app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def welcome_email(user)
    mail to: user.email, subject: "Welcome To Our Site!!"
  end
end
```

```app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end
```

## メールの内容を決定
デバイスによってはhtmlを読み込めない可能性があるため、メールの内容をviewファイルとtextファイルの二種類作成していきます。内容は好きに変えてみてください。

### html.haml
```app/views/user_mailer/welcome_email.html.haml
!!!
%html
  %head
    %meta{'http-equiv' => 'Content-Type', 'content' => 'text/html; charset=UTF-8'}
  %body
    %p 本サイトにユーザー登録いただきありがとうございます。
```
### text.haml
```app/views/user_mailer/welcome_email.text.haml
本サイトにユーザー登録いただきありがとうございます。
```

# メール設定

```config/environments/development.rb
.
.
.
  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:            ENV['GMAIL_ADDRESS'],
    password:             ENV['GMAIL_PASSWORD'],
    authentication:       'login',
    enable_starttls_auto: true
  }
end
```

# （補足）user_name&passwordは直書きするとエラーが出るので注意
今回、まずは挙動だけ確認したかったので、user_nameとpasswordを直書きして、さっくり終わらせようと思ったのですが送ろうとするとエラーが出ました...

セキュリティ的に環境変数を使用する必要があるようでした。
したがって今回はdot_envを使用しました。

```
gem 'dotenv-rails'
```

gemをインストールしたら、'.env'ファイルを作成して、そこに環境変数を書きます。
```.env
GMAIL_PASSWORD='your password'
GMAIL_ADDRESS='your email'
```

当然ですが、gitにこれをプッシュしたら意味がないので、gitignoreするのを忘れないようにしましょう。
```.gitignore
.
.
.
/.env
```

# （補足）googleのアドレスを使用する場合は要注意
googleアドレスのパスワードは通常のものは使用できません。前はできたみたいですが、セキュリティの要件が数年前に変更されたためアプリパスワードを使用する必要があります。

参考サイトを見てもらえれば分かりますが、2段階認証が必須なのでその点だけ注意してください。


次回は、ActionMailerとrake/task/wheneverを組み合わせて、定期的なメール配信を実現しようと思います。

【参考サイト】

https://qiita.com/tomokei5634/items/f8671a8f1414a8aec3ee

https://qiita.com/kobayashimakoto/items/c7a96ea9f6cbc8d2da77

https://qiita.com/m9795/items/c11fac07d957225fac0f