今まで僕は、ネット上にあるいわゆる「メールアドレスチェックの正規表現」でメールアドレスのチェック・抽出を行っていたんだけど、それだといろいろ問題が起きてしまい、ちゃんとRFCに基づいてチェックしようということで調べてみました。
まずどのRFCを読むか。RFC 5321 (Simple Mail Transfer Protocol)またはRFC 5322 (Internet Message Format)が最新のようです。下記ではRFC5322の記述を元に読んでいきます。なお、RFC内の記載順ではなく、解釈の順番で引用します。
メールアドレスについては「3.4.1. Addr-Spec Specification」から記載されています。
addr-spec = local-part "@" domain local-part = dot-atom / quoted-string / obs-local-part domain = dot-atom / domain-literal / obs-domain
上から順番に解読すると下記のようになります。
「local-part」と「domain」に含まれる「dot-atom」は「3.2.3. Atom」セクションで以下のように定義されています。
dot-atom = [CFWS] dot-atom-text [CFWS] dot-atom-text = 1*atext *("." 1*atext) atext = ALPHA / DIGIT / ; Printable US-ASCII "!" / "#" / ; characters not including "$" / "%" / ; specials. Used for atoms. "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" specials = "(" / ")" / ; Special characters that do "<" / ">" / ; not appear in atext "[" / "]" / ":" / ";" / "@" / "\" / "," / "." / DQUOTE
かつてdocomoとAUのメールアドレスでドットの連続したアドレスが設定できましたが、これがRFC違反と騒がれていた所以は「1*atext *("." 1*atext)」だからのようですね。ちなみに現在はdocomoもAUも新たに設定されるメールアドレスではドットを連続させることはできないようです。ドットの連続がアットマークの前に来る僕のメアドは貴重品です(笑)
「dot-atom」に含まれる「CFWS」は「3.2.2. Folding White Space and Comments」および「4.4. Obsolete Addressing」セクションで以下のように定義されています。
CFWS = (1*([FWS] comment) [FWS]) / FWS FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space obs-FWS = 1*WSP *(CRLF 1*WSP) comment = "(" *([FWS] ccontent) [FWS] ")" ccontent = ctext / quoted-pair / comment ctext = %d33-39 / ; Printable US-ASCII %d42-91 / ; characters not including %d93-126 / ; "(", ")", or "\" obs-ctext obs-ctext = obs-NO-WS-CTL obs-NO-WS-CTL = %d1-8 / ; US-ASCII control %d11 / ; characters that do not %d12 / ; include the carriage %d14-31 / ; return, line feed, and %d127 ; white space characters quoted-pair = ("\" (VCHAR / WSP)) / obs-qp obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR)
とりあえずここまでで読み取れるのは、「local-part」「domain」の前後、つまり「@」とメールアドレスの前後にはコメントやスペースなどを入れられるということですね。しかもコメントはネスト出来るという面倒な構造です。「dot-atom-text ( this is comment ) @ ana-kutsu.com」こーんなメールアドレスもRFC的にはOKということですね。
それと「quoted-pair」についてですが、面倒に定義されていますが結局は「\」に続けばASCII文字すべてを置くことができることになっていますね。
ところでこの「CFWS」ですが、「3.4. Address Specification」で述べられている通り、「@」の前後にコメントやスペースを入れるべきではない(SHOULD NOT)と書かれています。なので使わない方がいいですし、実際問題これをMTAが正確に考慮してくれるとは期待しない方がいいでしょう。
続いて、「local-part」に含まれる「quoted-string」は「3.2.4. Quoted Strings」および「4.4. Obsolete Addressing」セクションで以下のように定義されています。
quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS] qcontent = qtext / quoted-pair qtext = %d33 / ; Printable US-ASCII %d35-91 / ; characters not including %d93-126 / ; "\" or the quote character obs-qtext obs-qtext = obs-NO-WS-CTL
えーと、つまりダブルクォーテーションに囲まれいれば事実上すべてのASCII文字を置けるわけですねぇ。ドットが連続してもいいし、「\」でエスケープすれば改行コードとかもOKなワケです。
一応RFCでは「quoted-string」は使用すべきではない(SHOULD NOT)となっていますが、プログラムで直接MTAからメールを受け取るとき(.forward でメールを取り込むプログラムを動かすときなど)、まれに「quoted-string」をもったメールアドレスで配送されるので完全には無視できないですね。どうやらpostfixの設定によっては、docomoのドットの連続するメールアドレスのメールを転送するときなどにダブルクォーテーションを追加するようです。(一回これでハマりました)
「local-part」の3つ目、「obs-local-part」は「4.4. Obsolete Addressing」セクションで以下のように定義されています。
obs-local-part = word *("." word) word = atom / quoted-string atom = [CFWS] 1*atext [CFWS]
このあたりで古いRFCまでカバーできるようになっているようです。上記定義によると「dot.".."@ana-kutsu.com」のようなメールアドレスもOKということになりますね。
ふぅ、これで「local-part」の定義終わり。
「domain」に含まれる「domain-literal」は最初に挙げた「3.4.1. Addr-Spec Specification」および「4.4. Obsolete Addressing」セクションで以下のように定義されています。
domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] dtext = %d33-90 / ; Printable US-ASCII %d94-126 / ; characters not including obs-dtext ; "[", "]", or "\" obs-dtext = obs-NO-WS-CTL / quoted-pair
「domain」に含まれる「obs-domain」は「4.4. Obsolete Addressing」セクションで以下のように定義されています。
obs-domain = atom *("." atom)
これで全部定義読んだかなぁ。
「domain」も自由度はありますが、名前解決可能なFQDN(RFC 5321)か、「[」と「]」でくくられたIPアドレスじゃないとダメなようです。このへんはWikipedia情報です。
RFC 5321により長さが、「local-part」は64オクテット、「domain」は255オクテット、「addr-spec」全体で256オクテットに制限されています。
2011/08/11 22:15:27 | Trackbacks (0) | Comments (0)
URL : https://www.ana-kutsu.com/mt/mt-tb.cgi/588