<!-- -*- mode:text coding:euc-jp -*-
 $FML: recipes.header.sgml,v 1.7 2008/08/18 02:23:59 fukachan Exp $
-->

<qandaset>


<qandaentry>

<question>
<para>
Subject: に [elena:00100] のようなタグをつける
</para>
</question>

<answer>
<para>
デフォルトではタグはつきません。
また &fml8; では、
タグを
sprintf などで使われる形式(strftime(3) を参照)で指定することになっています。
<screen>
[/var/spool/ml/elena/config.cf]

# タグをつけるルールを追加
article_header_rewrite_rules    +=      rewrite_article_subject_tag

# タグの数字を7桁へ設定
article_subject_tag = [$ml_name:%05d]
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Subject: [elena:00100] の数字部分(00100)の桁数を変える
</para>
</question>

<answer>
<para>
&fml8; ではタグを
sprintf 形式(strftime(3) を参照)で指定することになっています。
たとえば７桁なら %07 などとすればよいだけです。
<screen>
[/var/spool/ml/elena/config.cf]

# タグをつけるルールを追加
article_header_rewrite_rules    +=      rewrite_article_subject_tag

# タグの数字を7桁へ設定
article_subject_tag = [$ml_name:%07d]
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Subject: のタグの数字(00100)の0パディングをなくしたい
(strftime(3) を参照)。
</para>
</question>

<answer>
<para>

<screen>
[/var/spool/ml/elena/config.cf]

# タグをつけるルールを追加
article_header_rewrite_rules    +=      rewrite_article_subject_tag


article_subject_tag = [$ml_name:%d]
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Subject: のタグを大文字にしたい。
</para>
</question>

<answer>
<para>
<screen>
# タグをつけるルールを追加
article_header_rewrite_rules    +=      rewrite_article_subject_tag

article_subject_tag = [\U$ml_name\E:%05d]
</screen>
(注意: この機能を使う場合には 2002/10/29 以降の snapshot を使ってください)。 
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Subject: のタグを小文字にしたい
</para>
</question>

<answer>
<para>
Unix 上では、たいてい小文字を使うので、ＭＬ名前も小文字でしょう。
だから、普通は何もしなくても小文字のはずですが、
念のため、小文字を強制したいなら、次のようにしてください。
<screen>
# タグをつけるルールを追加
article_header_rewrite_rules    +=      rewrite_article_subject_tag

article_subject_tag = [\L$ml_name\E:%05d]
</screen>
(注意: この機能を使う場合には 2002/10/29 以降の snapshot を使ってください)。 
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Subject に [日付] というタグをつけたい。
</para>
</question>

<answer>
<para>
[YYYYMMDD] (e.g. [20060101]) のような日付をつけたい場合、
以下のようにして下さい。
<screen>
$distribute_verify_request_start_hook = q{

        use POSIX; 
        my $yyyymmdd = strftime("[%Y%m%d]", localtime);
        $config->set('article_subject_tag', $yyyymmdd);

};
</screen>
なお strftime(3) では様々なフォーマットが利用できます。
詳しくは Unix マニュアル strftime(3) を参照してください。
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Reply-To: を常に投稿用アドレスに強制変更する。
</para>
</question>

<answer>
<para>
次の HOOK を config.cf の最後(=cut 行より下側)に書いて下さい。
<screen>
$article_header_rewrite_end_hook = q{
    my $ml = $config->{ article_post_address };
    $header->replace('Reply-To', $ml);
};
</screen>
なおヘッダ書き換えルールに以下の命令を追加しても同じことが出来ます。
<screen>
article_header_rewrite_rules += rewrite_reply_to_enforce_article_post_address
</screen>
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Reply-To: を送信者に設定する。
</para>
</question>

<answer>
<para>
次の HOOK を config.cf の最後(=cut 行より下側)に書いて下さい。
<screen>
$article_header_rewrite_end_hook = q{
    my $cred   = $curproc->credential();
    my $sender = $cred->sender();

    $header->replace('Reply-To', $sender);
};
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Reply-To: を「送信者 ＋ ＭＬ」に設定する。
</para>
</question>

<answer>
<para>
次の HOOK を config.cf の最後(=cut 行より下側)に書いて下さい。
<screen>
$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");
};
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
ＭＬメンバーからの投稿であれば、
Reply-To: を「送信者＋ＭＬ」に設定する。
</para>
</question>

<answer>
<para>
次の HOOK を config.cf の最後(=cut 行より下側)に書いて下さい。
<screen>
$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");
    }
};
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
To: と Cc: の中にある
&fml8; が管理しているＭＬのアドレスだけを
Reply-To: に設定する。
</para>
</question>

<answer>
<para>
説明しにくい動作ですが、
ようするに記事から自分の知らないアドレスを削除するということです。
</para>

<para>
ヘッダに書いてある全てのアドレスへ返信する人が多いので、
こういった動作が有用であることがあります。
</para>

<para>
設定は、だいぶ複雑ですが HOOK だけで実現できます。
次の HOOK を config.cf の最後(=cut 行より下側)に書いて下さい。
<screen>
$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;
};
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
不要なヘッダフィールド X-Face: を消す
</para>
</question>

