Ruby を使って Gmail 経由でメール送信

2020/04/18

プログラムができる人は誰でもやっていると思うけど、自分のメールアドレス(Gmail)を使い、定刻にメールを送ることで、時間にルーズで約束もよく忘れる俺でもマメな男を演出できる

自分の誕生日に設定しておけば、誕生日に誰からもメールがこないなんて寂しい夜はなくなる!

Google アカウントを 2 段階認証にして、セキュリティも上げて一石三鳥!ヤッタネ!

環境

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

Google アカウント側の設定

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

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

  • アカウント設定画面 に遷移する

  • 「パスワードとログイン方法」セクションにある、[2 段階認証プロセス] をクリックする

  • [開始]をクリックする

  • パスワードを聞かれたら入力して [ログイン] をクリック

  • 使用する電話番号とコードの取得方法を確認後、[試す] をクリック

  • SMS が届くので、記載されたコードを入力後 [次へ] をクリック

  • 確認を促されるので [オンにする] をクリックする

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

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

前項の続きから始める

  • 2 段階認証プロセス画面から、[2 つ目の手順を追加で設定] をクリックする

  • 認証システムアプリの [設定] をクリックする

  • 選択して [次へ] をクリック

  • QR コードが表示されるので、認証システムアプリに登録する

  • 認証システムアプリに表示されるコードを入力して [確認] をクリックする

  • [完了] をクリック

  • 認証システムアプリがデフォルトになったことが確認できる

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

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

  • アカウント設定画面 に遷移する

  • 「パスワードとログイン方法」セクションにある、[アプリパスワード] をクリックする

  • [端末を設定] をクリックする

  • [その他(名前を入力)] を選択する

  • 名前を入力して [生成] をクリックする

    ※再度パスワードを求められたらログインして続ける

  • 16 桁のパスワードが表示されるので控えておく

プログラム

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

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

# -*- 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 <<EOS
#{mail_body}
EOS

end

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

テストと実行

Gemfile を作る

source 'https://rubygems.org'

gem 'mail'

ライブラリインストール

コマンドラインで実行

bundle install

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

ruby mail.rb

cron に設定する

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

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

0 0 10 12 * /home/miyamiya/.rbenv/shims/ruby /home/miyamiya/bin/happy_birthday_to_me.rb

考察

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