Google Compute Engine から SendGrid 経由でメール送信

クラウド
クラウド
スポンサーリンク

Google Compute Engine は、メールの送信に使う 25/465/587ポートの宛への通信が禁止されているため、PostfixなどMTAを設定しただけでは、メール送信をすることができません。対応方法は色々あるようですが Google Compute Engine からメールを送信するには、SendGrid など外部のメール配信サービスを利用するのが手軽なようです。そこで今回は、SendGrid を使って Google Compute Engine からメールを送信する方法をまとめてみました。

大手クラウドのメール送信制限状況

設定の前に、少し気になったので大手クラウドサービスのメール送信に関する制限を調べてみました。(2016年8月24日現在)

クラウドサービスメール送信制限対応方法
Amazon Web Services1日数件程度に制限送信制限解除申請が必要
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 ユーザに切り替えておきます。

sudo -s

Postfix関連のパッケージをアップデートします。

yum -y install postfix cyrus-sasl-plain cyrus-sasl-md5

・下記パラメータをPostfixの設定ファイルの末尾に追加します。2525ポートでSMTP接続するのが特徴です。
vim /etc/postfix/main.cf

# SendGrid の SMTPサーバを追加
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

[smtp.sendgrid.net]:2525 <SendGridのユーザ名>:<SendGridのパスワード>

パスワードを書いているので、パーミッションを変更(root のみ読み書き可能にする)

chmod 600 /etc/postfix/sasl_passwd

PostfixのDBファイルを生成

postmap /etc/postfix/sasl_passwd

設定した内容を読込みます。

systemctl reload postfix

以上で、Postfixの設定完了です。

(公式ドキュメント)Sending Email with SendGrid | Google Cloud Platform

テストメールの送信

mail コマンドをインストールします。

yum -y install mailx

テストメールを送信します。

echo "テストメールです" | mail -s "テストメール" <送信先のメールアドレス>

メールログを確認して、レスポンスコードが「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 の設定をしてみたいと思います。

コメント

タイトルとURLをコピーしました