代码之家  ›  专栏  ›  技术社区  ›  JackTheKnife

Python:无法解析通过管道传输到stdin的电子邮件

  •  0
  • JackTheKnife  · 技术社区  · 7 年前

    #!/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 回复  |  直到 7 年前
        1
  •  1
  •   asherbret    7 年前

    你得到的错误( TypeError: expected read buffer, file found )很清楚:功能 message_from_string 需要一个字符串(顾名思义),而您给它一个文件( sys.stdin ). 如果要启用管道,首先需要将传入的文本保存为字符串,然后将其传递给 来自\u字符串的消息\u

    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)
    
        2
  •  0
  •   JackTheKnife    7 年前

    我换成了 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)
    
    推荐文章