［Ruby/Rails］メール送信機能の実装方法（Gmail）

# メール送信機能の実装方法
![スクリーンショット 2018-01-20 19.57.53.png](https://qiita-image-store.s3.amazonaws.com/0/199441/f1440fb4-0d1b-6355-a342-ca3f45809e39.png)


## 共有すること
Ruby/Railsによるメールを送信機能の実装方法
（今回は**Gmail**を利用します。）

### 開発環境
Ruby 2.4.1
Rails 5.1.4

### 前提条件
この記事で紹介している方法でメール送信機能を実装する場合は、下記の条件（1.〜3.）を満たしている必要があります。

#### 1. Googleのアカウントを作成していること
#### 2. ２段階認証を［有効］にしていること
#### 3. アプリパスワードを発行していること


上記2.および3.は下記アドレスより確認してください。

>Google > 「ログインとセキュリティ」 > 「Googleへのログイン」
>https://myaccount.google.com/security#signin

![スクリーンショット 2018-01-20 19.17.38.png](https://qiita-image-store.s3.amazonaws.com/0/199441/a045437c-7d72-1702-d8bd-f40cd6408548.png)

## Rubyでメール送信機能を実装する方法
### ポイント
`require "mails"` を利用

#### 補足

下記 **コード例** において

`YOUR_GMAIL_ADDRESS`には、**Gmailのアドレス**
`GOOGLE_APP_PASSWORD`には、**アプリパスワード**

をそれぞれ代入してください。

### コード例
```ruby:mail.rb
require "mail"

mail = Mail.new do
    from "sample@gmail.com" ##送信元メールアドレス
    to "sample+reciever@gmail.com" ##送信先メールアドレス
    subject "Sample Mail from Ruby on Rails" ##メール件名
    body "This is sample page." ##メール本文
end

mail.delivery_method :smtp, { address:   'smtp.gmail.com',
    port:      587,
    domain:    'gmail.com',
    user_name: YOUR_GMAIL_ADDRESS,
    password:  GOOGLE_APP_PASSWORD}

mail.deliver
```

#### 捕捉
Gmailでは`sample+reciever@gmail.com`のように、
`+`を利用することで複数の受信用アドレスを持つことが可能（**メールエイリアス機能**）。

## 実行結果
下記コマンドを入力して、コードを実行

```command:command
$ cd (directory having mail.rb)
$ ruby mail.rb
```

Gmailを開き、メールが送信できているか確認

![スクリーンショット 2018-01-20 19.48.06.png](https://qiita-image-store.s3.amazonaws.com/0/199441/8820a796-6ba7-6c9c-5ca1-88a9c330e858.png)

上記のように、メールが届いています。

## Railsでメール送信機能を実装する方法
### ポイント
Railsの１機能である`Mailer`を利用する

### 実装方法
ここでは、Railsアプリ`mailer`にメール送信機能を実装していく。

#### 1. scaffoldで、モデル・ビュー・コントローラを実装

```command:command
$ rails new mailer
$ cd mailer
$ rails g scaffold User name:string email:string
```
#### 2. コマンドで**UserMailer**を実装
```command:command
$ rails g mailer UserMailer send_mail
```

#### 3. **UserMailer**を編集
```ruby:app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer

  def send_mail(user)
    @user = user
    mail to: user.email, subject:"Sample from Rails"
  end
end
```

#### 4. **users_controller**を編集
ここでは、新しくユーザー情報が登録されたらメールを送信するようにする。

createアクションに`UserMailer.send_mail(@user).deliver_now`を追加

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController

#...省略...
  
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        
        ##追加したコード
        UserMailer.send_mail(@user).deliver_now

        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

#...省略...
end
```

#### 5. メール本文を作成
```command:command
mailer $ cd app/views/user_mailer
user_mailer cd touch send_mail.html.erb send_mail.txt.erb
```

```html+erb:app/views/user_mailer/send_mail.html.erb
<h1>Dear <%= @user.name %></h1>

<p>
  Thank you to join our app.
</p>
```

```text+erb:app/views/user_mailer/send_mail.txt.erb
Dear <%= @user.name %>
Thank you to join our app.
```


#### 6. **app/enviroments/development.rb** を編集
```ruby:development.rb
Rails.application.configure do

# ..省略..

  config.action_mailer.raise_delivery_errors = true
  #デフォルトではfalseになっている

  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
      port: 587,
      address: 'smtp.gmail.com',
      domain: 'smtp.gmail.com',
      user_name: YOUR_GMAIL_ADDRESS,
      password: GOOGLE_APP_PASSWORD,
      enable_starttls_auto: true
  }

# ..省略..
```

## 実行結果

#### 下記コマンドを入力して、プログラミングを実行

```command:command
$ cd mailer
$ rails s
```

#### 下記アドレスにアクセス
http://localhost:3000/users/new

#### Nameに名前を、Emailにメールアドレスを入力 & [Create User]をクリック
![スクリーンショット 2018-01-20 20.42.55.png](https://qiita-image-store.s3.amazonaws.com/0/199441/9a7502c0-3c92-f13b-2b55-4bfd850e7ca8.png)

#### Gmailを確認
下記のように、メールが届いていることがわかる。

![スクリーンショット 2018-01-20 20.50.27.png](https://qiita-image-store.s3.amazonaws.com/0/199441/df342df3-b5ed-4664-47c6-fd330a179c05.png)

## 参考資料
[Ruby on Rails チュートリアル 第11章](https://railstutorial.jp/chapters/account_activation?version=5.1#sec-account_activation_emails)