395 文字
2 分
今時のメールアドレス正規表現
概要
- メールアドレス入力フォームの検証に正規表現でチェックしています。
- このたび、メールアドレスの検証に使っている正規表現が書かれている gem にて、メールアドレスの検証ロジックに大幅な変更が入ったので調査してみました。
背景
- きっかけ
- Web アプリケーションのメールアドレスの validation には
email_validatorという gem を使っていました。これが v2 からすごい緩いバリデーションになっていました。email_validator/lib/email_validator.rb at a479ff6bf9305ba7944df459402664fc9d74a339 · K-and-R/email_validator github.com An email validator for Rails. Contribute to K-and-R/email_validator development by creating an account on GitHub.- この gemは300万ダウンロードあります。
- Web アプリケーションのメールアドレスの validation には
- 理由
HackerNoon - read, write and learn about any technology hackernoon.com How hackers start their afternoon. HackerNoon is a free platform with 25k+ contributing writers. 100M+ humans have visited HackerNoon to learn about technology
- タイトルに文句がある方はこの記事へ。
HackerNoon - read, write and learn about any technology hackernoon.com How hackers start their afternoon. HackerNoon is a free platform with 25k+ contributing writers. 100M+ humans have visited HackerNoon to learn about technology
Email address - Wikipedia en.wikipedia.org
- テストケース
email_validator/spec/email_validator_spec.rb at v2.0.0 · K-and-R/email_validator github.com An email validator for Rails. Contribute to K-and-R/email_validator development by creating an account on GitHub.
実運用ではどうするか考える
AWS SES は
test_[email protected]というマルチバイトを含んだメールアドレスは reject される。ASCII 以外の文字列って、ユーザの入力ミスの可能性が 90%以上だろうし。悩ましい。
HTML5 のブラウザ側の正規表現は、もっと厳しい。マルチバイトは許されない。
実際は、v1.6 の
strict_modeオプションを使うのが良いのかなと。email_validator/lib/email_validator.rb at ef9c09161831946c5fb85e4273b2cc2a559cc758 · K-and-R/email_validator github.com An email validator for Rails. Contribute to K-and-R/email_validator development by creating an account on GitHub.
v1.6 の strict な正規表現で怪しいメアドをあぶり出すショートコード
name_validation = "-\\p{L}\\d+._"regex = /\A\s*([#{name_validation}]{1,64})@((?:[-\p{L}\d]+\.)+\p{L}{2,})\s*\z/iUser.all.select {|u| puts u.id unless u.email.match(regex) }URI::MailTo::EMAIL_REGEXPもよさそう。
/\A[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])?)*\z/結論
広く許容する場合は以下の正規表現。
[^\s]+@[^\s]+- 解説:アットマークの直前がホワイトスペース以外かつ、アットマークの直後がホワイトスペース以外。
- 参照:https://github.com/balexand/email_validator/blob/a479ff6bf9305ba7944df459402664fc9d74a339/lib/email_validator.rb#L13
- 注意: 上記のメールアドレスの正規表現では valid だけど、AWS SES や別の MTA で弾かれる場合がある。
- ユーザ登録を優先するか、メールの到達性を優先するかはサービスのポリシー次第で決める。
関連記事
この記事が役に立ったら
GitHub Sponsorsで応援できます


