5

我有一些代码可以获取 IMAP 电子邮件,并且在 Python 2 中运行良好。在 Python3 中,我收到以下错误:

Traceback(最近一次调用最后):
文件“./mail.py”,第 295 行,在
item=return_message(x)
文件“./mail.py”,第 122 行,return_message
结果中,data = mail.fetch(message_id , "(RFC822)")
文件 "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/imaplib.py", 第 460 行, 在 fetch
typ, dat = self._simple_command(name, message_set, message_parts)
文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/imaplib.py”,第 1113 行,_simple_command
return self._command_complete(name, self._command(name, *args))
文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/imaplib.py”,第 883 行,在 _command
data = data + b' ' + arg
TypeError: can't concat bytes to int

return_message 函数的代码:

result, data = mail.fetch(message_id, "(RFC822)")
raw_email = data[0][1]
email_message = email.message_from_string(raw_email)

运行时信息:

3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 01:25:11)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]

4

1 回答 1

11

message_set是一个字符串,而不是一个 int。从文档中:

以下命令的message_set选项是一个字符串,指定要处理的一条或多条消息。它可以是一个简单的消息编号 ( '1')、一个消息编号范围 ( '2:4') 或一组用逗号 ( ) 分隔的不连续范围'1:3,6:9'。范围可以包含一个星号来指示无限的上限 ( '3:*')。

直接将其转换为字符串就足够了:

result, data = mail.fetch(str(message_id), "(RFC822)")
于 2012-12-29T10:23:30.500 回答