【问题标题】:How to parse headers as a string from raw text in email via imap?如何通过 imap 将邮件中原始文本的标题解析为字符串?
【发布时间】:2021-01-12 06:33:09
【问题描述】:

我正在尝试通过 imaplib 和电子邮件模块将主题行、收件人、发件人和正文文本解析为字符串。当我尝试解析原始消息时,我收到一条错误消息,提示 AttributeError: 'tuple' object has no attribute 'decode'。请帮忙。

import imaplib

import email

Mymail = imaplib.IMAP4_SSL('imap.gmail.com')

password = input()

abcxyz123

Mymail.login('xxx@gmail.com', password)

('OK', [b'xxx@gmail.com authenticated (Success)'])

Mymail.select('INBOX', readonly = True)

('OK', [b'1'])

UIDs = Mymail.search(None, '(SINCE "20-Aug-2019")')

UIDs

('OK', [b'1'])

rawMessage = Mymail.fetch('1', '(BODY[] FLAGS)')

rawHeader = Mymail.fetch('1', "(BODY[HEADER.FIELDS (FROM)])")

rawHeader2 = Mymail.fetch('1', "(BODY[HEADER.FIELDS (TO)])")

rawHeader3 = Mymail.fetch('1', "(BODY[HEADER.FIELDS (SUBJECT)])")

rawHeader4 = Mymail.fetch('1', "(BODY[TEXT])")


**msg = email.message_from_bytes(rawMessage)**

我在尝试解析原始消息时收到以下错误消息:

*Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    msg = email.message_from_bytes(rawMessage)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/email/__init__.py", line 46, in message_from_bytes
    return BytesParser(*args, **kws).parsebytes(s)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/email/parser.py", line 122, in parsebytes
    text = text.decode('ASCII', errors='surrogateescape')
AttributeError: 'tuple' object has no attribute 'decode'*

【问题讨论】:

  • 检查 email 和 email.parser 模块,它们可以很好地解析消息,尤其是在最近的 python 3 版本中。

标签: python email parsing imap gmail-imap


【解决方案1】:

答案:

您正在尝试将元组对象解析为尝试解码字节的方法。

更多信息:

imaplib.IMAP4_SSL().fetch() 返回一个tuple,而email.message_from_bytes() 需要一个bytes-like object

您的数据类型不匹配。元组不是具有解码方法的类似字节的对象。您需要在调用email.message_from_bytes() 或使用其他方法(例如message_from_string())之前进行相应处理。

请记住,如果您这样做,tuple != string 仍然需要进行数据类型转换。

参考资料:

【讨论】:

  • 具体来说,大多数 imaplib fetch 调用返回错误指示,然后返回数据。 "typ, data = Mymail.fetch(...)` 是打包这个元组的常用习语,然后你就可以解析数据了
猜你喜欢
  • 2014-03-23
  • 2012-09-14
  • 2013-07-07
  • 1970-01-01
  • 2019-11-04
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多