Python:无法解析通过管道传输到标准输入的电子邮件消息
Python: Not able to parse email message piped to 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
当我使用保存为文件但未通过管道输入的电子邮件时,它工作正常。
有什么建议吗?
你得到的错误 (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)
我已经切换到 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)
我正在使用 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
当我使用保存为文件但未通过管道输入的电子邮件时,它工作正常。
有什么建议吗?
你得到的错误 (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)
我已经切换到 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)