Python电子邮件解析问题

15

所以我想用Python编写一个脚本,登录我的Gmail帐户,然后在GUI中告诉我消息内容。稍后我会对代码进行一些修改,使它更加有用,但现在我卡在了如何解析我得到的原始信息上。这是我的代码:

#Read Email Script
import imaplib
import email

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('username@gmail.com', 'passwordgoeshere')
mail.list()
mail.select("INBOX") # connect to inbox.


result, data = mail.search(None, "ALL")

ids = data[0]
id_list = ids.split()
latest_email_id = id_list[-1]

result, data = mail.fetch(latest_email_id, '(RFC822)')

raw_email = data[0][1]

email_message = email.message_from_string(raw_email)

print (email_message['Subject'])

现在,基本上是想尝试读取最新邮件的主题,该邮件已经被送到我的收件箱中。然而,我在控制台中收到以下错误消息:

>>> 
Traceback (most recent call last):
  File "C:/Users/Dhruvin Desai/Documents/Python/script.py", line 21, in <module>
    email_message = email.message_from_string(raw_email)
  File "C:\Python33\lib\email\__init__.py", line 40, in message_from_string
    return Parser(*args, **kws).parsestr(s)
  File "C:\Python33\lib\email\parser.py", line 69, in parsestr
    return self.parse(StringIO(text), headersonly=headersonly)
TypeError: initial_value must be str or None, not bytes
>>> 

我不知道为什么会出现这个问题,但既然它告诉我email_message的值需要是字符串格式,那我尝试了这样做:

email_message = email.message_from_string(str(raw_email))

但是在进行了这个更改并运行整个脚本后,无论如何结果都会导致控制台输出None

我不知道该怎么办,请帮忙。

1个回答

38
因为您正在使用Python3,所以请使用以下方法来代替:
email.message_from_string(raw_email)

使用

email.message_from_bytes(raw_email)

这样一个小改变带来了巨大的不同。非常感谢您的帮助! - bloodstorm17
1
@bloodstorm17 有一件事我忘了提。从Gmail获取的内容是用base64编码的,你需要解码才能得到真正的主题。 - Leonardo.Z
阅读此答案的人,请注意此Gmail API文档:https://developers.google.com/gmail/api/v1/reference/users/messages/get -- 这个答案帮助我克服了这个障碍。我请求Gmail API团队更改此文档。 - yihlamur

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