SendGridを使ってGCEからメールを確実に送る方法

  • このエントリーをはてなブックマークに追加

ご注意

この記事は 2015年11月26日 に書かれたものです。内容が古い可能性がありますのでご注意ください。

Webサービスにはメール送信がつきもので、Google Compute Engine のインスタンスからメールを送信するのはニーズがあります。しかし残念なことに、GCEでは立ち上げたインスタンスにMTA(メール転送エージェント)を構築しただけではメールは送れません。

そのままでは送れない理由(Outbound Port 25 Blocking対策)

世界全体のメールトラフィックの75%はスパムメールが占めていると言われています。そのためISP(インターネットサービスプロバイダ)各社はSMTP(25番ポート)を外部へ送る場合に制限をかけるように対策し始めました(一般に Outbound Port 25 Blockingと呼ばれる)。

GCEからメールを送れるようにするには、 SendGrid 又は Mailgun などサードパーティを介してメールを送ることになります。(実は裏口もありますが…)

メールを送信する方法

GCEからSMTPプロトコルにてメールを送信するには、サードパーティを利用する方法とGoogleAppsのアカウントを使ったメール送信機能を利用する方法との2通りがあります。(別途WebAPI等全く別の方法もあります)

今回はその中でもオーソドックスである、Google推奨のSendGridを利用する方法を紹介します。

GCPのプロジェクトを作成しインスタンス(任意のLinux、ここでは Debian GNU/Linux 7.9 (wheezy) を利用した例を上げます)を生成した前提で次のステップを踏みます。

  1. SendGrid に登録する
  2. GCEインスタンスに Postfixをインストールする
  3. sendmailコマンドでメールを送信する

1. SendGrid に登録する

SendGridはクラウド上にあるメールインフラです。サービスの規模に合わせてスケーラブルで、メールの配信到達性・保守性が高い特徴があります。あの有名な foursquare や Pinterest も利用しており、SendGrid全体では月間190億通のメールを配信しています。自前でメールインフラを保守運用するより低コストです。GCEではSendGrid を推奨しています。WebAPI やクリックトラッキングも提供しています。

SendGrid日本代理店の登録ページから個人情報と利用用途を入力し、申請します。利用用途が明確であれば1日以内で申請が下り、ログインユーザ名がメールにて送られてきます。

ログインユーザ名と設定したパスワードでログインします。
ログインしますと、以下のようなダッシュボードが表示されます。

ダッシュボード

SendGridアカウントの準備はこれにて完了です。

2. GCEインスタンスにPostfixをインストールする

Google Cloud Platform の公式ドキュメントに則り解説しますので、一読してみてください。(本文章の通りにやればドキュメントは見なくても大丈夫です)

メールを送信させたいインスタンスに接続し、Postfixをインストールします。作成したインスタンスのクラスは g1-small (1 vCPU, 1.7 GB memory)、OSは Debian GNU/Linux 7.9 (wheezy) でセットアップしました。以下の手順はそれを前提に進めます。まずは、スーパーユーザになってデフォルトファイルアクセス権をルート以外アクセスできないよう設定します。

$ sudo su –
# umask 077

postfixのインストールを開始します。

# apt-get update && apt-get install postfix libsasl2-modules -y

インストール中にダイアログが表示され、メールサーバ設定タイプを選択します。先ほどの公式ドキュメントの指示通り、Local only (ローカルのみ)にします。

2つ目のダイアログでは、任意のシステム名を入力します。デフォルト値のままでも構いません。

インストールが完了したら、 /etc/postfix/sasl_passwd ファイルを作成し、SendGridのログイン用のユーザ名とパスワードを書き入れて保存します。ユーザ名がhogehogeUser、パスワードがfugaFugaであれば下のコマンドのように hogehogeUser:fugaFuga とコロンで区切って書きます。SendGridにSMTPでメールを送信するには2525番ポートを使用しますのでポート番号は2525と指定します。

# cat > /etc/postfix/sasl_passwd << EOF
[smtp.sendgrid.net]:2525 hogehogeUser:fugaFuga
EOF

保存しましたらPostfix コマンドでsasl_passwd.dbを作成します。

# postmap /etc/postfix/sasl_passwd

DBファイルが生成されたらパスワードが平文で書かれたファイルは危険なので削除しておきます。

# rm /etc/postfix/sasl_passwd

/etc/postfix/main.cf を開き、メール送信をSSL/TLSで且つ、SMTPで認証するようファイルの下方に以下の設定を追記します。

# vim /etc/postfix/main.cf
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
relayhost = [smtp.sendgrid.net]:2525

また、同ファイルの以下の行をハッシュでコメントアウトし、保存します。

# default_transport = error
# relay_transport = error

Postfixの設定をリロードします。

# postfix reload

以上でpostfixの設定は完了です。

3.sendmailコマンドでメールを送信する

下のようなsendmailコマンドを打つことでメール送信が出来ているかどうか確認出来ます。(test@apps-gcp.comをメール受信可能なメールアドレスにしてください)

# printf ‘Subject: test\r\n\r\npassed’ | sendmail test@apps-gcp.com

root@hogehoge.internal から sendgrid.net 経由でメールが送られてきました。

SPFレコードとDKIMを設定してメールを確実に届ける方法

