ヘッダ情報は FML::Header クラスのオブジェクトに収納されています。 なお FML::Header は Mail::Header を継承しているので、 Mail::Header のメソッドは何でも利用可能です。
デフォルトではタグはつきません。 fml8 ではタグを sprintf 形式で指定することになっています。
[/var/spool/ml/elena/config.cf] article_subject_tag = [$ml_name:%05d]
fml8 ではタグを sprintf 形式で指定することになっています。 たとえば7桁なら %07 などとすればよいだけです。
[/var/spool/ml/elena/config.cf] article_subject_tag = [$ml_name:%07d]
[/var/spool/ml/elena/config.cf] article_subject_tag = [$ml_name:%d]
article_subject_tag = [\U$ml_name\E:%05d](注意: この機能を使う場合には 2002/10/29 以降の snapshot を使ってください)。
Unix 上では、たいてい小文字を使うので、ML名前も小文字でしょう。 だから、普通は何もしなくても小文字のはずですが、 念のため、小文字を強制したいなら、つぎのようにしてください。
article_subject_tag = [\L$ml_name\E:%05d](注意: この機能を使う場合には 2002/10/29 以降の snapshot を使ってください)。
YYYYMMDD (20060101) のような日付をつけたいなら、以下のようにして下さい。
$distribute_verify_request_start_hook = q{ use POSIX; my $yyyymmdd = strftime("[%Y%m%d]", localtime); $config->set('article_subject_tag', $yyyymmdd); };なお strftime(3) を使うところを編集すればフォーマットはいろいろかえる ことができます。
次の HOOK を config.cf の最後(=cutより後)に書いて下さい。
$article_header_rewrite_end_hook = q{ my $ml = $config->{ article_post_address }; $header->replace('Reply-To', $ml); };なおヘッダ書き換えルールに以下の命令を追加しても同じことが出来ます。
article_header_rewrite_rules += rewrite_reply_to_enforce_article_post_address
次の HOOK を config.cf の最後(=cutより後)に書いて下さい。
$article_header_rewrite_end_hook = q{ my $cred = $curproc->credential(); my $sender = $cred->sender(); $header->replace('Reply-To', $sender); };
次の HOOK を config.cf の最後(=cutより後)に書いて下さい。
$article_header_rewrite_end_hook = q{ my $ml = $config->{ article_post_address }; my $cred = $curproc->credential(); my $sender = $cred->sender(); $header->replace('Reply-To', "$ml, $sender"); };
次の HOOK を config.cf の最後(=cutより後)に書いて下さい。
$article_header_rewrite_end_hook = q{ my $ml = $config->{ article_post_address }; my $cred = $curproc->credential(); my $sender = $cred->sender(); if ($cred->is_member($sender)) { $curproc->log("member"); $header->replace('Reply-To', "$ml, $sender"); } };
だいぶ複雑ですが HOOK で実現できます。 次の HOOK を config.cf の最後(=cutより後)に書いて下さい。
$article_header_rewrite_end_hook = q{ my $to = $header->get('to'); my $cc = $header->get('cc'); my $addr = "$to, $cc"; use Mail::Address; my (@addrlist) = Mail::Address->parse($addr); my $reply_to = ''; for my $a (@addrlist) { my $_addr = $a->address; if ($curproc->is_fml8_managed_address($_addr)) { $reply_to .= $reply_to ? ", $_addr" : $_addr; } } $header->replace('Reply-To', $reply_to) if $reply_to; };
$article_header_rewrite_end_hook = q{ my $header = $curproc->article_message_header(); $header->add('X-Sender', $header->get('Sender')); };
X-Received: へコピーした後で Received: を消します。
$article_header_rewrite_end_hook = q{ my $header = $curproc->article_message_header(); $header->add('X-Received', $header->get('Received')); $header->delete('Received'); };
config.cf で
article_header_rewrite_rules -= rewrite_reply_toとしてください。
デフォルトでは Reply-To: のないメールのヘッダに対し「Reply-To: 投稿用 アドレス」が追加されます。これは article_header_rewrite_rules にある rewrite_reply_to 命令によります。よって、これをルールから削除してしま えば Reply-To: に対する書き換えルールが無効となるというわけです。
前レシピと同じです。
To: と Cc: は元々素通しです。そのため config.cf で
article_header_rewrite_rules -= rewrite_reply_toとするだけで十分です。
[/var/spool/ml/elena/config.cf] $article_header_rewrite_end_hook = q{ my $header = $curproc->article_message_header(); # Message-Id を生成 (この例は適当です) my $ml_name = $config->{ ml_name }; my $ml_domain = $config->{ ml_domain }; my $new_id = sprintf("%s-%d\@%s", $ml_name, $$, $ml_domain); # X-Message-Id にオリジナルの Message-Id をバックアップしておく $header->add('X-Message-Id', $header->get('Message-Id')); # Message-Id を入れ換える $header->replace('Message-Id', $new_id); };
ようするにメールヘッダの値を強制指定します。
$article_header_rewrite_end_hook = q{ my $header = $curproc->article_message_header(); $header->replace('X-ML-Info', "oresama id"); };
未実装です。 現在の fml8 でも、実際には
outgoing_mail_header_reply_to = アドレスでレポートメールの Reply-To: を指定できるのですが、 これは今の実装が間違っていますね _o_
現状の fml8 では、次のような HOOK で実現するしかありません。
$article_header_rewrite_end_hook = q{ my $header = $curproc->article_message_header(); my (@tags) = $header->tags(); # 通したいヘッダフィールドを定義する my (@valid_tags) = qw(to from reply-to subject date message-id); for my $tag (@tags) { my $valid = 0; SCAN: for my $v (@valid_tags) { if ($tag =~ /^$v$/i) { $valid = 1; last SCAN; } } unless ($valid) { $header->delete($tag); } } };
記事への返事にも関わらず In-Reply-To: も References: もないメールがあります。 一つには、スレッド関係が分からないので見づらいという問題があります。 二つには、通常そういったメールはないので普通のメールではなく SPAM などの 類ではないかという可能性です。
Subject に返事の印( Re: など)がなく、In-Reply-To: または References: ヘッダがないなら拒否する HOOK です。
$article_post_verify_request_end_hook = q{ my $header = $curproc->incoming_message_header(); my $subject = $header->get('subject') || ''; my $in_reply_to = $header->get("In-Reply-To") || ''; my $references = $header->get("References") || ''; my $_subject = new Mail::Message::Subject $subject; if ($_subject->has_reply_tag()) { unless ($in_reply_to || $references) { $curproc->log("reject invalid reply message"); $curproc->stop_this_process(); $curproc->policy_reject_this_message(); } } };拒否した旨のメールを送信者へ送っています。 もしエラーメッセージを送信者に返さず単に無視するだけでいいなら policy_reject_this_message を policy_ignore_this_message にしてください。
author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.
For questions about FML, e-mail <fml-bugs@fml.org>.