2011-11-29 49 views
7

我想让postfix发送所有邮件到一个python脚本来扫描邮件。Python:Postfix stdin

但是,如何将输出从postfix输出到python?

什么是Python的标准输入?

你能给一个代码示例吗?

回答

6

从后缀推送邮件到Python脚本,加上这样一行到你的postfix别名文件:

# send to [email protected] 
emailname: "|/path/to/script.py" 

python email.FeedParser module可以构造一个对象,表示从标准输入一个MIME电子邮件消息,通过执行类似这样的:

# Read from STDIN into array of lines. 
email_input = sys.stdin.readlines() 

# email.FeedParser.feed() expects to receive lines one at a time 
# msg holds the complete email Message object 
parser = email.FeedParser.FeedParser() 
msg = None 
for msg_line in email_input: 
    parser.feed(msg_line) 
msg = parser.close() 

从这里,你需要遍历的msg的MIME部分,并相应地采取行动。有关您需要的方法,请参阅the documentation on email.Message objects。例如email.Message.get("Header")返回标头值Header

+0

现在的问题是,我希望这发生在每一封电子邮件中,而不仅仅是存在的emaildomains。是否有所有域的wlddcard? –

+0

@LucasKauffman这是一个后缀配置问题。可能最好在serverfault.com上询问,因为我没有答案。 –

+2

此外,您可能需要像这样调用python解释器:'emailname:“| python path/to/script.py”'。至少这就是我们在othello所要做的。 – swandog

9

而不是调用sys.stdin.readlines(),然后按照Michael的建议循环并传递行到email.FeedParser.FeedParser().feed(),您应该将文件对象直接传递给电子邮件解析器。

为此目的,标准库提供对话功能email.message_from_file(fp)。因此,你的代码变得更简单:

import email 
msg = email.message_from_file(sys.stdin)