0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS SES(SNS)でメッセージを送るの実装体験談

0
Last updated at Posted at 2026-01-17

AWS SES でできること

  • メール送信(Transactional / Bulk)

    • システム通知、パスワードリセット、レシート送信などのトランザクションメール
    • 大量メールの一括送信(マーケティング用途にも利用可能)
  • ドメイン認証(SPF / DKIM / DMARC)

    • 送信ドメインの正当性を担保し、迷惑メール判定を回避
  • 送信結果のトラッキング

    • Delivery / Bounce / Complaint / Open / Click のメトリクス取得
    • SNS 連携でイベントをリアルタイムに受信可能
  • テンプレートメールの管理

    • HTML テンプレートを SES 内に保存し、動的パラメータを埋め込んで送信
  • Sandbox / Production モード

    • 初期状態は Sandbox(送信先制限あり)
    • 本番利用には Production への昇格申請が必要

AWS SNS でできること

  • 通知の配信(Pub/Sub)

    • アプリケーション間の非同期メッセージング
    • Lambda / SQS / HTTP(S) / Email / SMS などへ配信
  • SES のイベント受信

    • Bounce / Complaint / Delivery のイベントを SNS Topic に流し、Lambda や SQS で処理可能
  • モバイルプッシュ通知

    • APNs / FCM などのプッシュ通知サービスと連携
  • Fan-out アーキテクチャ

    • 1 メッセージを複数購読者へ同時配信
    • マイクロサービス間の疎結合化に有効

ローカル開発

LocalStack で開発する

LocalStack を使うことで、SES / SNS を含む AWS サービスをローカルで疑似再現できる。

セットアップ例(docker-compose)

services:
  localstack:
    image: localstack/localstack:latest
    environment:
      - SERVICES=ses,sns,sqs
      - DEBUG=1
    ports:
      - "4566:4566"
    volumes:
      - "./localstack:/var/lib/localstack"

javaの参考ソース


private SesClinet sesClient;

public void inti(){
    sesClient = SesClient.builder()
        .endpointOverride(URI.create("http://localhost:4566"))
        .region(Region.US_EAST_1)
        .credentialsProvider(
            StaticCredentialsProvider.create(
                AwsBasicCredentials.create("test", "test")
            )
        )
        .build();
}


public void sendEmail(){
    SendEmailRequest request = SendEmailRequest.builder()
        .destination(Destination.builder()
                .toAddresses("test@example.com")
                .build())
        .message(Message.builder()
                .subject(Content.builder().data("Test Email").build())
                .body(Body.builder()
                        .text(Content.builder().data("Hello from LocalStack!").build())
                        .build())
                .build())
        .source("noreply@example.com")
        .build();

    sesClient.sendEmail(request);
}

ローカルでできること

  • SES のメール送信 → LocalStack のメールビューアで確認
  • SNS Topic の作成・Publish
  • SQS と SNS の連携(Subscription)
  • Lambda のローカル実行(必要に応じて)

以下、docker内からメールを打つ参考スクリプト。

aws --endpoint-url=http://localhost:4566 ses send-email \
  --from no-reply@example.com \
  --destination ToAddresses=dev@example.com \
  --message "Subject={Data=Test},Body={Text={Data=Hello}}"

結合テスト環境でのテスト

Sandbox 状態での確認

Sandbox の制限

  • 送信先は 検証済みメールアドレスのみ
  • 1 日あたりの送信数が制限される
  • 本番ドメインでの大量送信は不可

結合テストで確認すべき項目

メール送信 API の正常系・異常系

  • SNS 経由の Bounce / Complaint の受信
  • メールテンプレートのレンダリング
  • SQS / Lambda との連携動作

実環境でのテスト

Production モードへの移行

  • AWS に「送信制限解除リクエスト」を提出
  • 利用目的、送信量、オプトイン方法などを説明
  • 承認されると Sandbox 制限が解除される

本番テストで確認すべきこと

  • 実際の受信メールの表示(HTML / Text / 画像リンク)
  • SPF / DKIM / DMARC の認証結果
  • 迷惑メールフォルダに入らないか
  • Bounce / Complaint の処理が正しく動くか
  • 大量送信時のスループット(Rate Limit)

本番テストの注意点

  • テスト用のメールリストを用意する
  • 本番ユーザーに誤送信しないように注意
  • 送信ログを CloudWatch / S3 に保存しておく
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?