GCEからメールを送信する最低限の設定は上で紹介した方法で実現できますが、受信サーバによっては送信元を偽装したメールを弾くようになっておりメールが届かないことがあります。より多くのメールサーバに確実に到達させるにはもうひとステップ必要です。
以下の2つを設定することで送信元を保証することです。

  • SPFレコード(メールが正規のサーバから送られたのかをDNSサーバに問合わせ、判断する仕組み)
  • DKIM(送られてきたメールに付与された電子署名をDNSサーバに問合わせ、送信ドメインの正当性を判断する仕組み)

SendGrid ではそれらの設定ができる機能を Whitelabeling と呼んでいます。

Whitelabelingとは?

Whitelabeling には

  • Domain Whitelabel (独自ドメインで送信ドメイン認証するための機能)
  • Email Link Whitelabel (メール本文のリンクのURLを独自ドメインにする機能)
  • IP Addresses Whitelabel (送信元IPアドレスで認証する機能)

の3つの機能があります。

SPFレコードとDKIMの設定は Domain Whitelabel に該当しますが、 IP Addresses Whitelabel も一緒に設定することがメールの到達率を上げる上でより好ましいです。Email Link Whitelabel は迷惑メールフィルタに引っかかりにくくなります。メールの到達率を上げたいことが目的ですので下の方で Whitelabeling の Domain Whitelabel と IP Whitelabel の設定を紹介します。
Whitelabeling を利用するにはSendGridの料金プランを Silverプラン以上に変更する必要があります。

SendGridの料金プラン

IP Whitelabel の設定には、固定IPアドレスが必要です。SendGridの固定IPアドレスは1本あたり月額2500円で購入できます。固定IPアドレスは追加で購入することができます。注意するべきは、一つの固定IPアドレスに複数のドメインを紐付けることはできません。
Silverプランは月額9,480円で、SendGridのメール送信サーバの固定IPアドレスが1本おまけで付いてきます(2015年11月現在)。

1. SendGridを紐付けるためのサブドメイン(Domain Whitelabel)を設定します

SendGrid 画面上の左側のメニューから SETTINGS の Whitelabels > Domains を開きます。 Add New Domain で新しい Whitelabel を作成します(メニューの構成は変わることがあります)。
SUBDOMAIN と DOMAIN を指定して、 DEFAULT WHITELABEL にはチェックせず Save します。下の例では sea-passport.jp というドメインを使って設定しています。

SETTINGS の Whitelabels > Domains を開きますと先ほど追加したWhitelabelがDNS設定のバリデートに失敗していると罰マーク付きで登録されていますので View を開いてください。

Viewを開きますと、DNSに追加するべきMXレコードとTXTレコードが表示されます。
MXレコードとTXTレコードのHostとDataをコピーし、ドメインレジストラのDNSレコード入力欄に入れます。
下の図のDNSレコードはsea-passport.jpの例として表示されています。
レコードはレジストラに追加してから反映まで1分程時間がかかります。
DNSレコードの反映が完了した頃に Validate Record をクリックしてSendGridとDNSとの紐付けを確認します。

スペルミス等なくDNSに正しく反映されていれば×マークが緑のチェックマークに変わり、設定完了です。

domain_validated

2. 固定IP(IP Whitelabel)を設定します

Domain Whitelabel の設定が完了し、続いて IP Whitelabel の設定を行います。
SendGrid 画面上の左側のメニューから SETTINGS の Whitelabels > IPs を開きます。 Add whitelabel で新しい IP Whitelabel を作成します(メニューの構成は変わることがあります)。
利用したい設定する IP ADDRESS にチェックを付け、ドメインとサブドメインを入力して save します。

Whitelabels > IPs を再度開きますと固定IPアドレス 51.32.51.198 の Whitelabeling の情報が表示されます。Domain Whitelabel と同様、DNSのAレコードをコピーし、ドメインレジストラのDNSレコード入力欄に入れます。レコードはレジストラに追加してから反映まで1分程時間がかかります。
下の図のAレコードはo1.em.sea-passport.jpと51.32.51.198 が紐付けられている例として表示されています。
DNSレコードへの反映が完了した頃に Validate Record をクリックしてSendGridとDNSとの紐付けを確認します。

Whitelabeling の Domain Whitelabel と IP Whitelabel の設定をしましたらメールを送ってみましょう。すると「sendgrid.net 経由」という文字が表示されなくなりました。
Whitelabeling 機能が効いています。

このメールのヘッダー情報を覗いてみると、下表のように Whitelabeling の設定前後で一部変わっていました。実際に Whitelabel の設定をする前に受け取れなかった方に、この設定で再度送ってみると、違いを実感出来ると思います。

表1. Whitelabeling 設定前後のヘッダーの違い

Whitelabeling の設定前 Whitelabeling の設定後
Return-Path のドメイン sendgrid.net email.sea-passport.jp
Received-SPF

バウンスメールのドメイン名

sendgrid.net email.sea-passport.jp
Received-SPF

dkim の値

temperror (認証不可能) pass (認証成功)

まとめ

GCEにPostfixをセットアップし、SendGridのアカウントを設定ファイルに追記するだけでメールは送れますが、 Whitelabeling を使うことで確実に送ることができます。
Whitelabeling には Domain Whitelabel と Email Link Whitelabel と IP Addresses Whitelabel の3つがあります。今回は Domain Whitelabel と IP Whitelabel の設定を行いメール到達率の向上を図りました。
特定のドメイン宛てのメール(エラー通知等)であれば特段無料の範囲で対応出来ると思いますが、サービス系でユーザに通知するなどの場合はこちらの設定をされた方が良いでしょう。

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら