Precena Tech Book
コーポレートサイト採用サイト
  • はじめに
  • ソフトウェア開発
    • 開発環境構築
      • Homebrew
        • Homebrew用語の意味
      • ngrok
        • ngrokの導入
        • ngrokのアップグレード(v2 to v3)
      • Slack
        • Slackの/remind コマンドの形式
        • 対面での相談を気軽にするためのSlack設定
      • AWS CLI
      • Ruby
      • Scala
      • Prettier
      • zsh
        • zsh-completion
      • Mac
        • M1 Macでの開発環境構築(rosetta 無し)
    • バックエンド
      • OpenAPI
        • OpenAPI 定義ファイル分割のすゝめ
      • Ruby on Rails
        • ActiveRecordのfind_or_initialize_byメソッドにブロックを渡したときの挙動
        • Railsのアプリケーションサーバーのプロセス数とスレッド数の設定方法
        • Railsを6.1系から7.0系へアップグレードした時に調査したこと
        • schema.rbで差分が発生する事例とその復旧について
        • tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
        • Rails Migrationチートシート
        • GithubのプライベートリポジトリをGemfileで参照する方法
        • ActiveSupportのto_jsonメソッドの注意点
        • 危険なJSON出力を禁止するRuboCopカスタムルールの作成方法
      • Scala
        • Validated を直列に処理したい
      • DB
        • PostgreSQLにおける、削除行に対するロック獲得時の挙動
    • フロントエンド
      • React
        • Storybookを利用したビジュアルリグレッションテスト
  • インフラ開発
    • AWS
      • IAM
        • スイッチロールの設定手順
        • AWS CLIでのスイッチロールの設定手順
        • AWS Vaultを使ったスイッチロール設定手順
        • Github ActionsでIAMロールを利用してAWSリソースを操作する
      • ECS
      • SES
        • AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する
      • CloudWatch
        • Amazon SNS + Slack Workflowを使って、CloudWatch Alarmの通知をSlackチャンネルへ投稿する
      • Lambda
        • lambrollでAWS Lambda関数をデプロイしたときのTips
    • Heroku
      • HerokuのStackの設定
      • Heroku Postgresの運用でよく使うコマンド集
  • セキュリティ
    • Web
      • Same Origin PolicyとCORS
      • 脆弱性診断 2社同時依頼実施記録
  • Mail
    • SPF、DKIM、DMARCを使用した迷惑メール対策
  • データ分析
    • データ分析プロセス
  • SaaS
    • Zendesk
      • 問い合わせフォームの項目をサービスごとに出し分け、各サービス担当者に自動で振り分けてメールで通知する
  • イベント
    • RubyKaigi
      • RubyKaigi 2023 に現地参加しました
    • EMConf
      • EMConfJP2025_参加レポート
  • やってみた
    • IoT
      • Raspberry Pi + PaSoRi + Python で、勤怠打刻マシンを作ってみた
  • Precena Tech Book 管理
    • コンテンツ執筆時のルール
  • 関連リンク
    • プレセナエンジニア公式Twitter
GitBook提供
このページ内
  • 背景
  • カスタムメールヘッダ付きのメールを送信し、メールが不達になるケース
  • reject イベントが発生するメールを送信し、メールが不達になるケース

役に立ちましたか?

PDFとしてエクスポート
  1. インフラ開発
  2. AWS
  3. SES

AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する

前へSES次へCloudWatch

最終更新 10 か月前

役に立ちましたか?

背景

AWS SESでメール送信環境を構築したときは、合わせて メールが不達になったこと を検知する仕組みも構築します。 AWS SESから送信したメールでメール不達があまりにも多いと、AWS SESの利用が停止されるためです。

  さらに、AWS SESの本番運用を始める前に、メール不達を検知する仕組みの動作確認も大切です。

その動作確認で役立つのが Amazon SES メールボックスシミュレーター です (以降 シミュレーター と表記)。

シミュレーターには バウンス や 苦情 などのシナリオが用意されています。

このシナリオを使えば、AWS SES環境のバウンス率・苦情率に影響することなく、メール不達を検知する仕組みの動作確認ができます。

  さらに、シナリオとして用意されていないケース、例えば

  • カスタムメールヘッダ付きのメールを送信し、メールが不達になる

  • reject イベントが発生するメールを送信し、メールが不達になる

であっても、シミュレーターを使って動作確認ができます。

 

この記事では、シナリオとして用意されてないケースに対する、シミュレーターの使い方を記載します。

なお、不達を検知する仕組み 「AWS SESで発生したイベントの通知情報が AWS SES → AWS SNS → AWS SQS の順で流れていく環境」 は、すでに構築済であるとして、ここでは記載しません。

 

カスタムメールヘッダ付きのメールを送信し、メールが不達になるケース

まずはこのケースを試してみます。

今回は、「カスタムメールヘッダ X-My-Custom-Header を含むメールを送信したが、バウンスによりメールが不達になる」ケースをシミュレーターで試してみます。

まずはシミュレーターで以下の設定を行います。

  • Eメール形式欄では、 Raw を選択する

  • シナリオ欄では、 バウンス を選択する

  • メッセージ欄では、以下のようなMIMEメッセージを入力する

