Heroku + Sendgrid

Heroku からメールを送信したかったので、アドオンである Sendgrid を使うことにした。無料の Sendgrid は 1 日 200通までという制限がある。メールの送信は Daily Cron の結果通知にしか使う予定がないので、特に制限は気にする必要がなかった。

add Sendgrid

% heroku addons:add sendgrid:free

mail gem を使う

Rails を使う場合の説明は公式のドキュメントに書いてあるけれど、Rails 以外のフレームワークを使う場合は具体的な説明はなかった。Pony がおすすめと書いてあった。
が、 mail を使うことにした。はじめは ActionMailer を使おうとしたけれど、ActionMailer をインストールしたら、依存関係で mail もインストールされたので、じゃあ mail にしようか、という流れ。

設定

メール送信のための設定。環境変数から ユーザ名やパスワードを取得。

 Mail.defaults do
    delivery_method :smtp, {
      :address        => 'smtp.sendgrid.net',
      :port           => 25,
      :authentication => 'plain',
      :user_name      => ENV['SENDGRID_USERNAME'],
      :password       => ENV['SENDGRID_PASSWORD'],
      :domain         => ENV['SENDGRID_DOMAIN'],
    }
  end

送信

cron の結果には日本語が含まれていれ、そのまま送信すると文字化けするので文字コードを変換して送信。文字コード変換のところはもっといいやり方があるかも。
宛先は環境変数に登録しておく。

message = report.encode('iso-2022-jp').force_encoding('binary')

mail = Mail.new do
  from    'from@example.com'
  to      ENV['REPORT_MAIL_TO']
  subject subject
  body    message
end
mail.charset = 'ISO-2022-JP'
mail.deliver