<!--
   $FML: recipe.filter.attachments.sgml,v 1.3 2004/12/09 03:55:18 fukachan Exp $
-->


<qandaentry>

<question>
<para>
危ない添付ファイルがついてきたメールは拒否する HOOK
</para>
</question>

<answer>

<para>
fml8 は、あらかじめ入力されたメッセージを解析し、鎖状の Mail::Message 
オブジェクトの形で持っています。そこで、MIME/Multipart の各部分のヘッ
ダを取り出して、正規表現で順に確認すればよいだけです。
</para>

<para>
HOOK でなんとかする/ごまかす例は次の通りです。
どちらの例でも、マッチした場合、stop_this_process() 命令で、
これ以上の処理を止めています。
また、この例では何もエラーメッセージを返そうとしていないため、
結果として、このメッセージは無視されて終りになっています。
</para>

<para>
返事をしてあげたいなら、 reply_message() で、何か返事を返してあげてく
ださい…が、たぶんウィルスとかなので、返事してあげなくてもいいとおもふ。
</para>

<para>
.exe など特定のファイル拡張子にマッチするか？を調べる例。
に昔の fml8 (2004/12/08 以前)なら、こんな感じ。
<screen>
$distribute_verify_request_start_hook = q{
    my $msg = $curproc->incoming_message() || undef;
    for (my $m = $msg; $m ; $m = $m->{ next } ) {
	my $hs = $m->message_fields() || '';
	if ($hs =~ /filename=.*\.(com|vbs|vbe|wsh|wse|js|exe|doc|rtf)/o) {
	    $curproc->log("attachment \.$1 found");
	    $curproc->stop_this_process();
	}
    }
};
</screen>
2004/12/08 以降なら、こんなかんじ。
<screen>
$distribute_verify_request_start_hook = q{
    my $msg  = $curproc->incoming_message() || undef;
    my $list = $msg->message_chain_as_array_ref();
    for my $m (@$list) {
	my $hs = $m->message_fields() || '';
	if ($hs =~ /filename=.*\.(com|vbs|vbe|wsh|wse|js|exe|doc|rtf)/o) {
	    $curproc->log("[new] attachment \.$1 found");
	    $curproc->stop_this_process();
	}
    }
};
</screen>
</para>

<para>
別の解としては、
<screen>
Content-Disposition: attachment;
</screen>
という表示になることを前提に、これを引っかけるという案もあります。
<screen>
$distribute_verify_request_start_hook = q{
    my $msg = $curproc->incoming_message() || undef;
    for (my $m = $msg; $m ; $m = $m->{ next } ) {
	my $hs = $m->message_fields() || '';
	if ($hs =~ /Content-Disposition:.*attachment;/o) {
	    $curproc->log("attachment \.$1 found");
	    $curproc->stop_this_process();
	}
    }
};
</screen>
2004/12/08 以降なら、こんなかんじ。
<screen>
$distribute_verify_request_start_hook = q{
    my $msg  = $curproc->incoming_message() || undef;
    my $list = $msg->message_chain_as_array_ref();
    for my $m (@$list) {
	my $hs = $m->message_fields() || '';
	if ($hs =~ /Content-Disposition:.*attachment;/o) {
	    $curproc->log("[new] attachment \.$1 found");
	    $curproc->stop_this_process();
	}
    }
};
</screen>
</para>

</answer>

</qandaentry>


