2007年11月20日 12:00 [Edit]
ドコモもauはとりあえず"da..me."@を受け取れるようにしとくべし
けだし同感なのだけど、これでもメアドを再設定しない人をどうするかという問題は残る。
ドコモもauもいいかげんにメールアドレス設定の仕様を直せ。とりあえずドコモの携帯で確認したが、2007年11月現在のいまも、***.@docomo.ne.jpとか**....***@docomo.ne.jpといったメールアドレスの設定/取得は可能なままである。
というわけで、解決策を考えてみた。
実はRFC2822の規定では、da.me..@docomo.ne.jpというメールアドレスはNGだが、意外なことに"da.me.."@docomo.ne.jpであればOKなのだ。@の前の部分が""でくくられている場合、RFC2822はそれを特別扱いすることになっているので、こんなトリックが使える。
ちなみに、RFC2822に準拠しているかどうかは、こうやってチェックできる。
perlfaq9 - Networking ($Revision: 8539 $) - search.cpan.orgIf you want to just check part a to see that the address is valid according to the mail header standard with a simple regular expression, you can have problems, because there are deliverable addresses that aren't RFC-2822 (the latest mail header standard) compliant, and addresses that aren't deliverable which, are compliant. However, the following will match valid RFC-2822 addresses that do not have comments, folding whitespace, or any other obsolete or non-essential elements. This just matches the address itself:my $atom = qr{[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+}; my $dot_atom = qr{$atom(?:\.$atom)*}; my $quoted = qr{"(?:\\[^\r\n]|[^\\"])*"}; my $local = qr{(?:$dot_atom|$quoted)}; my $domain_lit = qr{\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\]}; my $domain = qr{(?:$dot_atom|$domain_lit)}; my $addr_spec = qr{$local\@$domain};Just match an address against/^${addr_spec}$/to see if it follows the RFC2822 specification.
ちなみに、これをまとめると、
という正規表現になる。ここではコピペしやすいように、textareaタグの中に入れてある。以下、それをJavaScriptで簡易チェック。
ということは、RFC2822準拠のmail addressにしか送付できないMailerでも、"da.me.."@docomo.ne.jpであれば送付できるわけである。もちろん、そのままでは通常のMTA(正確にはlocal agent)は配送してくれないのだが、"da.me.."@docomo.ne.jpをda.me..@docomo.ne.jpに配送するようなlocal agentは簡単に実現できる。例えば、vpopmailであれば、$VPOPMAIL/domains/example.com/.qmail-defaultを
#| /usr/local/vpopmail/bin/vdelivermail '' bounce-no-mailbox | /path/to/unquote
と書き換えた上で、/path/to/unquoteを以下のようにすればよい。
#!/usr/local/bin/perl
use strict;
use warnings;
use File::Basename;
my $DEBUG = 0;
my $name = basename($0);
my $dir = '/path/to/your/logdir';
my $log = "$dir/$name.log";
my $vdelivermail = '/usr/local/vpopmail/bin/vdelivermail';
my $mail = do { local $/; <> };
if ($DEBUG){
local $\ = "\n";
open my $fh, '>>', $log or die "$log:$!";
print $fh '='x72;
print $fh "$_=$ENV{$_}" for sort keys %ENV;
print $fh '-'x72;
print $fh $mail;
close $fh;
}
{
my $default = $ENV{DEFAULT};
if ($default =~ m/\A\"(.*)\"\z/){
my $newdef = $1;
$ENV{$_} =~ s/$default/$newdef/eg for keys %ENV;
}
# | /usr/local/vpopmail/bin/vdelivermail '' bounce-no-mailbox
open my $fh, '|-'
or exec $vdelivermail, '', 'bounce-no-mailbox'
or die "$vdelivermail:$!";
print $fh $mail;
close $fh
}
__END__
で、通常のMUAが"da.me.."@docomo.ne.jpをどう扱うかだが、Mac OS X v10.4 の Mail.app は、文句はいうもののきちんと送付してくれた。
ドコモならびにAUにおかれては、RFC2822準拠をユーザーに促すと同時に、上のような対策をとってみたらいかがだろうか。
Dan the Postmaster of Too Many MXes
追記:
お困りですか?というわけでTB。ちなみにusername+whatever@gmail.comはRFC準拠です。
この記事へのトラックバックURL
コンテキストに依存した"状態"が存在するためです。
ある種の拡張が行われている正規表現実装なら可能かもしれません。
実用機には簡易チェックでOKだと思いますが、なんで言語の標準ライブラリに用意しておいてくれないのだろう...
参考URL
http://www.tt.rim.or.jp/~canada/comp/cgi/tech/mailaddrmatch/