WorkMailで受信したメールメッセージをAmazon WorkMail Message Flow APIで取得できるのか試してみた

結論:「受信済み」の場合はできませんでした
2022.02.07

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、Amazon WorkMailで受信したメールメッセージを、Amazon WorkMail Message Flow APIで取得できるのか試してみました。

Amazon WorkMail Message Flow APIとは?

WorkMailで受信済みのメッセージを取得できないか探していたところ、Amazon WorkMail Message Flow APIなるものを見つけました。

このうちGetRawMessageContentを使用すれば、メッセージIDを指定することによりメッセージが取得できそうな雰囲気です。

GET /messages/messageId HTTP/1.1

そこでAmazon WorkMail Message Flow APIのGetRawMessageContentを使用して、受信済みのメッセージを取得できないか確認してみました。

やってみた

SESからのメール送信

まずSESからメールを送信します。下記のAWS CLIコマンドを使用します。

メール送信を実行すると、メッセージIDが取得できました。

$ fromAddress=<送信元としたいSESで認証済みのアドレス>
$ toAddress=<送信先としたいWorkMailユーザーのアドレス>
$ aws sesv2 send-email \
  --from-email-address ${fromAddress} \
  --destination ToAddresses=${toAddress} \
  --content '{"Simple":{"Subject":{"Data":"テスト件名"},"Body":{"Text":{"Data":"テスト本文"}}}}'

{
    "MessageId": "0106017ed494dd70-0d2346b7-75db-4779-8e74-002a907bdd22-000000"
}

送信先のWorkMailユーザーのメールボックスを見ると、メールが受信できていますね。

メールのヘッダーを見ると同じメッセージIDが付与されているのが確認できます。

WorkMailからのメールコンテンツ取得

それではWorkMailからGetRawMessageContentを使用して先程のメールの取得を試してみます。

下記のAWS CLIコマンドを使用します。

しかしResourceNotFoundExceptionとなってしまい、取得できません。

$ messageId="0106017ed494dd70-0d2346b7-75db-4779-8e74-002a907bdd22-000000"
$ aws workmailmessageflow get-raw-message-content \
  --message-id ${messageId} \
  --region us-east-1 \
  get-raw-message-outfile

An error occurred (ResourceNotFoundException) when calling the GetRawMessageContent operation: None

なぜ取得できないのか

下記ドキュメントを見ると、そもそもの使い方が間違っていたようでした。

ou only use the Amazon WorkMail Message Flow API to access email messages in transit. You can only access the messages within 24 hours of being sent or received. To programmatically access messages in a user’s mailbox, use one of the other protocols supported by Amazon WorkMail, such as IMAP or Exchange Web Services (EWS).

Amazon WorkMail Message Flow API は、送信中の E メールメッセージにアクセスする場合のみ使用します。メッセージは、送受信されてから 24 時間以内にのみアクセス可能です。ユーザーのメールボックスのメッセージにプログラムを使ってアクセスするには、IMAP や Exchange Web Services(EWS) など、Amazon WorkMail でサポートされている他のプロトコルの 1 つを使用します。

そもそもAmazon WorkMail Message Flow APIはその名前の通り、受信済み/送信済みのメッセージではなく、転送中(in transit)のメッセージを取得するためのAPIのようでした。

ではその転送中のメッセージにどのようにアクセスするかと言うと、WorkMailではOrganizationの設定でInbound Rule/Outbound Ruleにより転送中のメッセージをソースにしてLambda関数を実行できます。下記はその設定画面です。

この設定により転送中のメッセージをGetRawMessageContentで取得したり、PutRawMessageContentで更新したり出来るようです。

おわりに

下記の前エントリの方法だと取得できるのはメールメッセージの件名のみで本文は取得できなかったため、今回のGetRawMessageContentであれば簡単に取得できるのでは?と思ったのですが一筋縄では行きませんでした。

参考

以上