新党のホームページを見てメールアドレスのチェック方法について考えた

新政党「たちあがれ日本」のホームページが話題になっていたので私も見てみた。そして、メーリングリストの受付フォーム中に記述されたメールアドレスのチェック用のJavaScriptが気になった。以下に引用する。


if (!node.match(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/)){
alert("e-mailアドレスをご確認ください。");
return false;
}
https://www.tachiagare.jp/mail.php

メールアドレスをチェックするための正規表現は、ネット上でたびたび問題視される定番ネタだか、その論点は、RFC(RFC2822やRFC5322)に対して準拠しているかどうかだと思う。例えばこれ(404 Blog Not Found:「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ)。
しかし、現実にアプリケーション上でメールアドレスを妥当性をチェックする場合は、RFCに対する準拠性を調べてもあまり意味はない。むしろ、アプリケーションが前提とするMTAやメールなどで本当に使えるメールアドレスかどうかをチェックするべきだろう。
たとえば、RFC2822やRFC5322では、ドメインの記述にドメインリテラル(domain-literal)が使えることになっている。ドメインリテラルとは以下のように、メールアドレスのドメインIPアドレスで記述する方法だ(IPアドレスは例示用のもの)。

tokumaru@[192.0.2.0]

ドメインリテラルは、先に参照した小飼弾氏の正規表現にも取り入れられている。
ここで、ドメインリテラルについて、現実的にどの程度利用できるものか、自分のメールサーバードメインリテラル形式のメールアドレスを登録して試してみた。Becky!Postfixの組み合わせでは正常に利用できたが、以下の環境からは送信できなかった。

このようなシステム側の対応状況に加えて、ドメインリテラル形式のメールアドレスを実際に利用しているユーザはほとんどいないと推測されることから、ドメインリテラル形式を利用させないことに異論を唱える人は少ないだろう。

思うに、メールアドレスチェック用の正規表現の問題がよく炎上するのは、問題の定義があいまいだからだろう。メールサービスの提供者(GoogleYahoo!のような)であれば、自社サービスで提供するメールアドレスの制限を自分で決めることができる。例えば、ローカルパート(@より前の部分)を小文字の英数字に限定しますと宣言してもよいわけだ。例えば、以下のように。

/\A[a-z0-9]+\@hogemail\.com\z/

上記はRFCにも適合しているので問題ないわけだが、かつての携帯電話会社のように、RFC違反のメールアドレスまで認めてしまうと、相互運用性等の点で問題となる。このような内容も含めて要件を検討することになる。
一方、Webサービスメーリングリストなどで、ユーザの(既存の)メールアドレスを入力してもらう場合は、一般的に利用されているメールアドレスをできるだけカバーしたくなるだろう。RFC2822/RFC5322では、連続するドットやローカルパートの先頭・末尾でのドットを許容していないが、中にはそのようなメールアドレスを利用しているユーザもいるので、正規表現としては緩めに記述するのはアリだろう。

そもそも、既存のメールアドレスを入力してもらう場合にチェックすべき要件は、主に次の3点だと考える。

  • そのメールアドレスが確かに存在していること
  • 入力されたメールアドレスがMTAなどで利用できること
  • データベースに登録可能な文字数(バイト数)であること

1に関しては、実際にメールを送信してみないと分からない。2と3に関しては、上記必要条件をカバーする十分条件としての要件をアプリケーション側で規定することは認められるだろう。たとえば、ドメインリテラルを許容するMTAを使っているが、アプリケーション上は禁止することなどだ。ローカルパートについても、RFC上認められている記号のなかで、使用頻度の低い「!」や「?」、「~」などを禁止する…というより、記号は「-」と「_」、「.」だけ認めることは広く行われているし、それはWebサービスの提供側が決めることだ。

さて、そのような視点から「たちあがれ日本」のメーリングリスト登録用のフォームを見てみると、ローカルパート部のドット「.」が一切禁止されている。すなわち、次のようなメールアドレスは拒絶される。

hiroshi.tokumaru@example.jp

ローカルパートの先頭・末尾のドットや、連続するドットを禁止することはRFCの規定通りだが、ドットそのものを禁止するのは斬新だ。実際に困る人も多いだろう。手元の名刺入れの名刺をざっと調べたところ、ローカルパートにドットを用いている企業は意外に多い。数割というレベルで存在するように見受けた。
ローカルパートのドットを拒絶する合理的な理由は思いつかないので、おそらくこれはバグだろう。

まとめ

メールアドレスをチェックするための正規表現は、しばしばRFC準拠という観点から語られるが、実用的には、アプリケーション要件としてメールアドレスの要件を定めるべきで、その結果がRFCから若干外れることはあり得る。新規のメールアドレスを設定する際にRFC違反のメールアドレスを許容するのはよろしくないが、既存のメールアドレスを入力してもらう場合は、RFC違反のメールアドレスを許容せざるを得ない場合も出てくる。
たちあがれ日本」の場合は、ローカルパートのドットを禁止しているが、おそらく仕様ではなく、バグであると推測される。

おまけ

ドメインリテラル形式のメールアドレスを試したことのある人は少ないと思うので、テスト用のメールアドレスをしばらくの期間テスト用に公開します。以下のメールアドレスに送信してみてください。

test@[115.146.17.185]