Python:无法解析通过管道传递到标准输入的电子邮件

时间:2018-09-21 16:05:32

标签: python email stdin

我正在使用Sieve过滤器将电子邮件从Pigeonhole发送到Python脚本,

#!/usr/bin/python
import sys
import os
import email

input = sys.stdin

#For manual testing 
#input=open(sys.argv[2]).read()

msg=email.message_from_string(input)

但是失败,并显示以下错误

Sep 21 11:41:24 lmtp: Error: Traceback (most recent call last):
Sep 21 11:41:24 lmtp: Error: File "message-processor.py", line 11, in <module>
Sep 21 11:41:24 lmtp: Error: msg=email.message_from_string(input)
Sep 21 11:41:24 lmtp: Error: File "/usr/lib64/python2.6/email/__init__.py", line 57, in message_from_string
Sep 21 11:41:24 lmtp: Error: return Parser(*args, **kws).parsestr(s)
Sep 21 11:41:24 lmtp: Error: File "/usr/lib64/python2.6/email/parser.py", line 82, in parsestr
Sep 21 11:41:24 lmtp: Error: return self.parse(StringIO(text), headersonly=headersonly)
Sep 21 11:41:24 lmtp: Error: TypeError: expected read buffer, file found

当我使用保存为文件但未通过管道发送的电子邮件时,效果很好。

关于此的任何提示吗?

2 个答案:

答案 0 :(得分:1)

您遇到的错误(TypeError: expected read buffer, file found很明显:函数message_from_string在给它提供文件(sys.stdin时需要一个字符串(顾名思义) )。如果要启用管道,则需要首先将输入的文本另存为字符串,然后将其传递给message_from_string。类似于:

import sys
import os
import email

# Save the piped input as a string
s = '\n'.join(line for line in sys.stdin)

msg = email.message_from_string(s)

答案 1 :(得分:0)

我已切换到email.parser来完成工作

#!/usr/bin/python
import sys
import os
import email
import email.parser

input = sys.stdin

#For manual testing 
#input=open(sys.argv[2]).read()

msg = email.parser.Parser().parse(input)