メールアドレスの形式について調べる機会があったため、RFC5321(日本語訳)を見たところ、
動詞と引数の値(例えば RCPT コマンドにおける "TO:" または "to:" や拡張名キーワード)は大文字・小文字を区別されないが、メールボックスの local-part の指定が唯一の例外である(SMTP 拡張は大文字・小文字を区別する要素を明示的に規定してもよい)。つまり、コマンド動詞、メールボックスの local-part 以外の引数、自由形式のテキストは、その意味に影響を与えることなく、大文字、小文字、または大文字・小文字の任意の組み合わせで符号化されてよい(MAY)ということである。メールボックスの local-part は大文字・小文字を区別されなければならない(MUST)。したがって SMTP 実装は、メールボックスの local-part の大文字・小文字が保持されるよう注意しなければならない(MUST)。具体的にいうと、一部のホストにとってユーザー "smith" はユーザー "Smith" と異なるということである。しかしながら、メールボックスの local-part の大文字・小文字の区別の濫用は相互運用性を妨げるため、推奨されない。メールボックスのドメインは通常の DNS 規則にしたがい、大文字・小文字を区別しない。
とありました。
また、
「仕様としては、"区別する"だけど、メールボックスの運用実態としては"区別しない"運用になっている」
との記載もありました。
SendGridでどうなるか調べたところ、それらしいドキュメントが見当たりませんでした。
そこで今回、受信者のメールアドレスの大文字小文字がどうなるか試してみました。
目次
環境
前回の記事同様、Pythonスクリプトで試したため、以下の環境となります。
試したソースコード
SendGridのSMTPサーバを使って、以下のような 'send' 関数を用意しました。
後は呼び出し元で、受信者のメールアドレスを変えてみればよいとしました。
import os import smtplib from email.mime.text import MIMEText from smtpapi import SMTPAPIHeader from dotenv import load_dotenv load_dotenv() def send(to_email): server = create_smtp_server() from_email = os.environ['FROM_EMAIL'] to_email = [to_email] body = 'hello' message = MIMEText(body) message['From'] = from_email message['TO'] = ','.join(to_email) message['Subject'] = 'メールドロップテスト' server.sendmail(from_email, to_email, message.as_string()) server.quit() def create_smtp_server(): host = 'smtp.sendgrid.net' port = 587 user = 'apikey' password = os.environ['SENDGRID_API_KEY'] server = smtplib.SMTP(host, port) server.starttls() server.login(user, password) return server if __name__ == '__main__': main()
正常に届くメールについて
存在するメールアドレスをすべて大文字で指定した FOO@EXAMPLE.COM
宛にメールを送信したところ、
- Delivered-To: foo@example.com
- To: FOO@example.com
となっていました。
また、 Foo@Example.com
と大文字小文字を混ぜたところ、
- Delivered-To: foo@example.com
- To: Foo@example.com
となっていました。
正常に届くメールはドメイン部分は全て小文字になるようです。
Event Webhookで受け取った時の値について
次に、存在しないメールアドレス notfound@example.com
がBounceした時、SendGridのEvent Webhookではどのような値が返ってくるかを調べてみました。
メールアドレスに対し
- すべて大文字
- すべて小文字
- 大文字小文字混在
の条件でそれぞれ送信したところ、
{status=5.1.1, smtp-id=xxx, ip=149.72.71.211, tls=0.0, reason=550 5.1.1 <notfound@example.com>: Recipient address rejected: User unknown in virtual mailbox table, email=notfound@example.com, sg_event_id=xxx, event=bounce, sg_message_id=xxx, timestamp=1.617030019E9, type=bounce}
のようにすべて小文字 ( notfound@example.com
) となっていました。
まとめ
上記より、現時点のSendGridでは
- 届くメール
- ユーザ部分はそのまま・ドメイン部分は小文字化にて、メールが送信される
- 届かないメール
- Event Webhookのメールアドレスは、すべて小文字化される
のようです。
ソースコード
Githubに上げました。 lettercase
の中が今回のファイルです。
https://github.com/thinkAmi-sandbox/sendgrid_event_webhook-sample