ヘッダ情報は FML::Header クラスのオブジェクトに収納されています。 なお FML::Header は Mail::Header を継承しているので、 Mail::Header のメソッドは何でも利用可能です。
デフォルトではタグはつきません。 また fml8 では、 タグを sprintf などで使われる形式(strftime(3) を参照)で指定することになっています。
[/var/spool/ml/elena/config.cf] # タグをつけるルールを追加 article_header_rewrite_rules += rewrite_article_subject_tag # タグの数字を7桁へ設定 article_subject_tag = [$ml_name:%05d]
fml8 ではタグを sprintf 形式(strftime(3) を参照)で指定することになっています。 たとえば7桁なら %07 などとすればよいだけです。
[/var/spool/ml/elena/config.cf] # タグをつけるルールを追加 article_header_rewrite_rules += rewrite_article_subject_tag # タグの数字を7桁へ設定 article_subject_tag = [$ml_name:%07d]
[/var/spool/ml/elena/config.cf] # タグをつけるルールを追加 article_header_rewrite_rules += rewrite_article_subject_tag article_subject_tag = [$ml_name:%d]
# タグをつけるルールを追加 article_header_rewrite_rules += rewrite_article_subject_tag article_subject_tag = [\U$ml_name\E:%05d](注意: この機能を使う場合には 2002/10/29 以降の snapshot を使ってください)。
Unix 上では、たいてい小文字を使うので、ML名前も小文字でしょう。 だから、普通は何もしなくても小文字のはずですが、 念のため、小文字を強制したいなら、次のようにしてください。
# タグをつけるルールを追加 article_header_rewrite_rules += rewrite_article_subject_tag article_subject_tag = [\L$ml_name\E:%05d](注意: この機能を使う場合には 2002/10/29 以降の snapshot を使ってください)。
[YYYYMMDD] (e.g. [20060101]) のような日付をつけたい場合、 以下のようにして下さい。
$distribute_verify_request_start_hook = q{
use POSIX;
my $yyyymmdd = strftime("[%Y%m%d]", localtime);
$config->set('article_subject_tag', $yyyymmdd);
};
なお strftime(3) では様々なフォーマットが利用できます。
詳しくは Unix マニュアル 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;
};
投稿されたメールの Sender: を X-Sender: にコピーしておきます。 fml8 の配送後、 配送経路上のどこかで Sender: の変更が行われたとしても、 オリジナルの送信者が分かるようにしたいということです。
もっとも Sender: をつけない人もいるので、 そういったメールに対しては対応できません。 Sender: がない場合 From: を X-Sender: にコピーしておくといった条件文も必要かもしれません。
$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);
};ノート: もともとは某MLで遊び心で始めた話が元ネタです。
ようするにメールヘッダの値を強制指定します。
$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
にしてください。Copyright (C) 1993-2025 Ken'ichi Fukamachi mail:< fukachan at fml.org >