Gmailを利用したアカウント認証

## 環境

* ruby 2.3.0p0
* CentOS Linux release 7.2.1511
* Google アカウント(2 段階認証にする)


## Google アカウント側の設定

2 段階認証を設定していない時は設定しましょう

### 2 段階認証プロセスを有効にする(SMS での認証)

* [アカウント設定画面](https://myaccount.google.com/security?utm_source=OGB) に遷移する

* 「パスワードとログイン方法」セクションにある、[2 段階認証プロセス] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail01-300x190.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail01.png)

* [開始]をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail02-300x294.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail02.png)

* パスワードを聞かれたら入力して [ログイン] をクリック
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail03-234x300.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail03.png)

* 使用する電話番号とコードの取得方法を確認後、[試す] をクリック
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail04-300x300.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail04.png)

* SMS が届くので、記載されたコードを入力後 [次へ] をクリック
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail05-300x252.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail05.png)

* 確認を促されるので [オンにする] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail06-300x217.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail06.png)

### PIN コードでの認証を追加する

スマホに Authy を入れていて、それで多要素認証を管理しているので、Google アカウントも同様に設定することにする(やらなくてもいい)

前項の続きから始める

* 2 段階認証プロセス画面から、[2 つ目の手順を追加で設定] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail07-300x223.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail07.png)

* 認証システムアプリの [設定] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail08-300x300.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail08.png)

* 選択して [次へ] をクリック
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail09-286x300.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail09.png)

* QR コードが表示されるので、認証システムアプリに登録する
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail10-254x300.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail10.png)

* 認証システムアプリに表示されるコードを入力して [確認] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail11-300x263.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail11.png)

* [完了] をクリック
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail12-300x225.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail12.png)

* 認証システムアプリがデフォルトになったことが確認できる
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail13-300x288.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail13.png)

## アプリケーションパスワードの取得

今回作るアプリケーション用のパスワードを取得する

* [アカウント設定画面](https://myaccount.google.com/security?utm_source=OGB) に遷移する

* 「パスワードとログイン方法」セクションにある、[アプリパスワード] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail14-300x258.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail14.png)

* [端末を設定] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail15-300x155.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail15.png)

* [その他(名前を入力)] を選択する
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail16-300x213.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail16.png)

* 名前を入力して [生成] をクリックする
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail17-300x154.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail17.png)
  **※再度パスワードを求められたらログインして続ける**

* 16 桁のパスワードが表示されるので控えておく  
  [![](http://1bed.allright.life/wp-content/uploads/2016/04/mail20-300x220.png)](http://1bed.allright.life/wp-content/uploads/2016/04/mail20.png)


## プログラム

ここでハマったのは、パスワードに利用するのが前項で取得した「アプリケーションパスワード」を利用するというところ

4 行目～ 7 行目, 9 行目あたりを適宜読み替える

```ruby:mail.rb
# -*- coding: utf-8 -*-
require 'mail'

mail_from   = '自分の Gmail アドレス'
mail_passwd = '取得した16桁のアプリケーションパスワード'
mail_to     = '送信先メールアドレス'
mail_subject= 'メールタイトル'
mail_body   = <<EOS
メール本文
EOS

Mail.defaults do
  delivery_method :smtp, {
    :address => 'smtp.gmail.com',
    :port => 587,
    :domain => 'example.com',
    :user_name => "#{mail_from}",
    :password => "#{mail_passwd}",
    :authentication => :login,
    :enable_starttls_auto => true
  }
end

m = Mail.new do
  from "#{mail_from}"
  to "#{mail_to}"
  subject "#{mail_subject}"
  body &lt;&lt;EOS
#{mail_body}
EOS

end

m.charset = "UTF-8"
m.content_transfer_encoding = "8bit"
m.deliver
``` 

## テストと実行

### Gemfile を作る

```ruby:Gemfile
source 'https://rubygems.org'

gem 'mail'
```

### ライブラリインストール

コマンドラインで実行

```bash
bundle install
```

### コマンドラインから実行して動作確認をする

```bash
ruby mail.rb
```

### cron に設定する

あとは```crontab -e```と叩いて cron の設定を行う

俺だと rbenv で Ruby 入れてるのでこんな感じ(ホームディレクトリ以下はてきとー)

```bash:毎年12月10日にメールを送る例
0 0 10 12 * /home/miyamiya/.rbenv/shims/ruby /home/miyamiya/bin/happy_birthday_to_me.rb
```

## 考察

* 本文をテキストで作っておいて、起動時に適宜読みこむようにすれば数年分はいける
* 本文をある程度自動生成すれば半永久的にいけるかもしれない
* ruby-gmail って gem があったみたい！気づかなかった！