今まで僕は、ネット上にあるいわゆる「メールアドレスチェックの正規表現」でメールアドレスのチェック・抽出を行っていたんだけど、それだといろいろ問題が起きてしまい、ちゃんと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