メールアドレスの local-part で使える文字
- ref:ぼんやりと考えたこと
- ref:void GraphicWizardsLair( void ); // メールアドレスに「+」が入っていると登録できないWebサービスがあるのは、sendmailの「Plussed users」やPostfixやGmailの拡張アドレスをカジュアルに使うユーザーを避けようとしているのかも?
- ref:メールアドレスで使用できない文字の種類がわかるサイトを教えてください。 パソコン用アドレス、携帯電話用アドレスで違いがあるなら、それもわかるページをお願いします.. - 人力検索はてな
なんか、RFC に従うとメールアドレスのローカルパートに「+」が使えないと言っているひとがいるみたいなのだが、その根拠がよくわからない。
で、人力検索はてなの回答では RFC3986 を持ち出しているけど、これがまたよくわからない。
そこで肝心なのはuserinfo(ユーザ名)の部分でこちらは
userinfo = *( unreserved / pct-encoded / sub-delims / ”:” )
となっています。それぞれ
unreserved(URIに含むことが認められていて予約されていない文字
a?zA?Z 0?9 -._~
sub-delims
”!$&’(/*+,;=
pct-encoded
%20” は 2 進オクテット ”00100000” (ABNF: %x20) についてのパーセントエンコーディングであり、US-ASCII のスペース文字 (SP) に対応している。
pct-encodedは%数値と書くことによって様々な文字種を使う形式の為一般的にメールアドレスではあまり用いられません
また、sub-delimsはそれぞれの記号が文字以外のURI 中の他のデータから区別可能である区切り文字の集合を提供するという機能を持っていますので利用するにはパーセントエンコーディングする等の処置が必要になります(2.2章)
userinfo 副構成要素の中に見つけられる最初のコロン (”:”) 文字の後にいかなるデータも明文として表示すべきでない (3.2章)との事なので:はuserinfoの最後にしか付けることができません
チルダ (”~”) に対応するオクテットは、古い URI 処理実装によってしばしば ”%7E” としてエンコードされる(2.4章)
なぜ、ABNF でわざわざ sub-delims が OK と書いてあるのに sub-delims を使うときはパーセントエンコードしないといけないのだろう。てか、この 2.2 節に書いてあることはデータを表すのに、予約文字集合にある文字を使う必要があるなら、その文字を適切にパーセントエンコードしないといけないという話で、
<a href="mailto:foo%2fbar@example.com">foo/bar@example.com</a>
と書いた場合に表されるメールアドレスは
foo%2fbar@example.com
じゃなくて、
foo/bar@example.com
なのではないかなぁ。
というか、そもそも mailto スキームでメールアドレスの部分が
[ userinfo "@" ] host [ ":" port ]
になるというのが完全に間違っている。メールアドレスで local-part を省略したり、port を指定してどうするんだ。以下、RFC3986 から適当に抜粋。
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty authority = [ userinfo "@" ] host [ ":" port ] path-abempty = *( "/" segment ) path-absolute = "/" [ segment-nz *( "/" segment ) ] path-rootless = segment-nz *( "/" segment ) path-empty = 0<pchar> segment = *pchar segment-nz = 1*pchar segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) ; non-zero-length segment without any colon ":" pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
もしメールアドレスの部分が authority ならその前には「//」がないといけないわけで、この場合、メールアドレスの構成要素は path-rootless になるはず。