Google Compute Engine は、メールの送信に使う 25/465/587ポートの宛への通信が禁止されているため、PostfixなどMTAを設定しただけでは、メール送信をすることができません。対応方法は色々あるようですが Google Compute Engine からメールを送信するには、SendGrid など外部のメール配信サービスを利用するのが手軽なようです。そこで今回は、SendGrid を使って Google Compute Engine からメールを送信する方法をまとめてみました。
大手クラウドのメール送信制限状況
設定の前に、少し気になったので大手クラウドサービスのメール送信に関する制限を調べてみました。(2016年8月24日現在)
クラウドサービス | メール送信制限 | 対応方法 |
---|---|---|
Amazon Web Services | 1日数件程度に制限 | 送信制限解除申請が必要 |
Google Cloud Platform | 送信不可 | メール配信サービスを利用 |
Microsoft Azure | 送信不可 | メール配信サービスを利用 |
普段は国内のレンタルサーバやクラウドサービスを利用することが多いので、サーバーからメール送信が出来ない事に驚きましたが、海外のクラウドサービスでは当たり前のことのようです(^^;) これは時代の流れなのでしょうか。
AWS では、同社のメール配信サービス Amazon SES を使う方法もあるようです。Google Cloud Platform と Microsoft Azure は、メール配信サービスを持っていないため、どちらもサードパーティの SendGrid 等の利用をオススメしています。
・参考サイト
Q: EC2 インスタンスからメールを送信する際に制限はありますか? | AWS
Sending Email from an Instance | Google Cloud Platform
Azure 上にメールサーバー/SMTP サーバーを構築する場合の注意事項 | Microsoft Azure
SendGrid のアカウント作成
まず初めに Google Cloud Launcher から SendGrid のアカウントを作成します。
Google Cloud Platform のコンソールから「Cloud Launcher」を選択
「SendGrid」で検索して「SendGrid」をクリック
「無料プランで開始」をクリック
プラン「Free($0.00/月)」が選択されているのを確認して「登録」をクリック、画面にも表示されていますが、月12,000通までは無料枠でメール送信できるようです(2016年8月24日現在)
SendGrid の登録画面に移動します。全て入力して「Continue」をクリック(Username にスペースは使えません)
SendGrid から Googleアカウントへの許可リクエストが表示されます。問題がなければ「許可」をクリック
以上で SendGrid アカウントが作成されました。「CLOSE & RETURN TO GOOGLE」をクリックして Cloud Launcher の画面に戻ります。
今回は、SendGrid のユーザ名(Username)とパスワードを使って、SendGrid のSMTPサーバに接続してメールを送信しますので、「SendGrid website」をクリックします。(APIキーの作成は必要ありません)
SendGrid から確認メールを送信して、確認すれば SendGrid の管理画面が使えるようになります。
SendGrid のタイムゾーン変更
SendGridのTIME ZONEが「US & Canada」になっていますので日本時間に変更します。
ユーザ名 → Account Details をクリック
Account Details ページ最下部の「Change Time zone」をクリック
「GMT+09:00 - Osaka, Sapporo, Tokyo」を選択して「Save」をクリック
管理画面をざっと見てみましたが、マーケティングメール機能などもあり、サーバーの通知メールだけで使うにはもったいないくらい高機能です。
SendGrid のアカウント作成と設定は以上です。続いてVMインスタンス上のPostfixの設定です。
Postfix の設定
Compute Engine の VMインスタンスは CentOS7のOSイメージで作成しました。
root ユーザに切り替えておきます。
Postfix関連のパッケージをアップデートします。
・下記パラメータをPostfixの設定ファイルの末尾に追加します。2525ポートでSMTP接続するのが特徴です。
vim /etc/postfix/main.cf
relayhost = [smtp.sendgrid.net]:2525
# SMTP認証の設定(強制SSL/TLS)
smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous
・SASLパスワードマップの作成
vim /etc/postfix/sasl_passwd
パスワードを書いているので、パーミッションを変更(root のみ読み書き可能にする)
PostfixのDBファイルを生成
設定した内容を読込みます。
以上で、Postfixの設定完了です。
(公式ドキュメント)Sending Email with SendGrid | Google Cloud Platform
テストメールの送信
mail コマンドをインストールします。
テストメールを送信します。
メールログを確認して、レスポンスコードが「250」であればOKです。
tail /var/log/maillog
Aug 24 05:28:16 instance-1 postfix/smtp[1426]: BF271200B52F: to=<user@example.com>, relay=smtp.sendgrid.net[119.81.43.2]:2525, delay=1.1, delays=0.06/0.03/0.92/0.1, dsn=2.0.0, status=sent (250 Ok: queued as Zs_EzATcQpO02Ejun0HuIw)
SendGrid の管理画面の「Activity」でもメールの送信状況を確認できます。
テキスト本文をHTMLメールに変換しないようにする
テストメールをメーラーで表示して気がついたのですが、本文がテキストでもHTMLメールに変換するように、デフォルトで SendGrid は設定されています。これは、imgタグを埋め込んでメールの開封を検知するためのようです。
テキスト本文をそのままテキストメールで送信したい場合は、SendGridの管理画面で以下を変更します。(当然ですがメールの開封検知はできなくなります)
Settings → Mail Settings → Plain Content を「ON」をクリック
終わりに
次回は SendGrid に、送信ドメイン認証の SPF と DIKIM の設定をしてみたいと思います。
コメント