はじめに

EC2インスタンスから外部へメールを送る際、標準的な SMTP サーバーを自前で構築するのは運用保守コストが高い作業です。本記事では Amazon SES(Simple Email Service)を採用し、安全にメールを送るための具体的な手順を解説します。

従来のやり方の課題

自前でメールサーバー(Postfix 等)を運用する場合、以下の課題に直面します。

課題項目 内容 影響
IP レピュテーション サーバーの IP が信頼されていない 不達、配信遅延、迷惑メールに振り分けられる
ポート 25 の制限 AWS 側でデフォルト制限されている 制限解除申請の手間が発生する
運用負荷 セキュリティ対策やパッチ適用 運用保守コストが継続的にかかる

選択肢と比較・選定のポイント

メール送信機能を実装する際の主な選択肢を比較しました。

比較項目 自前メールサーバー 外部 SMTP (SendGrid 等) Amazon SES
運用保守コスト 高(サーバースペックに依存※) 中(定額プランあり) 低(従量課金・無料枠あり)
配信到達性 低(実績構築に時間を要する) 高い 高い(AWS運用のIP)
管理 全てセルフ 外部コンソール AWS コンソールで完結

※サーバー費用自体は、要求されるスペックによって変動するため、一概に高低を比較することはできないが、「最適なスペックの選定」「ハードウェアやOSの管理」といったエンジニアの運用工数を含めたトータルコストで考えると、マネージドサービスであるSESが多くの場合で有利となる。

選定のポイント:
AWS環境を利用しているなら、運用保守コスト・管理の容易さ・配信到達性のバランスが最も優れた Amazon SES の一択です!

SES導入と送信テスト手順

前提条件

本記事では以下の環境を前提に解説を進めます。

  • 送信元ドメインの DNS 管理に Amazon Route 53 を使用していること
  • SES の本番環境アクセスが有効になっていること
  • 構築済みの EC2 インスタンスを所有していること(EC2 の作成方法については本記事では割愛します)

■ ステップ1:ドメインの検証(Route53 連携)

送信元として使用するドメインの所有権を証明します。
Route53 を利用していれば、レコード登録は自動で行えるため非常に簡単です!

1. SES コンソールの「ID」から「ID の作成」を選択します。
2. 「ドメイン」を選択し、利用するドメイン名を入力します。
3. SPF を設定するため「カスタム MAIL FROM ドメインの使用」にチェックを入れ、サブドメインを入力します。


4. 次にDKIMを設定します。今回は「Easy DKIM」を選択します。

5.「IDを作成」をクリックします
6. 作成後、DMARCも設定するため、「DNS レコードの Route53 への発行」を押下し、TXTレコードをroute53に登録します

数分後、ステータスが「検証済み」に変わることを確認できました。

■ ステップ2:SMTP認証情報の作成

EC2から接続するための専用ユーザーを作成します。

1. 「SMTP 設定」から任意のIAMユーザ名を入力し、「SMTP 認証情報の作成」をクリックします。
2. 生成された「SMTP ユーザー名」と「SMTP パスワード」を保存します。

■ ステップ3:EC2から送信テストを実施

今回は外部ツールを使わず、標準的なコマンドのみで疎通確認を行います。
具体的な送信手順については、こちらの AWS 公式サイト を参考にしてください。
また、EC2のセキュリティグループのアウトバウンドで、ポート587、または465を許可しておいてください。

1. Amazon SES SMTP インターフェイスへの接続をテスト

sh-5.2$ openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.ap-northeast-1.amazonaws.com:587
Connecting to 18.180.254.105
depth=2 C=US, O=Amazon, CN=Amazon Root CA 1
verify return:1
depth=1 C=US, O=Amazon, CN=Amazon RSA 2048 M01
verify return:1
depth=0 CN=email-smtp.ap-northeast-1.amazonaws.com
verify return:1
250 Ok
451 4.4.2 Timeout waiting for data from client.
read:errno=0
sh-5.2$

250 Ok と表示され、問題なく接続が成功していることが確認できました。

2. Amazon SES SMTP インターフェイスを介してEメール送信をテスト
コマンドラインを入力すると、SMTP認証情報、宛先、メール本文などが質問がされるので回答していくと下記のように出力されます。
こちらも最終的に 250 Ok と表示され、正常に送信が受理されたことを確認できました。

sh-5.2$ #!/bin/bash

# Prompt user to provide following information
read -p "Configuration set: " CONFIGSET
read -p "Enter SMTP username: " SMTPUsername
read -p "Enter SMTP password: " SMTPPassword
read -p "Sender email address: " MAILFROM
read -p "Receiver email address: " RCPT
read -p "Email subject: " SUBJECT
read -p "Message to send: " DATA

echo

# Encode SMTP username and password using base64
EncodedSMTPUsername=$(echo -n "$SMTPUsername" | openssl enc -base64)
EncodedSMTPPassword=$(echo -n "$SMTPPassword" | openssl enc -base64)

# Construct the email
Email="EHLO example.com
AUTH LOGIN
$EncodedSMTPUsername
$EncodedSMTPPassword
MAIL FROM: $MAILFROM
RCPT TO: $RCPT
DATA
X-SES-CONFIGURATION-SET: $CONFIGSET
From: $MAILFROM
To: $RCPT
Subject: $SUBJECT

$DATA
.
QUIT"

echo "$Email" | openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.ap-northeast-1.amazonaws.com:587
Configuration set:
Enter SMTP username: AKIAXQIQAC7FZAV5H5N5
Enter SMTP password: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Sender email address: test@xxxxxxxxxxxxxxx
Receiver email address: xxxxxxxxxxxx@xxxxx
Email subject: test mail
Message to send: This is test mail

Connecting to 13.114.114.157
depth=2 C=US, O=Amazon, CN=Amazon Root CA 1
verify return:1
depth=1 C=US, O=Amazon, CN=Amazon RSA 2048 M01
verify return:1
depth=0 CN=email-smtp.ap-northeast-1.amazonaws.com
verify return:1
250 Ok
250-email-smtp.amazonaws.com
250-8BITMIME
250-AUTH PLAIN LOGIN
250 Ok
334 VXNlcm5hbWU6
334 UGFzc3dvcmQ6
235 Authentication successful.
250 Ok
250 Ok
354 End data with <CR><LF>.<CR><LF>
250 Ok 0106019cf57cbcd9-b7fce348-eb8e-439d-993e-a16202dface0-000000
451 4.4.2 Timeout waiting for data from client.
read:errno=0
sh-5.2$

3. 受信確認
無事にテストメールを受信していることを確認しました。

まとめ

Amazon SES を利用すれば、複雑なサーバー構築なしで高い到達率のメール送信環境が手に入ります。設定は非常にシンプルです!
特に EC2との組み合わせは相性が良く、開発スピードを大幅に向上させることが可能です。ぜひ本手順を参考に構築してみてください!

参考ドキュメント

Amazon SES でのドメイン ID の作成 – Amazon Simple Email Service
コマンドラインを使用して Amazon SES SMTP インターフェース経由で E メールを送信する – Amazon Simple Email Service
Amazon SES における SPF を使用した E メール送信者の認証 – Amazon Simple Email Service