メールSaaS機能を比較

Posted on 2021/10/06

ToC

なぜか、送信エラーになるメッセージがある

これまで、Amazon SES (Simple Email Service) にてメール送信を行っていた処理をマルチクラウド化対応で、 新たにAlibaba DirectMailも活用してメール送信してみようと考え検証を行っていました。
そうしたところ、SESではメール送信できていたメッセージが、DirectMailではAPIのエラーとなってしまうことがわかりました。
エラーメッセージの内容から、送信メールに設定しているSubjectの文字数が130文字もあった(そもそも、ちょっと長すぎじゃないか?)ことが エラーの原因だったのです。
折角の機会なので、調べた結果を小ネタとして記事にまとめておきます。

Line Length Limitsの仕様

インターネットメッセージのフォーマット仕様は、インターネットに関する標準化団体であるIETF(The Internet Engineering Task Force)が、 RFC5322として規定しています。RFC822の標準をアップデートした形でいわゆる電子メールのフォーマットとルールについて 各種の規定がなされています。
一般的なメールサーバー、SESDirectMailといったSaaSサービスもこうしたルールに従った形で実装されています。

そして、RFC5322の中の 2.1.1. Line Length Limits の中で、下記のように規定されています。

  • 998文字以下 が必須 (MUST)
  • CRLFを除いて78文字以下 が推奨 (SHOULD)

この内容は、メールメッセージの Subject Body ともに適用される内容のようです。
「メールの1行が長すぎると読みにくいのでエチケットとして、78文字で改行して作成しましょう」といった内容をどこかで聞いたことがあるのですが、
当にIETFが定めたエチケット(Should)だったとは、、、初めて知りました。

SESとDirectMailの仕様と実装は…

SESDirectMail の仕様と実装について調べてみました。
あくまで、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 SESAlibaba DirectMail
1バイト文字32768100
2バイト文字6272100

SESの1バイト文字の制限数は、ITエンジニアの好物の2の累乗でしたが、2バイト文字「あ」のカウント数はどういうことなんだろうなぁ。


参照