首页 > 解决方案 > 使用 python 3“序列项 0:预期的 str 实例,找到的字节”接收邮件时出错

问题描述

我正在尝试使用 poplib 在 python 上接收电子邮件,当我运行代码时,我不断收到以下输出sequence item 0: expected str instance, bytes found。这是整个代码,如果有人知道打印接收邮件的更简单的方法,如果您能发表评论,我将不胜感激。我还希望能够仅打印确定电子邮件的电子邮件。谢谢你。

import poplib
from email import parser
pop_conn = poplib.POP3_SSL('pop.gmail.com')
pop_conn.user('mail@gmail.com')
pop_conn.pass_('password')

messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
print(message.keys())
for message in messages:
    print(message['subject'])
    print(message.get_payload())
pop_conn.quit()

标签: pythonpython-3.xemail

解决方案


问题出现在您的行中

messages = ["\n".join(mssg[1]) for mssg in messages]

在这里,您尝试加入"\n"which 是一个字符串,mssg[1]从技术上讲,它是一个列表,并且它包含字节字符串。要使该特定行工作,您可以messages = [b"\n".join(mssg[1]) for mssg in messages](注意 b)使其工作。parsestr()但是,在调用of时,您将再次遇到问题Parser,因为您要对其进行解析的又是mssg[1],这不是字符串。查看它的文档email.Parser应该有一个接受字节而不是字符串作为输入的函数。

我个人也会使用 IMAP 而不是 POP。


推荐阅读