読者です 読者をやめる 読者になる 読者になる

VERP形式でメールを送信する

Python

Postfixバージョン1.1以降では要求に応じた可変エンベロープリターンパス (variable envelope return path) アドレスをサポートしています。VERP形式の配送が要求されると、メッセージの受信者は、それぞれ自分のアドレスがエンベロープ送信者アドレスに組み込まれるようにカスタマイズされた、メッセージのコピーを受け取ります。

http://www.postfix-jp.info/trans-2.3/jhtml/VERP_README.html


bounce@example.comからspam@example.orgにVERP形式でメールを送ると、Return-Pathが

bounce+spam=example.org@example.com

になるので、エラーメールの処理がとても楽になる。


PythonでVERP形式でメールを送信するには、SMTPオブジェクトのsendmailメソッドでmail_options引数を指定してやればよい。下はVERPデリミタを明示的に指定した場合の例。

# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.utils import formatdate

to_addr    = 'spam@example.com'
from_addr = 'bounce@example.org'

msg = MIMEText('test', 'plain', 'iso-2022-jp')
msg['Subject'] = Header('test', 'iso-2022-jp')
msg['From']    = from_addr
msg['To']      = to_addr
msg['Date']    = formatdate()

conn = smtplib.SMTP('localhost', 25)
#conn.set_debuglevel(1)
conn.sendmail(from_addr, [to_addr], msg.as_string(), mail_options=['XVERP=+='])
conn.close()


Postfix2.3を使ってテストしていて、"5.5.4 Unsupported option: XVERP"と言われて結構はまったが、いろいろなサイトを調べて、/etc/postfix/mail.cfにsmtpd_authorized_verp_clientsを設定しなくてはいけないということに気がついた。

smtpd_authorized_verp_clients = $mynetworks


Djangoならば、django.core.SMTPConnectionの_sendメソッドをオーバーライドしたクラスを定義し、django.core.EmailMessageクラスのコンストラクタで、このクラスのインスタンスを渡してやれば、同様のことができるはずだが、もっと上手いデザインができるはず。こういうことを提案している人はいないのだろうか?
その他にも、Djangoのメール送信周りはヘッダーのFromとエンベロープFromが同一になってしまうという欠点があり、微妙に使いにくい。