はじめに
目的
本報告書は、AWSを使ったメール送信の方法を分かりやすくまとめたものです。用途や規模に応じた選択肢、設定手順、運用上の注意点を具体例を交えて解説します。
概要
主に次の3つのアプローチを扱います:EC2上にSMTPサーバーを構築する方法、Amazon SES(Simple Email Service)を利用する方法、外部SMTPリレーサービスを使う方法です。さらに、SESでの認証や権限設定、APIの使い分け、Step Functionsとの連携例も含めます。
対象読者
AWSでメールを送信したいエンジニアや運用担当者、これから選定を行うプロジェクトリーダー向けです。基本的なAWSアカウント操作やLinuxの基礎が分かっていれば読みやすい内容です。
読み方の指針
各章は実装手順と設定例を中心に記載します。まず目的に合った方式を選び、必要な箇所を実際に試しながら進めることをおすすめします。
AWSでメール送信する3つの主要な方法
1. EC2上にSMTPサーバーを構築する方法
自身でPostfixやEximなどをインストールして運用します。自由度が高く、独自の設定やログ管理ができます。例えば社内専用の通知や細かい送信制御が必要な場合に向きます。ただし、スパム対策やIPのレピュテーション管理、24時間の監視が必要です。
2. Amazon SES(Simple Email Service)を利用する方法
AWSのマネージドサービスで、サーバー構築不要で大量送信にも耐えます。認証(DKIM/SPF)や送信制限の管理も簡単です。コストは使用量に応じて低めで、スケーラビリティを重視する場合に便利です。開発者向けにAPIやSMTPインターフェースが用意されています。
3. 外部のSMTPリレーサービスを利用する方法
SendGridやMailgunなどの外部サービスを使います。配信率改善や配信分析、テンプレート機能などが豊富で、設定が簡単です。SESと組み合わせてSESをリレー先にすることも可能です。運用負荷を抑えたい場合に向いています。
選び方のポイント
- 自由度と制御が最優先ならEC2構築
- コストとスケール重視ならSES
- 運用負荷を減らし機能を求めるなら外部リレー
具体的な要件(送信量、運用体制、配信成功率)で選ぶと失敗が少ないです。
EC2でSMTPサーバーを構築する方法
概要
EC2上にPostfixを入れてSMTPサーバーを立てる手順を、実例を交えて丁寧に説明します。自由度が高い一方で運用管理が必要です。
前提
- Amazon Linux 2またはRHEL系のEC2
- セキュリティグループで該当ポートを開放
手順(主要手順のみ)
1) パッケージのインストール
sudo yum install -y postfix cyrus-sasl-plain
2) main.cfの基本設定例(/etc/postfix/main.cf)
myhostname = mail.example.com
inet_interfaces = all
mydestination = $myhostname, localhost
relayhost = [smtp.example.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
3) SMTP認証情報(/etc/postfix/sasl_passwd)
[smtp.example.com]:587 username:password
保存後に実行:
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd*
sudo systemctl enable --now postfix
テスト
swaksやtelnetで送信を試します。
運用上の注意
- 資格情報は権限を限定して保護してください。
- メールキューやログを監視し、アップデートを適用してください。AWSではポート25の制限があることがあるため、587を使う運用を推奨します。
Amazon SES(Simple Email Service)を利用する方法
概要
Amazon SESはAWSが提供するマネージドなメール送信サービスです。サーバー構築不要で即時にメールを送信できます。送信元はメールアドレスIDかドメインIDのどちらかで検証します。用途に合わせてAPIやSMTPを使い分けます。
準備(検証とリージョン)
- 送信元メールアドレスまたはドメインを検証します。ドメイン検証は複数アドレスの管理に便利です。
- SESはリージョンごとに設定が必要なので、利用するリージョンを選びます。
送信方法の違い
- AWS SDK:プログラムから直接呼び出せます。細かい制御やメタデータの扱いに向きます。
- SMTP:既存アプリやライブラリと簡単に連携できます。
- API(sendEmail / send_raw_email):sendEmailは標準的な送信、send_raw_emailは添付やヘッダーを自在に操作する用途に使います。
簡単なPythonサンプル(boto3)
from boto3 import client
ses = client(‘ses’, region_name=’ap-northeast-1′)
resp = ses.send_email(Source=’you@example.com’,
Destination={‘ToAddresses’:[‘to@example.com’]},
Message={‘Subject’:{‘Data’:’件名’},’Body’:{‘Text’:{‘Data’:’本文’}}})
IAMとセキュリティ
最小権限のIAMユーザーを作成し、送信に必要な権限(ses:SendEmailやses:SendRawEmailなど)だけを付与してください。アクセスキーは安全に管理します。
Step Functions連携
Step FunctionsからLambda経由でSESを呼ぶ構成が一般的です。送信の前後でワークフローを組み、再試行やログ処理を行えます。
SMTPリレーサービスを利用する方法
概要
外部のSMTPリレーサービスは、メール送信を代行する仕組みです。AWS外部やAWS内のアプリから利用できます。送信の安定性や到達率を高めたいときに便利です。
メリット
- 到達率向上:送信実績やレピュテーション管理を提供します。例:SendGrid、Mailgun、SparkPostなど。
- 設定が簡単:アプリ側はSMTP設定を変えるだけで送信できます。
デメリット
- コスト:大量送信では料金が発生します。
- レート制限:送信上限に注意が必要です。
設定手順(簡潔)
1) サービスでアカウント作成しSMTP資格情報を取得します。
2) アプリやMTA(Postfixなど)でSMTPホスト、ポート(通常587)、ユーザー名、パスワード、STARTTLSを設定します。
3) 送信テストとバウンス/苦情のWebhook設定を行います。
Postfixの簡単な例
relayhost = [smtp.example.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
運用時の注意
- 資格情報は安全に保管します。鍵管理や環境変数で扱ってください。
- 送信量に応じてプランを選び、レート制限やバウンス処理を監視します。
- ログとWebhookで問題を早期に検知します。
メール送信時の認証とセキュリティ設定
SMTP認証(SESをSMTPリレーで使う場合)
SESをSMTPリレーとして使う際はSMTP認証を必ず有効にします。Postfixなどでは smtp_sasl_auth_enable = yes と設定し、smtp_sasl_password_maps にSMTP用のユーザー名とパスワードを登録します。smtp_use_tls = yes や smtp_tls_security_level = may(またはencrypt)を併用し、通信を暗号化します。例:ポート587(STARTTLS)や465(TLS)を使います。
API呼び出しとSignature Version 4
AWS SDK経由でSES APIを使う場合はSignature Version 4(SigV4)でリクエストに署名します。公式SDKは自動で署名を行いますが、自前実装では署名処理を正しく実装してください。EC2やLambdaではIAMロールを使うとアクセスキーを埋め込まずに済み、安全です。
送信ドメインの認証(SPF/DKIM/DMARC)
SPFは送信許可をDNSで示す仕組み、DKIMはメール本文に電子署名を付ける仕組みです。両方を設定すると受信側で正当性が高く評価され、到達率が上がります。DMARCはこれらを監視・ポリシー化します。SESでは簡単にDKIM用のDNSレコードを発行できます。
IAMと認証情報の管理
SMTP用の認証情報やAPIキーは最小権限で運用し、定期的にローテーションします。秘密情報はAWS Secrets Managerやパラメータストアで安全に保管します。
ベストプラクティス
- TLSを必ず有効にする
- 送信ドメインを検証する(SPF/DKIM)
- IAMロールでAPI呼び出しを行う
- 認証情報を安全に保管・定期ローテーション
これらで安全にメール送信を運用できます。












