Python: 后缀表达式stdin

8
我希望让postfix将所有电子邮件发送到一个Python脚本中进行扫描。但是,我该如何将postfix的输出导入到Python中?Python中的标准输入是什么?你能给出一个代码示例吗?
2个回答

12

与Michael建议的调用sys.stdin.readlines()然后循环并将行传递给email.FeedParser.FeedParser().feed()不同,你应该直接将文件对象传递给邮件解析器。

标准库提供了一个方便函数email.message_from_file(fp),用于此目的。因此你的代码变得更加简单:

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

7
为了将邮件从Postfix推送到Python脚本,需要在Postfix别名文件中添加以下行:
# send to emailname@example.com
emailname: "|/path/to/script.py"

Python的email.FeedParser模块可以通过以下方式从stdin构建一个表示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部分,并相应地执行操作。请参考email.Message对象文档了解所需方法。例如,email.Message.get("Header")返回Header的标题值。


问题现在是,我希望这个操作对每一封电子邮件都生效,而不仅限于存在的电子邮件域名。是否有一个通配符适用于所有域名? - Lucas Kauffman
@LucasKauffman 这是一个后缀配置问题。最好在serverfault.com上提问,因为我没有答案。 - Michael Berkowski
2
此外,您可能需要像这样调用Python解释器:emailname: "|python path/to/script.py"。至少在Othello上我们是这样做的。 - swandog
@swandog 哈哈.. 希望你不是在排除我的旧代码问题。 - Michael Berkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接