2006年5月22日

[SpamAssassin-JP 242] Re:auto-whitelist のアドレス部分にゴミがある

** SpamAssassin メーリングリスト **
** 注意:このメールへの返信は SpamAssassin-jp へ行きます **

小川です。

久保さん:
>以前実験的にMIMEエンコードをいろいろいじっていたときに、"<メールアドレ
>ス>"まで含めてFrom:行の中身全体がBエンコーディングされてしまったような記

>憶があります。

ん〜さすがにそれはそっち側のバグだと思いたいです。
メールアドレスをエンコードするのが許されるなら、
MUAはMIMEに対応するのが必須ということになってしまいます。
でも、英語圏のMUAが必ずMIME対応するなんて通るわけがないし、
となるとメールアドレスをエンコードするのはまずいんじゃ
ないでしょうか。


舘山さん:
>エンベロープFromで全て取れていれば問題ないんですね...
>(138行で エンベロープFrom の処理して、見つからない場合の処理が今回のケー
>ス)

あらためてよく読んでみました。

その部分は、$self->{'mbox_sep'} にエンベロープFromを入れるための処理で、
138行で、^From\s が見つかればそれをそのまま入れて、
見つからなければ Date: 行と From: 行からエンベロープFromを
なんとかでっちあげるという処理のようです。

# auto-whitelist にはエンベロープじゃなくてFrom:が入るのは
# 知っていたので先に気づけばよかった

肝心の From: を切り出しているのは PerMsgStatus.pm の1524行付近、
if ($getaddr) {
で始まる部分です。
コメントがいっぱい書いてあるように、いろいろ考慮はされていますが
結局は
$result =~ s/^[^<]*?<(.*?)>.*$/$1/;
なので、最初の < を拾ってしまうのは同じです。


とみたさん:
>いや、さすがにそれはナシでしょう。
>
> uba(foo)@example.net
>
>はアリですが。

アリで思い出しました!
RFC822にはモハメド・アリの例がありました。
Muhammed.(I am the greatest) Ali @(the)Vegas.WBA
こんなのもアリで(スペースも入ってる!)、
そこに書いてあるように Muhammed.Ali@xxxxx と解釈されます。
でもこの例、RFC2822ではなくなっている…なぜだろ…


From: を解釈する話、どこか見覚えがあってひっかかっていたのですが、
メーリングリストサーバ fml で同じ問題に当たったようです。

CHANGES.jp:
>2000/11/17
> kern/fml.pl
> module/CPAN/
> modify conv2mailbox() to use Mail::Address module for more
> correctness. apply patches in
> fml-support: 09026, 09027 by OGAWA Kunihiko

どういう議論があってパッチを書いたかもはや思い出せないのですが、
fml のソースを見てみると、CPAN の Mail::Address を使って

use Mail::Address;
($addr) = (Mail::Address->parse($from))[0];

だけで終わっています。

で、これにしたって、名前部分に < > が出てくれば狂います。
たとえば
From: 若い障害
だとすると、ESC を _ で書くと
From: _$Bc32_(B
となりますから、c$$ がアドレスとして拾われてしまいます。
(もっと厳密には丸カッコが不揃いとしてエラーになる)

これが
From: =?ISO-2022-JP?B?GyRCPGMkJD5jMzIbKEI=?=
と書いてあれば何の問題もなく xxx@xxxxx が出てくるので、
やはり私は「デコードが後」説を推したいです。


--
小川邦彦
--
SpamAssassin メーリングリスト
http://mm.apache.jp/mailman/listinfo/spamassassin-jp

投稿者 xml-rpc : 2006年5月22日 03:24
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/39986
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。