AzureのSendGrid無料枠でメール送信してみた
Azure上の仮想マシンからlogwatchによるレポートメールを毎日送っていたのですが、ある日突然届かなくなってしまいました。
/var/log/maillog を見てみると「status=bounced」になっており、以下のようなメッセージが出力されていました。
Unfortunately, messages from ***.***.***.*** weren't sent. Please contact your Internet service provider since part of their network is on our block list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors. (in reply to MAIL FROM command))
合唱音源の新着情報.com のWebサーバのグローバルIPからのメール送信が弾かれてしまったようです。
logwatch程度なら届かなくても良いので長らく放置していました。 しかしアプリケーションからのメール送信を実装するにあたり、この問題を解決する必要が出てきました。
インフラがいろいろ面倒なので、クラウドサービスへ逃げることにしました。
メール送信のPaaSを使う
AWSにはメール送信サービス Amazon SES がありますが、Microsoft Azureにはありません。 Hotmailを持っている企業がなに寝ぼけているんだという感じなのですが、その代わりAzure上のPaaSとして SendGrid がマーケットプレイスに用意されています。
そして、Azure上でSendGridを申し込むとFreeプランの利用枠が通常400通/日から倍以上の 25,000通/月 へと増加します。 さすがMicrosoftですね。えっGoogle Cloud Platformsでも利用枠が増える?あーあー聞こえない
MicrosoftAzure のアカウントを持っていればSendGridへの登録は簡単です。
上記に従って登録し、接続情報(ユーザーネーム、パスワード、SMTPサーバのアドレス)を確認します。
Ruby on RailsアプリケーションからSendGridでメール送信
RailsのActionMailerを使ってメールを送信してみます。
- secret.yml に先程の接続情報を記述
- environment.rb で接続情報を設定
- 送信するためのVewを定義
- コントローラに相当するMailerクラスを定義
以上でメールを送信することができます。
これでOK。簡単ですね。
実際にtwitter投稿処理時にメールを送ってみました。
届きました。
なお、アプリケーションがViewを評価した時刻から実際にメールが届くまで1分程度かかりました。 SendGridがボトルネックなのかどうか調べていませんが、新規登録ユーザは意図的に配信を遅らせることがあるようです。
参考: qiita.com
まとめ
Azure上の仮想マシンから簡単にメールを送信することができました。 Azureにはメール送信サービスは用意されていませんが、SendGridのおかげで特に困ることはありませんでした。無料プランで 25,000通/月 と1日800通以上送信できるので、個人のWebサービスでは十分ですね。