Postfixバージョン2.3では RFC 3464 に記述されているような配送状態通知 (DSN) のサポートを導入しました。これにより送信者は配送の成功通知もしくは失敗通知の制御ができるようになります。
特に、DSNをサポートすることでeメール送信者は以下のことが特定できるようになります:
どの通知が送られたか: 成功、失敗、遅延、もしくは何もなし。メール配送が遅延したり配送に失敗した場合、Postfixは通常、送信者のみに通知します。
失敗した場合にどの内容が返されたか: メッセージヘッダのみ、もしくはメッセージ全体。
配送状態通知の一部として返されるエンベロープID。これは投函トランザクションを特定しますが、これとメッセージの内容を特定するメッセージIDと混同してはいけません。
DSNサポートの実装に当たってSMTP MAIL FROM および RCPT TO コマンドにパラメータが追加されており、また追加SMTPコマンドパラメータの機能のサブセットを提供する新しいPostfix sendmailコマンドラインオプションも用意されています。
このドキュメントには以下の話題に関する情報があります:
不達メールのレポートと同様、successful DSNレポートの配送は必要以上に内部インフラストラクチャの情報を漏らしてしまう可能性があります。残念ながら、"成功" 通知の要求を許可しないようにするには他のDSN要求も許可しないようにする必要があります。RFCでは機能のサブセットをネゴシエーションで決めるオプションは提供されていません。
これは思ったほど悪いことではありません。リモートから入ってくるメールに対してDSNを無効にしても、DSNをサポートしているリモートの送信者はメールがあなたのPostfixゲートウェイにうまく到達したということは通知されます; 送信者は、配送が成功したというあなたの内部システムからの通知を受け取らないだけなのです。リモートの送信者が失うものはほんのわずかです: 彼らはPostfixが配送の遅延もしくは失敗をどのように報告すべきか指定することはできません。
信頼するクライアントからのDSN要求は許可するがランダムなよそ者からの要求を拒否したいのであれば、smtpd_discard_ehlo_keyword_address_maps 機能を使ってください (全てのクライアントに対してDSNを無効にする方法は以下を参照してください):
/etc/postfix/main.cf: smtpd_discard_ehlo_keyword_address_maps = cidr:/etc/postfix/esmtp_access /etc/postfix/esmtp_access: # Allow DSN requests from local subnet only 192.168.0.0/28 silent-discard 0.0.0.0/0 silent-discard, dsn ::/0 silent-discard, dsn
ネットワークからのDSN要求の利用を全て拒否したいのであれば、smtpd_discard_ehlo_keywords 機能を使ってください:
/etc/postfix/main.cf: smtpd_discard_ehlo_keywords = silent-discard, dsn
PostfixにはDSNサポートのための Sendmail 互換コマンドラインオプションが2つあります。
1つめのオプションは、Postfix sendmail(1) コマンドラインを使って投函されたメールに対してどの通知を送るかを指定します:
$ sendmail -N success,delay,failure ... (これらのうち1つ以上) $ sendmail -N never ... (もしくはこれだけを単独で)
ビルトインデフォルトは "delay,failure" に対応します。
2つめのオプションは、Postfix sendmail(1) コマンドラインを使って投函されたメールに対する配送状態通知で報告されるエンベロープIDを指定します:
$ sendmail -V envelope-id ...
注意: 次のセクションで議論するように、これは古いバージョンのPostfixでのVERPサポートと衝突します。
Postfixバージョン2.3以前では、VERP形式の配送を要求するために sendmail(1) コマンドは -V コマンドオプションを使っていました。Postfix 2.3以降でVERP形式の配送を要求するには、-V の代わりに -XV を指定しなければいけません。
VERP形式の配送のために -V を使おうとしているかどうかを、Postfix 2.3 sendmail(1) コマンドは認識します。正しい処理をおこなった上で、新しい文法になったことを指摘します。