2011年12月19日

[postfix-jp: 4029] Re:複数RCPTコマンド時の挙動について

荻野です。

石原 said the following on 11/12/19 10:52:
> destination_recipient_limit = 1
> とすることにより複数RCPT TOがある場合、1つの宛先につき1メールずつ送信することは出来ました。

これは送信するときに1メールずつ送信することになります。

> しかし、1メール毎にRCPT TOのアドレスをToヘッダに設定することが出来ずに苦戦しています。
> 前提として、受け取るメールにはToヘッダは設定されてきておりません。
>
> main.cfに
> smtpd_recipient_restrictions = check_recipient_access
> regexp:/etc/postfix/prepend_rcpt_to
> ,permit_mynetworks
> ,reject_unauth_destination
>
> prepend_rcpt_toに
> /(.*)/ PREPEND To: $1
>
> のように設定すれば、RCPT TOのアドレスをToヘッダに設定することが出来るのですが、
> 全てのメールに全てのRCPT TOのアドレスがToヘッダに設定されてしまいます。

これは smtpd の設定なので受信するときの設定です。受信時に To: ヘッダを付
けてしまえば、その後で一通ずつ送信してもみんなおんなじになってしまいます。

しかし、Postfix で置換などを行えるのは smtpd_xxxx_restrictions など受信
時しかないと思いますので、結論としては単独の Postfix ではできないと思わ
れます。


> 解決法やヒントになるものでも構いませんので、
> ご存知の方がいらっしゃいましたらご教授願えますでしょうか。

Postfix をポート番号などで分けて2段構えにし、最初の Postfix では
destination_recipient_limit で1通ずつとして relay_host で2段目の
Postfix に渡し、2段目の Postfix で prepend_rcpt_to でヘッダを追加しては
どうでしょうか。

別案としては master.cf の smtp に -o content_filter=rcptto2header:dummy
をつけて smtp 経由で受信したものを全部 rcptto2header に送り込み、
rcptto2header は書き換えを行ったものを sendmail コマンドで配送依頼すると
いう手があります。今回のお話は prepend_rcpt_to で書き換えられる範囲(例
えば To: は最初は存在しないなど)ですが、配送と書き換えを分離したり、書
き換えに柔軟性を持たせようとすれば、こちらがすっきりするように思います。
(もし何らかのスクリプトが書ければ、ですが)

こちらについては、
http://www.postfix-jp.info/trans-2.3/jhtml/FILTER_README.html
等を参照してください。


準備:書き換えを実行するユーザ XXX を作成しておきます。

master.cf: smtp ポートの標準の smtpd に設定する例
smtp inet n - - - - smtpd
-o content_filter=rcptto2header:dummy
rcptto2header unix - n n - 10 pipe
flags=q user=XXX
argv=/usr/local/sbin/rcptto2header ${sender} ${recipient}

master.cf: 別に 10025 ポートに立てる例
10025 inet n - - - - smtpd
-o content_filter=rcptto2header:dummy
-o smtpd_client_restrictions=permit_mynetworks,reject
rcptto2header unix - n n - 10 pipe
flags=q user=XXX
argv=/usr/local/sbin/rcptto2header ${sender} ${recipient}

main.cf: rcptto2header に渡すときに宛先毎にメールを分ける(これはスクリ
プトが手抜きだからで、スクリプト側で複数の宛先を処理することもできるかも
しれませんが、こちらの方がシンプルかと。
rcptto2header_destination_recipient_limit=1


/usr/local/sbin/rcptto2header の例:なるべく単純に、特に中間ファイルを作
成しないように書いた方が無難です。To: が無いのが確実なら awk の部分は
cat だけでもうまくいくかも知れません。
このスクリプトは手抜きなので、To: が付いていて、かつ複数行に渡っていると
きはうまく動きません。
#!/bin/sh
# Usage: rcptto2header sender recipient

sender="$1"; recipient="$2"
{
# To: ヘッダを出力
echo "To: $recipient"

# 元のメールの To: ヘッダ以外を出力
awk '
BEGIN { inheader=1 }
inheader==1 && $1 !~ /^[Tt][Oo]:/ { print }
/^$/ { inheader=0 }
inheader==0 { print }
'
} | /usr/sbin/sendmail -G -i -f "$sender" -- "$recipient"

exit $?

--
荻野 充 (おぎの みつる) ... 「萩(はぎ)」にあらず
Key fingerprint = 7F26 5414 1805 F31B 1617 10B7 C117 07AE 1691 9BD1

_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list


投稿者 xml-rpc : 2011年12月19日 23:43
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/107824
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。