📖
2024-1-29現在の情報です。
背景
メールアドレスのバリデーションルールを仕様として明記していなかったので調査して策定する
前提
- 制約ゆるい順: RFC→サービスのバリデーション→Emailプラットフォーム
- RFCに準拠する: Emailの仕様を決めている組織に従うべき論
- ただ実際に利用できるメールサービス上のバリデーションはもっと厳しい制約がある
- RFCに完全に則ったバリデーションを行うのは難しく、それより厳しく簡略化した制約を設けるのがWebサービスだと一般的
最新のRFC仕様(メールアドレスのプロトコル)
前提
メールアドレスは以下の構造で定義されています。
local-part@domain
文字数制限
それぞれ最大文字数が定義されています。
- local-part: 最大64文字
- domain: 最大253文字(RFCでは、255文字と書かれているが、別途識別に文字が2文字分必要なので)
- local-part@domain 全体: 最大254文字 (RFCでは、256文字と書かれているが別途識別に文字が2文字必要なので)
- local-partもdomainの定義的にはnullが許容されてない(1文字以上)
文字種制限(local-part)
-
無条件で使える: 81文字
- アルファベット(大文字 & 小文字)52文字 → A~Z, a~z
- 数字10文字 → 0~9
-
記号19文字 →
!
#
$
%
&
'
*
+
-
/
=
?
^
_
`
{
|
}
~
-
先頭と末尾以外、かつ連続しなければ使える(末尾=
@
の直前)-
ドット →
.
-
ドット →
-
ダブルクオートでくくると使える
- 無条件で使えるもの81文字
-
ドット(連続使用可) →
.
-
記号10文字 →
(
)
,
:
;
<
>
@
[
]
-
さらにダブルクオート中では、“
\
”を前につけたquoted-pairの形式であれば、加えて次のASCII文字を使用できる。-
\
"
スペース
タブ
-
文字種制限(domain)
-
アルファベット(大文字 & 小文字)と数字または「
-
」(先頭はラテン文字または数字)から成るサブドメインを「.
」でつないだ形式 -
“
[
]
”でくくられたIPアドレス(例:[192.0.2.69]
)
参考
- https://www.rfc-editor.org/rfc/pdfrfc/rfc5322.txt.pdf (則るべき最新のRFC)
- https://qiita.com/yoshitake_1201/items/40268332cd23f67c504c(RFCの調べ方やRFCとは何かを噛み砕いて説明してる)
メールプラットフォームの制約
https://qiita.com/ykhirao/items/59c4de2bddc610c2e3a3#webメールサービスに準拠する
input[type=email]の制約
https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
正規表現
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
- ダブルクオートは考慮していない
- バックスラッシュは考慮している
メールアドレスのバリデーション案
上記の内容をもとにメールアドレスの制約を考える。
方針
- 各種メールプラットフォームで作成されたメールを受け付けられるゆるい制約にすること
- RFCの制約よりは厳しい制約にすること
- バリデーションが複雑にならない程度に簡略化すること
文字数制限
- 全体の最大文字数は254文字
文字種制限
-
local-part:アルファベットと数字と記号
-
記号:
!
#
$
%
&
'
*
+
-
\
/
=
?
^
_
`
{
|
}
~
.
- ダブルクオートは考慮しない:input[type=email]でも考慮されておらず、一般のメールサービスでも本来は使われていないので考慮しない
- バックスラッシュは考慮する:一般のメールサービスでも作成ができない場合が多いが、input[type=email]では考慮されているため
-
記号:
- local-partとdomainの間に@マークが入ること
-
domainはアルファベットと数字または「
-
」(先頭はラテン文字または数字)から成るサブドメインを「.
」でつないだ形式
正規表現
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
- input[type=email]のようなドメイン内のlabel(連続でのドット以外の文字)による文字数制限は細かいRFCに基づく仕様になるので考慮しない
バリデーションのFB方法
要素名 | 具体値 | エラー表示 | 備考 |
---|---|---|---|
メールアドレス |
数値:254 以下 | 254文字以上で入力された場合は、「254文字以下で入力してください」 | |
文字種制限を満たしていない場合は、「正しいメールアドレスの形式で入力してください」 |
- input[type=email]を利用している場合はHTML標準のエラーが表示される可能性があります。
参考
- https://www.rfc-editor.org/rfc/pdfrfc/rfc5322.txt.pdf
- https://qiita.com/ykhirao/items/59c4de2bddc610c2e3a3
- https://qiita.com/yoshitake_1201/items/40268332cd23f67c504c
- https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address