各プログラミング言語別のメールアドレス検証方法

メールアドレスの形式はRFC-5321と5322、さらにRFC822やRFC-5891などで規定されています。この仕様にあったメールアドレスの形式になっているかどうか検証するのは、かなり複雑です。簡易的に正規表現を使ったものも見られますが、すり抜けてしまう(または正しいのにエラーになってしまう)メールアドレスも多いでしょう。

そこで外部のライブラリや、プログラミング言語公式に提供されている機能を使って検証を行うのが便利です。今回は各プログラミング言語別に、そうしたライブラリや手法を紹介します。

Java

Javaには2つの方法があるようです。

InternetAddressはRFC822の規定に沿ってチェックを行っています。また、あくまでもメールアドレスとしての形式なので Personal Name <user@host.domain> のような文字列でも通過します。

C#

C#では System.Net.Mail.MailAddress を使って検証が可能です。 new System.Net.Mail.MailAddress(email) のようにしてインスタンスを作成時に FormatException が発生するとフォーマットエラーと判断できます。

MailAddress クラス (System.Net.Mail) | Microsoft Docs

PHP

PHPには filter_var 関数が用意されています。この関数の2つ目の引数として FILTER_VALIDATE_EMAIL を指定するとメールアドレスの検証が行えます。

PHP: filter_var - Manual

Python

Pythonではライブラリとして email-validator · PyPI が開発されています。2015年の公開から現在まで継続的に開発が行われているので、正規表現で検証するのに比べると安心感が高そうです。DNS検証も行ってくれる機能があり、より精度の高い検証も行えます。

もう1つのライブラリとしてpyIsEmail · PyPIもあります。

Ruby

Ruby(というよりRuby on Rails)に対応したメールアドレス検証ライブラリがemail_validatorです。RFC-2822、5321、3696に則って開発されています。

Node.js

Node.js向けにはいくつかのライブラリがありますが、一番人気があるのはemail-addresses - npmになります。RFC-5322、6532、6854に則って開発されています。

まとめ

DNSを検証したり、実際にサーバーへ接続することで検証精度をあげられますが、ユーザー登録時などにインタラクティブに行うのは難しいでしょう。届かないリスクはありつつも、まずメールアドレスのフォーマットとして正しいかどうかを検証するのが基本かと思います。

メールアドレスを正規表現レベルで検証するのはとても複雑ですし、日本語ドメインまで含めると実質的に不可能ではないでしょうか。ぜひライブラリを活用してください。