メール送信認証技術である Sender Policy Framework と、伝統的な MTA レベルでのメール転送の相性が悪い件。
SPF を普及させるための提案(2) に従って、メール転送時に MAIL FROM を書き換え、エラーメールについては転送せずにローカルスプールに残すことに。
使う道具は procmail。設定ファイル procmailrc (5) の文法が非人間的であまり好きではないんだが、ま、こういうメールローカル配送で細工するには便利な道具だ。エラーメールの置き場所は ~/bounce にして、フォーマットは MH にしておこう。これなら手動で再送するのも簡単だし。
~/.procmailrcSENDMAIL="/usr/libexec/sendmail/sendmail"
:0
* ^Return-Path: (<>|MAILER-DAEMON@)
bounce/.
:0
! 転送先アドレス
cron 等が /usr/bin/mail を使って送信するメールにも DomainKeys 署名を行うために、Postfix の pickup メーラに content_filter を設定し dkfilter_out にメールを渡すようにしてある。転送時には DomainKeys 署名を付けるとまずいため、procmail からは Postfix に含まれる sendmail (1) ではなく、FreeBSD システム標準の sendmail (8) (/usr/libexec/sendmail/sendmail) を呼び出すように設定。
postfix の master.cf に、TCP/10026 でローカルホストからのみ接続を受け付ける Postfix の smtpd メーラを上げるように書いておき、sendmail (8) は TCP/10026 にメールを渡すように設定。具体的には submit.mc ファイルから cf を使って /etc/mail/submit.cf を作っておく。
/etc/mail/submit.mc
divert(0)dnl
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.submit.mc,v 1.1 2003/10/19 00:03:1
3 gshapiro Exp $')
define(`confCF_VERSION', `Submit')dnl
define(`__OSTYPE__',`')dnl dirty hack to keep proto.m4 from complaining
define(`_USE_DECNET_SYNTAX_', `1')dnl support DECnet
define(`confTIME_ZONE', `USE_TZ')dnl
define(`confDONT_INIT_GROUPS', `True')dnl
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 10026')dnl
dnl
MASQUERADE_AS(`issei.org')dnl
FEATURE(`masquerade_envelope')dnl
dnl
dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
FEATURE(`msp', `[127.0.0.1]')dnl
今気づいたけど、FreeBSD 標準の submit.mc コピーして手を加えているのでバージョンIDとかそのままだね。ホントは変えて、きちんとバージョン管理した方が良い。そのうち設定ファイルまとめて subversion リポジトリに突っ込んでおこう。
実際に設定してみると、送信者認証技術に関しては、まだこなれていないね。今回は自前でコードを書かずにあり合わせの道具で環境揃えたとはいえ、Postfix, Sendmail, Procmail と組み合わせて使っており、さらに dkfilter, libspf などの外部プログラムも利用している。個人でやるなら良いけど、仕事で入れてくれと言われたら後々のメンテナンスを考えて躊躇せざるをえない。
未だに DNS サーバのホスティングサービスでも、TXT レコードの登録はできませんというトコロが多いし。規格的な枠組みは揃ったから、後は時間の問題だと思うけど。
あと SPF でメール転送時に MAIL FROM を書き換えるルールとして
SRS (Sender Rewriting Scheme) が提案されている。これはメール多段転送への対応も考えられており理論的には良いんだが、実際には面倒がって
SPF を普及させるための提案(2)程度で落ち着きそうな気がしてる。