SESで150万件のメールを送るまで
JAWS-UG 北陸新幹線 #4 in 長野
中島祐樹
@ProletariatPro
自己紹介
中島祐樹
  • フリーランスプログラマー
  • やってること:Django/AWS
  • ToCアプリのバックエンドとインフラ
  • AWS ソリューションアーキテクトアソシエイトを持っていましたが3年経ってしまい失効しました….
今日お話しすること
1
メール大量送信のきっかけ
150万件のDMを送信するための選択肢と検討過程
2
AWS SESの設定と挑戦
サンドボックスからの脱出と本番申請の壁
3
トラブルと解決策
バウンスメール対策と送信制限の問題
4
学んだ教訓
SESを使って得た経験と反省点
きっかけ(2025年2月)
アプリのユーザーに向けて150万件のDMを送信する必要がありました
最初に検討した選択肢:
  • SendGrid - 機能は充実しているが料金が高い
  • 自前のメールサーバー - コスト削減できるが正直届かない
  • AWS SES - SendGridより安価で配信率も良好
SESとSendGridの料金比較
AWS SESの方が約半額で利用できるため、コスト面で有利と判断しました。
バウンスメール対策の仕組み
1
バウンスメールの受信
SESからSNSを経由してLambda関数が起動
2
DynamoDBへの登録
バウンスしたメールアドレスをデータベースに記録
3
送信除外リストの管理
次回以降の送信から除外する仕組みを構築
配信停止(Unsubscribe)の仕組み
ユーザーが自分で配信停止できる仕組みも必要です
  • 配信停止用のAPIを独自に開発
  • メール本文にUnsubscribeリンクを設置
  • unsubscribeしたメールをDynamoDBに記録
  • 送信前に毎回除外リストと照合
SESのサンドボックス環境(2025年3月)
SESの新規アカウントは「サンドボックス」状態から始まります:
  • 1日の送信上限が制限されている(200件)
  • 検証済みのメールアドレス/ドメインにのみ送信可能
  • 本番利用には制限解除申請が必要
まずはテスト送信で問題ないことを確認しました
本番環境への申請
申請準備
送信目的、対象ユーザー、バウンス対策などの情報をまとめる
AWS Support Centerから申請
制限解除申請フォームに必要事項を記入して送信
AWSからの返信を待つ
通常24時間以内に審査結果が届く
いよいよ本番環境で150万件の送信に向けて準備完了...と思ったのですが...
思わぬ障壁:アカウント一時停止
「アジアパシフィック (東京)リージョンにおいて、お客様の Amazon SES アカウントが一時停止中であるため、現時点ではこの申請を承認することができません。バウンスが原因で、お客様のアカウントのメール送信機能が一時停止されています。この問題の詳細は、2017年5月7日に Amazon から送信されたメールに記載されております。」
8年前の2017年にバウンス率が高すぎて停止されていたアカウントだったことが判明!

AWSアカウントの過去の利用履歴は必ず確認しましょう!
問題解決への道
AWSサポートに対して以下の内容で回答しました:
  • バウンスメールを受け取って自動的に送信除外リストに登録する仕組みを構築済み
  • Unsubscribe機能も実装済み
  • 送信前にバウンス履歴のあるアドレスを除外する対策を講じている
→ 2025年4月、アカウント停止が解除され送信開始可能に!
新たな問題:リージョンの混乱
東京リージョン
テスト環境として利用
本番申請も東京リージョンで実施
オレゴンリージョン
何故か本番申請が解除されたのはこちら
意図せず別リージョンで承認された
問題発生
東京リージョンでは送信できない
再びサポートとやりとり
再度の申請と制限
「お客様のリクエストを慎重に審査させていただきましたが、現時点ではAWS アジアパシフィック (東京)リージョンにおける申請を承認することができません。お客様のユースケースに関する情報、また、どのようなメッセージが送信されるかについての情報が不十分なため、こちらの決定に至りました。」
一度に150万件の送信は認められず、まずは1日5万件ずつ送信して信頼性を構築していくことになりました。

AWSは新規ユーザーに対して、いきなり大量送信を許可しない方針です。
バウンス率10%の壁(2025年5月)
送信を開始してすぐにバウンス率が10%に到達し、再び送信停止に...
原因:
  • アプリでメールアドレスの検証をしていなかった
  • 10年続いたアプリのため古いアドレスも多数存在
対応策の実施
ドメイン限定送信
主要なメールドメイン(Gmail、icloud等)に限定して送信
事前検証
小規模なバッチで送信テストを行い、バウンス率を監視
アドレス洗浄
明らかに不正なアドレスを事前にフィルタリング
これらの対策をAWSサポートに連絡し、送信停止が解除されました。
再びの挫折(2025年6月)
対策を講じたものの、バウンス率が8%に到達
AWSからの警告:
「バウンス率が高すぎるため、アカウントを監視状態に移行します。改善が見られない場合は、送信機能が一時停止されます。」
安全を期してメール送信自体を一時停止...
総務省からの警告
先般貴殿が送信した電子メールは、以下のとおり、「特定電子メールの送信の適正化等に関する法律」(平成14年法律第26号)に違反していますので、直ちに是正 してください。 今後、改善が見られない場合は、同法の規定に従い、報告徴収、立入検査、措置命令及び刑事罰(1年以下の懲役又は100万円以下の罰金(法人の場合には、行為者を罰するほか3000万円以下の罰金))の対象となります。 なお、本メールは、貴殿の電子メールの表示等に基づき送信しておりますが、疑義 があれば、当方あてメールにてご連絡ください。
メール送信時の法的要件
特定商取引法に基づく表示
送信者の名称、住所、連絡先を明記
プライバシーポリシー
個人情報の取り扱いについての方針
お問い合わせ先
ユーザーからの質問や連絡を受け付ける窓口
オプトアウト方法
配信停止の手続き方法を明確に記載
これらの要素をすべてのメールに含めることが法的に必要です
学んだ教訓
技術面
  • バウンスメール対策は事前に徹底する
  • メールアドレスの検証は必須
  • 小規模テストから段階的に拡大する
  • リージョンの選択と統一に注意
ビジネス面
  • エンジニアの工数も含めたコスト計算
  • 法的要件の事前確認
  • SendGridなどの専用サービスの価値再評価
  • トラブル対応コストも考慮する
「正直SendGridを使う方が早くて安かった気がする(エンジニアの工数代とか)」
まとめ:SESで大量メール送信する際のポイント
事前準備
  • メールアドレスの検証必須
  • バウンス処理の仕組み構築
  • 法的要件の確認
AWSとの関係
  • アカウント履歴の確認
  • リージョン選択の一貫性
  • 段階的な送信制限引き上げ
代替案の検討
  • SendGridなど専用サービス
  • 総コスト(工数含む)比較
  • サポート品質の評価
ご清聴ありがとうございました!
今回の対応以降:メールが届くってすごいなと思うようになりました