To: bounce@simulator.amazonses.com
Subject: バウンステスト
X-My-Custom-Header: hello
Content-Type: text/plain
MIME-Version: 1.0

hello

参考までに、設定した後のスクリーンショットは以下となります。

 

以上で準備ができました。

では、シミュレーターの テストEメールの送信 ボタンをクリックしてメールを送信してみましょう。

すると、このメールはバウンスし、AWS SQSへとイベント情報が連携されます。

AWS SQSのコンソールにて確認すると、以下のスクリーンショットのようなメッセージを受信できました。カスタムメールヘッダ X-My-Custom-Header が含まれています。

reject イベントが発生するメールを送信し、メールが不達になるケース

まず、「 reject (拒否)イベントとは何か」 から記載します。

rejectイベントについて、AWSドキュメントの記載は以下です。

拒否イベントのテスト

Amazon SES を介して送信するすべてのメッセージでウイルスがスキャンされます。ウイルスを含むメッセージを送信すると、Amazon SES はメッセージを受け入れ、ウイルスを検出して、そのメッセージ全体を拒否します。Amazon SES でメッセージが拒否されると、メッセージの処理が停止され、受取人のメールサーバーへのメッセージ配信は試行されません。次に、拒否イベントが生成されます。

 

  ただ、「実際にウィルスを含むファイルを作成し、AWS SESでそのファイルを添付してメールを送信する」を試すのは色々問題があります。

その問題を避けるため、AWSドキュメントにあるように、AWS SESでは

拒否イベントは、欧州コンピューターウイルス対策研究所(EICAR)テストファイルを使用してテストできます

という方法で reject イベントの発生をテストできそうです。

 

しかし、シミュレーターではEICARの内容をそのまま添付することはできません。

  文字列をbase64エンコードするには、各プログラミング言語のライブラリを使うのが簡単です。

今回はRubyのirbを使って base64 エンコードします。

% irb
irb(main):001:0> require 'base64'
=> true
irb(main):002:0> Base64.strict_encode64('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*')
=> "WDVPIVAlQEFQWzRcUFpYNTQoUF4pN0NDKTd9JEVJQ0FSLVNUQU5EQVJELUFOVElWSVJVUy1URVNULUZJTEUhJEgrSCo="

これでEICARテストファイルは添付できそうです。

  では、実際にシミュレーターで送信してみましょう。

今回は、「カスタムメールヘッダ X-My-Custom-Header があり、かつ、EICARファイルを添付した状態でメールを送信する」ケースをシミュレータで試してみます。

まずはシミュレーターで以下の設定を行います。

  • Eメール形式欄では、 Raw を選択する

  • シナリオ欄では、 カスタム を選択する

  • カスタム受信者欄では、任意の受信可能なメールアドレスを指定する

  • メッセージ欄では、カスタムメールヘッダと添付ファイルを含んだMIMEメッセージを入力する

  ここで、添付ファイルを含むMIMEメッセージをゼロから作るのは手間がかかります。

  • カスタムメールヘッダ X-My-Custom-Header を追加

  • 元々ある添付ファイルの値を、EICARテストファイルをbase64エンコードした値へと差し替え

という編集を加えて利用します。

具体的には、以下の内容をメッセージ欄へと入力します。

Subject: reject test
X-My-Custom-Header: hello
Content-Type: multipart/mixed;
    boundary="a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a"

--a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: multipart/alternative;
    boundary="sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a"

--sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Please see the attached file for a list of customers to contact.

--sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<html>
<head></head>
<body>
<h1>Hello!</h1>
</body>
</html>

--sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--

--a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a
Content-Type: text/plain; name="sample.txt"
Content-Description: sample.txt
Content-Disposition: attachment;filename="sample.txt";
    creation-date="Sat, 05 Aug 2017 19:35:36 GMT";
Content-Transfer-Encoding: base64

WDVPIVAlQEFQWzRcUFpYNTQoUF4pN0NDKTd9JEVJQ0FSLVNUQU5EQVJELUFOVElWSVJVUy1URVNULUZJTEUhJEgrSCo=

--a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--

次に、シミュレーターの テストEメールの送信 ボタンをクリックしてメールを送信してみましょう。

すると、このメールの送信時にrejectイベントが発生し、AWS SQSへとイベント情報が連携されます。

AWS SQSのコンソールにて確認すると、以下のスクリーンショットのような

  • eventTypeが Reject

  • カスタムメールヘッダ X-My-Custom-Header が含まれる

というメッセージを受信できました。

  以上より、シミュレーターのシナリオとして用意されていないケースであっても、シミュレーターで試せると分かりました。

 

以下のドキュメントにあるように、シミュレーターでファイルを添付したい場合、ファイルの中身の文字列を base64 エンコードして メッセージ 欄へ設定する必要があるためです。

そこで、AWSドキュメントの をベースに

本サイトの更新情報は、Twitterので発信しています。ご確認ください。

シミュレーターを使用した Amazon SES でのテストメール送信 - Amazon Simple Email Service
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-an-email-from-console.html#send-email-simulator
MIME の使用 - Amazon SES API v2 を使用した raw E メールの送信 - Amazon Simple Email Service
MIMEの使用 | Amazon SES API v2 を使用した raw E メールの送信 - Amazon Simple Email Service
株式会社プレセナ・ストラテジック・パートナーズエンジニア公式アカウント