kanachi-blog

notionでの公開記事をastro-notion-blogを使って公開するよ

メールアドレスの

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)
  1. 無条件で使える: 81文字
    1. アルファベット(大文字 & 小文字)52文字 → A~Z, a~z
    2. 数字10文字 → 0~9
    3. 記号19文字 → ! # $ % & ' * + - / = ? ^ _ ` { | } ~
  2. 先頭と末尾以外、かつ連続しなければ使える(末尾=@の直前)
    1. ドット → .
  3. ダブルクオートでくくると使える
    1. 無条件で使えるもの81文字
    2. ドット(連続使用可) → .
    3. 記号10文字 → ( ) , : ; < > @ [ ]
  4. さらにダブルクオート中では、“\”を前につけたquoted-pairの形式であれば、加えて次のASCII文字を使用できる。
    • \ " スペース タブ
文字種制限(domain)
  • アルファベット(大文字 & 小文字)と数字または「-」(先頭はラテン文字または数字)から成るサブドメインを「.」でつないだ形式
  • [ ]”でくくられたIPアドレス(例: [192.0.2.69]
参考

メールプラットフォームの制約

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標準のエラーが表示される可能性があります。

参考