<answer>
<para>
<screen>
unsafe_header_fields  += x-face
</screen>
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Sender: を X-Sender: にコピーする。
</para>
</question>

<answer>
<para>

<para>
投稿されたメールの Sender: を X-Sender: にコピーしておきます。
&fml8; の配送後、
配送経路上のどこかで Sender: の変更が行われたとしても、
オリジナルの送信者が分かるようにしたいということです。
</para>

<para>
もっとも Sender: をつけない人もいるので、
そういったメールに対しては対応できません。
Sender: がない場合
From: を X-Sender: にコピーしておくといった条件文も必要かもしれません。
</para>

<para>
<screen>
$article_header_rewrite_end_hook = q{
   my $header   = $curproc->article_message_header();
   $header->add('X-Sender', $header->get('Sender'));
};
</screen>
</para>

</answer>

</qandaentry>


<qandaentry>

<question>
<para>
Received: を X-Received: へ移動する。
</para>
</question>

<answer>
<para>
X-Received: へコピーした後で Received: を消します。
<screen>
$article_header_rewrite_end_hook = q{
   my $header   = $curproc->article_message_header();
   $header->add('X-Received', $header->get('Received'));
   $header->delete('Received');
};
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
元のメールに Reply-To: がなければ、そのままにしたい。
</para>
</question>

<answer>
<para>
config.cf で
<screen>
article_header_rewrite_rules    -=      rewrite_reply_to
</screen>
としてください。
</para>

<para>
デフォルトでは
Reply-To: のないメールヘッダに対し
「Reply-To: 投稿用アドレス」が追加されます。
これは
$article_header_rewrite_rules にある 
rewrite_reply_to
命令によります。
よって、これをルールから削除してしまえば
「Reply-To: に対する書き換えルールが無効となる」
というわけです。
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
To: Cc: Reply-To: を全部そのまま素通しにする。
</para>
</question>

<answer>
<para>
前レシピと同じです。
</para>

<para>
To: と Cc: は元々すどおしです。
そのため config.cf で
<screen>
article_header_rewrite_rules    -=      rewrite_reply_to
</screen>
とするだけで十分です。
</para>

</answer>

</qandaentry>


<qandaentry>

<question>
<para>
記事の Message-ID: は元の値のまま通したい。
</para>
</question>

<answer>
<para>
素通しがデフォルトの挙動ですので、なにもする必要はありません。
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
記事に ML 独自の Message-ID: をつけたい
</para>
</question>

<answer>
<para>
特殊な需要ですが、可能です。
</para>

<para>

<screen>
[/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);
};
</screen>
</para>

<para>
ノート: もともとは某ＭＬで遊び心で始めた話が元ネタです。
</para>

</answer>

</qandaentry>


<qandaentry>

<question>
<para>
X-ML-Info: の内容を指定する。
</para>
</question>

<answer>
<para>
ようするにメールヘッダの値を強制指定します。
<screen>
$article_header_rewrite_end_hook = q{
        my $header = $curproc->article_message_header();
        $header->replace('X-ML-Info', "oresama id");
};
</screen>

</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
レポートメールの Reply-To: を指定する。
</para>
</question>

<answer>
<para>
未実装です。
現在の &fml8; でも
<screen>
outgoing_mail_header_reply_to = アドレス
</screen>
変数で、
レポートメールの Reply-To: を指定できるのですが、
これは今の実装が間違っていますね _o_
</para>

<para>
(これは使わないでください)
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
特定のヘッダだけを通したい
</para>
</question>

<answer>
<para>
現状の &fml8; では、次のような HOOK で実現するしかありません。
<screen>

    $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);
            }
        }
    };

</screen>
設定変数で制御したいほど、需要があるでしょうか？
あれば考えますが…
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
In-Reply-To: か References: を強制したい。
</para>
</question>

<answer>
<para>
記事への返信であるにも関わらず
In-Reply-To: も References: もないメールを送ってくる人が現実にいます。
これ(スレッド情報の削除)をされると、いくつかの問題が生じます。
</para>

<para>
第一に、メール間のスレッド関係が分からなくなるので見づらいです。
第二に、通常そういったメールは無い(少ない)ので、
そういったメールは
「普通のメール」
ではなく 
「SPAM メール」
などの可能性が高いとみなされます。
</para>

<para>
以下の例は
Subject に返事の印( Re: など)がなく、
In-Reply-To: または References: ヘッダがないなら拒否する HOOK です。
<screen>
    $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();
	    }
	}
    };
</screen>
拒否した旨のメールを送信者へ送っています。
もしエラーメッセージを送信者に返さず単に無視するだけでいいなら
policy_reject_this_message
を
policy_ignore_this_message
にしてください。
</para>
</answer>

</qandaentry>


<qandaentry>

<question>
<para>
そもそも、あらゆるヘッダ書き換え処理を止めたい
</para>
</question>

<answer>
<para>
use_article_header_rewrite を no にして書き換え機能全体を止めて下さい。
<screen>
[/var/spool/ml/elena/config.cf]

use_article_header_rewrite = no
</screen>

</para>
</answer>

</qandaentry>



</qandaset>
