2011-08-22 4 views
3

Я пытаюсь создать простой фильтр Python для постфикса, чтобы добавить в заголовок «Ответ на» для определенных сообщений.Python filter for postfix

Что я сделал до сих пор принимать электронную почту от стандартного ввода, и разобрать его в объект электронной почты как так:

raw = sys.stdin.readlines() 
msg = email.message_from_string(''.join(raw)) 

Затем я играл с заголовками и т.д.

msg.add_header('Reply-to', '[email protected]') 

И теперь хочу повторно вставить это обратно в постфикс. Чтение filter readme, связанное с postfix, я должен передать его с помощью команды sendmail. Однако я не уверен, как передать объект электронной почты sendmail, например, используя «вызов»()() для подпроцесса или я должен использовать smtplib «smtplib.SMTP()»?

Какой был бы «правильный» метод?

Благодаря

ответ

4

Вы должны быть в состоянии использовать оба метода, но smtplib.SMTP() является более гибким и делает обработку ошибок проще.

Если вам нужен пример, посмотрите на мою framework for python filters: https://github.com/gryphius/fuglu/blob/master/fuglu/src/fuglu/connectors/smtpconnector.py#L67

метод re_inject делает именно это (FUSMTPClient подкласс smtplib.SMTP), так что в основном она сводится к:

client = smtplib.SMTP('127.0.0.1',<yourportnumber for the receiving postfix instance>) 
client.sendmail(<envelope from>, <envelope to>, <yourmessageobject>.as_string()) 
+0

Если вы повторно введете порт 25, вы вызовете цикл (сообщение будет отправлено на ваш фильтр снова). поэтому вам нужен дополнительный экземпляр на другом порту, таком как 10026. Например: http://sourceforge.net/apps/trac/fuglu/wiki/FugluInstall (блок, который начинается с localhost: 10026 inet n ...) – Gryphius

+0

Ah спасибо за ответ - теперь я прочитал фуглу, это имеет смысл. Могу ли я повторно ввести 10026, хотя я беру с stdin? Документы Postfix, похоже, говорят о повторной инъекции 10026 только в контексте службы прослушивания (например, Fuglu)? – jvc26

+1

AFAIK не имеет значения, как сообщение попадает в ваш фильтр (stdin/smtp/....). Дополнительный экземпляр postfix на 10026 ничего не знает о исходном сообщении, он просто выглядит как новое сообщение (он получает новый идентификатор очереди и т. Д.). – Gryphius