2019年3月27日水曜日

Ruby から Gmail を送信する方法

概要

Ruby から Gmail を使ってメール送信する方法を紹介します
認証時にポイントがあるのでそこ注意が必要です

環境

  • macOS 10.14.3
  • Ruby 2.5.1p57

アプリケーションパスワードを使って送信する

  • vim Gemfile
gem "gmail"
  • bundle install --path vendor
  • vim app.rb
require 'gmail'

gmail = Gmail.new('your-account@gmail.com', 'application_password')
ret = gmail.deliver do
  to "your-account@gmail.com"
  from "Your Name <your-account@gmail.com>"
  subject "subject"
  text_part do
    body "Hello"
  end
end
gmail.logout
  • bundle exec ruby app.rb

これだけで送信できます
ポイントは認証にアプリケーションパスワードを使う点です
アプリケーションパスワードは普通にログインする際のパスワードとは違い Ruby や自作のスクリプトなどから認証する際に発行する専用のパスワードです
このパスワードを使えば Ruby から Gmail に認証することができます

またアプリケーションパスワードは Google の二段階認証を有効にしていないと使えません
なのでまずは二段階認証を有効にするところから始めなければなりません

ちなみに普通に Google アカウントの ID/PW でログインしようとすると「重大なセキュリティ通知」というメール通知が届きます
「ログインをブロックしました」という旨のメールで結局ログインすることができません
が、Google アカウントの設定で「安全性の低いアプリからのアカウントへのアクセスを許可する」という設定がありこれを有効にすることで普通の ID/PW でログインすることができるようになります
が、これはアンセキュアな方法なのでおすすめできません

IFTTT 経由で送信する

他に IFTTT を使って Ruby から Gmail を送信する方法を紹介します
事前に IFTTT で webhook 経由で Gmail を送信するレシピを作成しておきます

また Gmail 側の設定で Webhook で送信される VALUE を以下のように設定しておきましょう

この VLAUE1VALUE2 を Ruby から設定して IFTTT に送ることでメール本文とタイトルを設定することができます

  • vim ifttt.rb
require 'net/http'
require 'json'

class IFTTT

  def initialize
    @url = "https://maker.ifttt.com/trigger/event_name/with/key/xxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx"
  end

  def call_maker(value1, value2)
    uri = URI.parse(@url)
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    req = Net::HTTP::Post.new(uri.request_uri)
    req["Content-Type"] = "application/json"
    maker_body = {
      "value1" => value1,
      "value2" => value2
    }
    payload = maker_body.to_json
    req.body = payload
    res = https.request(req)
    return res.code
  end

end
  • vim app.rb
value1 = "title"
value2 = "subject<br>"

cli = IFTTT.new
cli.call_maker(value1, value2)
  • bundle exec ruby app.rb

これでメール送信できるはずです
IFTTT の Webhook 経由の Gmail 送信は Content-Typemultipart/alternative になるっぽいです
添付ファイルや HTML の埋め込みができるので本文となる文字列に HTML を記載することができます

IFTTT の Gmail サービスは OAuth で認証/許可しているので、この方法のほうがセキュアです

最後に

Ruby から Gmail を送信する方法を 2 通り紹介しました
他にもやり方はいろいろあると思いますがてっとり早そうな方法かなと思います
IFTTT で Gmail サービスをすでに追加している人は IFTTT で Applet を作るのが簡単だと思います
もしそっちのほうが面倒だという場合はアプリケーションパスワードを使う方式にし、それも嫌な場合はセキュリティリスクを覚悟で安全性の低いアプリを信頼する設定をする感じかなと思います

参考サイト

0 件のコメント:

コメントを投稿