14
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

ブログからの転載

プログラムができる人は誰でもやっていると思うけど、自分のメールアドレス(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 行目あたりを適宜読み替える

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 を作る

Gemfile
source 'https://rubygems.org'

gem 'mail'

ライブラリインストール

コマンドラインで実行

bundle install

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

ruby mail.rb

cron に設定する

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

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

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

考察

  • 本文をテキストで作っておいて、起動時に適宜読みこむようにすれば数年分はいける
  • 本文をある程度自動生成すれば半永久的にいけるかもしれない
  • ruby-gmail って gem があったみたい!気づかなかった!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
14
Help us understand the problem. What are the problem?