ToC
なぜか、送信エラーになるメッセージがある
これまで、Amazon SES (Simple Email Service)
にてメール送信を行っていた処理をマルチクラウド化対応で、
新たにAlibaba DirectMail
も活用してメール送信してみようと考え検証を行っていました。
そうしたところ、SES
ではメール送信できていたメッセージが、DirectMail
ではAPIのエラーとなってしまうことがわかりました。
エラーメッセージの内容から、送信メールに設定しているSubject
の文字数が130文字もあった(そもそも、ちょっと長すぎじゃないか?)ことが
エラーの原因だったのです。
折角の機会なので、調べた結果を小ネタとして記事にまとめておきます。
Line Length Limitsの仕様
インターネットメッセージのフォーマット仕様は、インターネットに関する標準化団体であるIETF(The Internet Engineering Task Force)が、
RFC5322として規定しています。RFC822の標準をアップデートした形でいわゆる電子メールのフォーマットとルールについて
各種の規定がなされています。
一般的なメールサーバー、SES
や DirectMail
といったSaaSサービスもこうしたルールに従った形で実装されています。
そして、RFC5322の中の 2.1.1. Line Length Limits の中で、下記のように規定されています。
998文字
以下 が必須 (MUST)- CRLFを除いて
78文字
以下 が推奨 (SHOULD)
この内容は、メールメッセージの Subject
Body
ともに適用される内容のようです。
「メールの1行が長すぎると読みにくいのでエチケットとして、78文字で改行して作成しましょう」といった内容をどこかで聞いたことがあるのですが、
当にIETFが定めたエチケット(Should)だったとは、、、初めて知りました。
SESとDirectMailの仕様と実装は…
SES
と DirectMail
の仕様と実装について調べてみました。
あくまで、2021/10時点で確認した内容のため、各社のサービス仕様、実装仕様の変更の可能性はあります。
Amazon SES
ディベロッパーガイド中には、RFC5322準拠との記載がありましたが、メール送信可能なSubject
の長さについて、
個別の仕様として定められている記述はドキュメント上からは見つけることができませんでした。
そこで、実際にメールを送信してみました。UTF-8でエンコードして、send_email
のAPIで送信します。
2バイト文字だと、ちょっと少なくなるみたいです。
'a'を 32768 回をSubjectに設定
送信成功
'a'を 32769 回をSubjectに設定
An error occurred (InvalidParameterValue) when calling the SendEmail operation: Header too long: 'Subject'.
'あ'を 6272 回をSubjectに設定
送信成功
'あ'を 6273 回をSubjectに設定
An error occurred (InvalidParameterValue) when calling the SendEmail operation: Header too long: 'Subject'.
Alibaba DirectMail
API Referenceの中で、InvalidSubject.Malformedエラーの条件として「Subject
は100文字」と規定されていました。
DirectMail
は、76文字よりは少し文字数が多めです。
こちらも、実際にSingleSendMail
のAPIを利用して、メール送信して実装を確認してみます。
'a'を 100 回をSubjectに設定
送信成功
'a'を 101 回をSubjectに設定
HTTP Status: 400 Error:InvalidSubject.Malformed The specified subject is invalid. It must not exceed 100 characters. RequestID: ABCDABCD-ABCD-1234-5678-123456789010
'あ'を 100 回をSubjectに設定
送信成功
'あ'を 101 回をSubjectに設定
HTTP Status: 400 Error:InvalidSubject.Malformed The specified subject is invalid. It must not exceed 100 characters. RequestID: ABCDABCD-ABCD-1234-5678-123456789012
検証の結果
メール送信APIでのSubject
の最大設定可能文字数は、以下のとおりです。
どちらのサービスも当然の如く、RFC5322に準拠したつくりになっていました。
そもそも、メール送信をシステム的に行ったとて、このメールを受信して内容を確認するのは人間なので、長過ぎるSubject
はちょっと困ります。
そういった意味でも、RFC5322が、MustとShouldというおすすめ規定になっていることも頷けます。
Amazon SES | Alibaba DirectMail | |
---|---|---|
1バイト文字 | 32768 | 100 |
2バイト文字 | 6272 | 100 |
SES
の1バイト文字の制限数は、ITエンジニアの好物の2の累乗でしたが、2バイト文字「あ」のカウント数はどういうことなんだろうなぁ。