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

最終更新 9 か月前

役に立ちましたか?

背景

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
株式会社プレセナ・ストラテジック・パートナーズエンジニア公式アカウント