Action Mailer

## これまでの経緯

* RailsでWebアプリケーションを作ろう（マスタ画面）
 * Modalウィンドウでajaxのマスタ画面の実装 - OK
* 会員登録機能の作成
 * メールによるユーザの認証（仮登録機能) - ここ
 * メールに記載のURLで本登録(本登録機能)
 * 本登録後、ログイン（ユーザ認証機能)
 
## Action Mailer

まずは、メール送信について
Railsには**Action Mailer**という機能があり、それでメールを送信することができます。

### 生成

Mailerクラスを生成します。

```terminal:terminal
$ rails g mailer UserMailer
create  app/mailers/user_mailer.rb
create  app/mailers/application_mailer.rb
create  app/views/user_mailer
```
```
$ rails g mailer [Mailer名]
```
で作成します。
基底クラスの```application_mailer.rb```を継承している```[Mailer名].rb```
と本文を記載する```views/[Mailer名]```以下には、メール本文を定義します。

```ruby:user_mailer.rb
class UserMailer < ApplicationMailer
    default from: 'hogehoge@gmail.com'

    def test_email
        @user = params[:user]
        mail(to: 'fugafuga@gmail.com', subject: 'これはRails Application Mailerのテストです。')        
    end
end
```

この```test_mail```メソッドで```views/user_mailer/test_email.html.erb```もしくは、```test_email.text.erb```を本文としてメールを送信します。

```erb:test_email.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name %>さん、こんにちは！</h1>
    <p>これはAction Mailerのテストメールです。</p>
  </body>
</html>

```

```erb:test_email.text.erb
<%= @user.name %>さん、こんにちは！
これはAction Mailerのテストメールです。
```

メール送信します。上記のMailerのtest_emailを

```ruby:メール送信
UserMailer.with(user: @user).test_email.deliver_now
```

### 送信について

**with()**によって、paramsとしてMailerActionに渡すことができます。
**with(user: @user)**とすることで、**param[:user]**で参照することが可能となるわけです。

**deliver_now**と**deliver_later**の２種類のメール送信メソッドがあります。
**deliver_now**は、今すぐに送信したい場合に使用します。
**deliver_later**は、非同期で送信したい場合に使用します。

### html.erbとtext.erb

メールのヘッダー情報はデフォルトでmultipart/alternativeとなり、これに基づいて、HTMLメールとテキストメールが送信され、受信側の設定により、HTMLメールとテキストメールがよしなに展開されます。
しかし、当然「HTML」＋「テキスト」が同時に送信されるため、コンテンツによっては、サイズが肥大化することもあり、「テキストだけ送りたい」「HTMLだけ送りたい」という場合が出てくると思います。
それを制御するにはmailメソッドを以下のように記述します。

```ruby:HTMLメールとテキストメール指定し送信する方法
mail(to: 'hogehoge@gmail.com', subject: 'これはテストです。') do |format|
    format.text #テキストメールを指定
    format.html #HTMLメールを指定
end
```

### メールの設定 ~GMail編~

以上でメール送信はできるわけですが、メールサーバの情報がないとメールは送信できません。
(他の方も書いていらっしゃいますが)GMailのアカウントを使って、メールを送信してみます。
予め、アカウントは作成されている前提で```config/environments```以下の設定ファイルに設定します。
例では、developmentの設定ファイルに記載します。

```ruby:config/environments/development.rb
Rails.application.configure do
...(略)...
  ## メールの配信方法
  ## :smtp     -- config.action_mailer.smtp_settingsで設定可能
  ## :sendmail -- config.action_mailer.sendmail_settingsで設定可能
  ## :file:    -- メールをファイルとして保存する。config.action_mailer.file_settingsで設定可能
  ## :test:    -- メールを配列ActionMailer::Base.deliveriesに保存
  config.action_mailer.delivery_method = :smtp

  ## メール送信失敗時エラーとするかどうか
  config.action_mailer.raise_delivery_errors = true

  ## SMTPの設定
  config.action_mailer.smtp_settings = {
    ## SMTPサーバでSTARTTLSが有効かどうかを検出して有効にする
    :enable_starttls_auto => true,

    ## リモートメールサーバ
    :address => 'smtp.gmail.com',

    ## メールサーバのポート
    :port => '587',

    ## HELOドメイン
    :domain => 'smtp.gmail.com',

    ## メールサーバの認証が必要な場合の認証方法
    ## :plain    -- パスワードを平文で送信
    ## :login    -- パスワードをBase64でエンコード
    ## :cram_md5 -- チャレンジ/レスポンスによる情報交換と、MD5アルゴリズムによる重要情報のハッシュ化の組み合わせ
    :authentication => 'plain',

    ## メールサーバの認証に使用するユーザ名
    :user_name => '<GMailのユーザ名>',

    ## メールサーバの認証に使用するパスワード
    :password => '<GMailのパスワード>'
  }
end
```

最後にGoogleアカウントの設定を変更します。
※アカウントを脆弱にさせてしまうので、気をつけて設定してください。

Googleにログイン後、アカウント設定を開きます。

![スクリーンショット 2019-04-29 0.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75277/bc4a9977-f8ea-c257-c179-70e2cb09dc43.png)

アカウントのメニューの「セキュリティ」を選択します。

![スクリーンショット 2019-04-29 0.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75277/4b52bece-3b9e-96cc-289e-eeec468caf45.png)

「セキュリティ」メニューの下の方の「安全性の低いアプリのアクセス」の「アクセスを有効にする（非推奨）」を選択します。

![スクリーンショット 2019-04-29 0.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75277/1235f1f1-76c2-26f0-f3e5-00a5c2b3e71b.png)

「安全性の低いアプリのアクセス」の「安全性の低いアプリの許可：有効」にします。

![スクリーンショット 2019-04-29 0.19.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75277/0c25a365-ac5e-06c5-247b-4974c8d1ff5a.png)

## 最後に

これで、Railsでメールを送信することができました。
Action Mailerは直感的でわかりやすいなぁという印象です。
ほぼほぼ、Railsガイドを舐めれば、基本的なことはできそうです。

## 出典

[Action Mailer の基礎 - Rails ガイド](https://railsguides.jp/action_mailer_basics.html)