2008年06月03日

fml で quoted-printable なメールを扱うには?

私が使っているメーリングリスト運営用のプログラムに、fml というものがあります。このfml、多機能で非常に良いのですが、使い込むと色々悩ましい部分も出てきます。

今後は、備忘録を兼ねて(そもそもブロードバンド備忘録だし)ここに、その設定についての考察を述べていきたいとおもいます。

さて、前置きはこれくらいにして、今回は、Content-Transfer-Encoding: quoted-printable の話。

事の発端は、HTML メールを禁止(HTML 部分を削除してしまって配信する)したMLの運用中に、文字化けメールが発生したことです。送信者のメーラーは、Windows Vista に付属の windows mail。最初は何故化けたのか、さっぱり分かりませんでした。同じメーラーを使っても、文字化けしない人もいましたから。

その後の調べで、どうやら文字化けしたメールはHTMLを含んだ multipart なメールだと言うことが分かりました。multipart メールの各パートのうち、text/plain なパートだけを抽出して配信する際、どうもMIMEのエンコード情報が欠落しているようです。

本来は、fml を改修してもらって不具合を解消するのがスジなのでしょうけれども、作者の深町さんはご病気の様子。ならば、と当面なんとかするために作ったのが次の HOOK です。

$START_HOOK =q#
if($Envelope{'Body'}=~/^\s*Content-Transfer-Encoding:\s*quoted-printable/im){
require ("mimer.pl");
$Envelope{'Body'} = &bodydecode($Envelope{'Body'},"qp");
&DEFINE_FIELD_FORCED("x-strip-mime","quoted-printable");
}else{
&DEFINE_FIELD_FORCED("x-strip-mime","pass");
}
#;

とりあえず、Body の中に、Content-Transfer-Encoding: quoted-printable と書かれた部分を見つけたら、mimer.pl を呼び出して、強制的にデコードしてしまっています。
で、一応、HOOK が判定したよ、という証拠を、x-strip-mime というヘッダに書き込んでいます。

うちの環境ではとりあえず、この表記で動きました。

たぶん、エラー処理とか、もっと考えなければならないとは思うのですが、取り急ぎの対策ならこれでもなんとかなるかなぁ、と思います。

もっと良い方法があれば、コメント欄ででも教えてください。

投稿者 DON : 00:26 | コメント (3) | トラックバック

fml で quoted-printable なメールを扱うには?その2

昨日は、mimer.pl を利用した方法を書きました。

ただ、mimer.pl を使用した場合、変換時にエラーが発生すると、標準出力にエラーを吐き出します。エラーは、= の文字の後に、想定される半角英数字2文字が続かない場合に出るようです。

multipart メールは、基本的にどんなパートが存在しても良いわけですから(メールソフトが許す限りですが)、本文の異なるエンコード部分に = が書かれていないとも限りません。
そこで、エラー処理を止めて、可能な限りデコードするよう変更してみました。

$START_HOOK =q#
if($Envelope{'Body'}=~/^\s*Content-Transfer-Encoding:\s*quoted-printable/im){
$Envelope{'Body'} =~ s/=\r\n//g;
$Envelope{'Body'} =~ s/=\n//g;
$Envelope{'Body'} =~ s/=\r//g;
$Envelope{'Body'} =~ s/=([0-9A-Fa-f]{2})/pack("C",hex($1))/ge;
&DEFINE_FIELD_FORCED("x-strip-mime","quoted-printable");
}else{
&DEFINE_FIELD_FORCED("x-strip-mime","pass");
}

#;

これでもうちでは無事動いていますので、たぶん大丈夫でしょう。

投稿者 DON : 23:21 | コメント (3) | トラックバック

2008年07月27日

fml の迷惑メール対策

メーリングリストで最近、迷惑メールが特に増えてきたので、迷惑メールを排除する方法を色々試しています。

とりあえず、手っ取り早く目を付けたのが、Date の項目。国内のメーリングリストの場合、まず日本時間以外のメールは来ませんから、+0900 以外の時間を持ったメール、或いはGMT の記載があるメールを排除する方法で対処することを考えました。

&DEFINE_FIELD_PAT_TO_REJECT("Date", '/\+[0-9][0-8][0-9][0-9]|\-[0-9][0-9][0-9][0
-9]|\-\-|\+[0-9]+\-[0-9]+|gmt/i');

ところが、この方法でも排除できない変な date を持ったメールもあるんですよね。
とりあえず、さらなる対策を思案中…

投稿者 DON : 15:18 | コメント (3) | トラックバック