📨

メールアドレス形式チェック

2024/04/22に公開

前書き

こんにちは!
オアシステクノロジーズの山本です。

皆さんの構築しているシステムでは、メールアドレスのチェックってどうやってますか?
そのメールアドレスの形式って、クライアントと合意がとれている?
そのメールアドレスの形式って、メールサーバーが受け付けてくれる?

メールアドレスのチェックは@email 付けとけばOK! と思われている方に向けて少し深堀できればと思います。
※かなり、ざっくりとした内容となっていますが。参考になれば幸いです

メールアドレスの形式ってどうやって決まっているのか

RFCってやつで統一を図りましょうとしています。できるだけこれにあわせて欲しい構築していきましょうという流れですね。
https://ja.wikipedia.org/wiki/Request_for_Comments

RFCの内メールアドレス周りについては
https://tex2e.github.io/rfc-translater/html/rfc5321.html

メールアドレスの形式チェック

このメールアドレスの形式チェックって、意外と難しいんですよね。
この記事の投稿タイミングとしては、RFC5321とRFC5322に準拠するのがベターだと思いますが、
愚直に準拠しようとすると、正規表現がとんでもなく長くなってしまいます。
※参考サイトを探すもこれだという正解がみあたらない。。

私は主に、java(spring)でシステムを構築しているのですが、
よく使われるライブラリ(org.hibernate.validator.constraints.Email等)
でメールアドレスの形式チェックをする方法があるので、それを使っていることが多いです。

これがRFC2822 に準拠となっています。
メールアドレスのチェックは@email 付けとけばOKという方は基本的にRFC2822準拠となっているかと思います。
※使用ライブラリの仕様は要確認でお願いします。。。

メールアドレス形式(RFC2822)に準拠していないメールアドレスの例

RFC2822に準拠していないメールアドレスの例をいくつか紹介します。

1.「() <> : ; , @ \ "」のいずれかがローカル部に含まれる
test@hoge@test.hoge

2."."が2個以上連続する場合がローカル部に含まれる
hoge..test@test.hoge

3."@"直前に"."が入る
hoge.@test.hoge

等です。これらは、RFC2822に準拠していないメールアドレスとなり、入力チェックでエラーとなります。

ですが

一部のキャリアメールアドレスは、RFC2822に準拠していないメールアドレスを許容している場合があります。

例えば、ドコモメールアドレスの場合、RFC2822に準拠していないメールアドレスも使用されています。
投稿時点で、使用を推奨しないとしており、今後減少傾向にありますが、
現在でも使用されているメールアドレスがあるため、注意が必要です。
https://www.docomo.ne.jp/service/docomo_mail/rfc_add/

ユーザー目線だと、使えるメールアドレスなのに、エラーになった!ということが起きてしまうので、
クライアントとの合意、ユーザーへ使用できる形式についての説明できるよう整備しておくのが良いです。

メールサーバー(SES)の受付可能なメールアドレスの形式

Amazon Web Services (AWS) が提供する「Simple Email Service」を使用する場合、RFC5321に準拠することを推奨しています。
※RFC2822に準拠しているメールアドレスは、受付可能となっているようです。

裏技的には
RFC違反のメールアドレスでもダブルクォート(")で囲むと、RFC準拠メールアドレスとして送信することができます。
※一部を除くので注意

入力を受け付けたものの、実際にメール送信時に送れなかった!という事態を避けるためにも、
使用するメールサーバーの仕様も含めて確認しておくことをおすすめします。

後書き

今回は、メールアドレスの形式チェックについて書いてみました。参考になれば幸いです

Discussion