Re: Gnus+BBDBでUnparsable addre ssエラー

Katsumi Yamaoka <[email protected]> Tue, 07 Oct 2008 08:04:29 +0900
Newsgroups gmane.emacs.gnus.semi.japanese
Organization Emacsen advocacy group
Message-ID <[email protected]>
>>>>> In [semi-gnus-ja : No.20989] 中治さん wrote:
> 楽天からのメールの From が

> From: [楽●天]トラベルニュース <[email protected]>

> なのですが、Emacs + Gnus + BBDB (いずれも CVS HEAD) の組み合わせで、この
> From だけ、以下のエラーになります。「[」があるのがイカンらしいです。

> Debugger entered--Lisp error: (wrong-type-argument listp "(Unparsable address
>   bbdb-rfc822-addresses("[\x697d\x25cf\x5929]\x30c8\x30e9\x30d9\x30eb\x30cb\x
[...]

> bbdb-rfc822-addresses() は bbdb-snarf.el で定義されているのですが、

> (defun bbdb-rfc822-addresses ( addrline &optional ignore-errors)
[...]
>              (parsed (rfc822-addresses thisaddr)))

> この (rfc822-addresses thisaddr) 部分で [ が引っかかって、
> emacs/lisp/mail/rfc822.el の rfc822-bad-address() に至り、Unparsable
> addressになってるようです。

> さて、このケースでは、emacs/lisp/mail/rfc822.el は悪くなく、つまり、楽天
> のFromの設定がrfc822違反ということになるでしょうか?

その From がこんなふうにエンコードされて届いたのであれば、

From: =?ISO-2022-JP?B?WxskQjNaIXxFNxsoQl0bJEIlSCVpJVklayVLJWUhPCU5GyhC?=
 <[email protected]>

RFC822 的には問題無くて、そういうものをデコードした結果を RFC822
用の関数に与えるのが間違いなのではないかと思います。とりあえずの
対策としては、(rfc822-addresses thisaddr) の代わりに

(mapcar 'cadr (mail-extract-address-components thisaddr t))

とでもすれば、"[楽●天]" に関してだけはエラーを起こさないように
なるでしょう。

しかし、デコードした結果にはどんな文字列が現れるかわかりません。
極端な話、こんな悪さもできるわけです:

To: =?US-ASCII?B?PG90aGVyQGV4YW1wbGUuY29tLmludmFsaWQ+LA==?=
 <[email protected]>
↓
To: <[email protected]>, <[email protected]>

根本的な解は、おそらく BBDB がデコードした文字列を必要とする最後
の場面まで、受信したままの生データを扱うようにすることでしょう。
言うは易し、ですが。
-- 
山岡