无法使用python将从gmail检索到的电子邮件成功转储到mbox文件

无法使用python将从gmail检索到的电子邮件成功转储到mbox文件,python,python-3.x,Python,Python 3.x,我已经写了以下两段代码片段。第二个工作和预期的一样,但不是第一个。我无法找出为什么第一个代码段第22行的打印输出列表(msg#u obj.keys())不包含“Subject”、“From”键,而msg#u obj包含“Subject”、“From”等标题字段。当我使用此脚本将电子邮件转储到mbox文件,然后使用某些实用程序(mboxview.exe for windows)打开该文件时,该实用程序无法识别任何转储的电子邮件。请帮助我解决此问题。欢迎提出任何建议 import imaplib,e

我已经写了以下两段代码片段。第二个工作和预期的一样,但不是第一个。我无法找出为什么第一个代码段第22行的打印输出列表(msg#u obj.keys())不包含“Subject”、“From”键,而msg#u obj包含“Subject”、“From”等标题字段。当我使用此脚本将电子邮件转储到mbox文件,然后使用某些实用程序(mboxview.exe for windows)打开该文件时,该实用程序无法识别任何转储的电子邮件。请帮助我解决此问题。欢迎提出任何建议

import imaplib,email,mailbox

M=imaplib.IMAP4_SSL('imap.gmail.com',993)
status,data=M.login('someone@gmail.com', 'password')
M.select()

#create new mbox file if doesn't exist
mbox_file=mailbox.mbox('gmail_mails.mbox')
mbox_file.lock()

#get all mails number   
status,data=M.search(None, 'ALL')

try:
    for mail_no in data[0].split():

        status,msg=M.fetch(mail_no,'(RFC822)')

        msg_obj=email.message_from_string(str(msg[0][1]))

        #print for debugging purpose
        print(msg_obj.keys())
        print(msg_obj["Subject"])

        mbox_msg_obj=mailbox.mboxMessage(msg_obj)

        mbox_file.add(mbox_msg_obj)

        mbox_file.flush()

finally:
    mbox_file.unlock()
    mbox_file.close()

M.close()
M.logout()
我还发现,在以下代码的情况下,它是有效的:

from email.parser import Parser

str="""Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22      -0400\r\nReceived: from mail-fx0-f44.google.com (209.85.161.44) by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400\r\nReceived: by fxm19 with SMTP id 19so170709fxm.3 for <username@domain.com>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)\r\nMIME-Version: 1.0\r\nReceived: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)\r\nReceived: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)\r\nDate: Tue, 15 Jun 2010 20:47:33 -0500\r\nMessage-ID: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>\r\nSubject: TEST 12\r\nFrom: Full Name <username@sender.com>\r\nTo: username@domain.com\r\nContent-Type: text/plain; charset=ISO-8859-1 ONE\nTWO\nTHREE"""

msg=Parser().parsestr(str)

print (msg['Subject'])
print (msg['From'])
print (msg['to'])
从email.parser导入解析器
str=“”已收到:(从网络调用qmail 8580);2010年6月15日21:43:22-0400\r\n已收到:从mail-fx0-f44.google.com(209.85.161.44)通过ip-73-187-35-131.ip.secureserver.net通过SMTP发送;2010年6月15日21:43:22-0400\r\n已收到:由fxm19发送,SMTP id为19so170709fxm.3;星期二,2010年6月15日18:47:33-0700(PDT)\r\n时间版本:1.0\r\n收到:通过10.103.84.1,SMTP id为m1mr2774225mul.26.1276652853684;星期二,2010年6月15日18:47:33-0700(PDT)\r\n收到:通过10.123.143.4,HTTP;星期二,2010年6月15日18:47:33-0700(PDT)\r\n日期:2010年6月15日星期二20:47:33-0500\r\n消息ID:\r\n对象:测试12\r\n从:全名\r\n到:username@domain.com\r\n内容类型:text/plain;charset=ISO-8859-1一\n两\n三“”
msg=Parser().parsestr(str)
打印(msg['Subject'])
打印(消息['From'])
打印(消息['to'])
这里是输出

TEST 12
Full Name <username@sender.com>
username@domain.com
测试12
全名
username@domain.com

使用email.parser.BytesParser().parsebytes()而不是email.message_from_string()解决了问题。但无法获取原因是什么

根据您的示例代码,我尝试以下操作:

import email

estr = """Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22      -0400\r\nReceived: from mail-fx0-f44.google.com (209.85.161.44) by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400\r\nReceived: by fxm19 with SMTP id 19so170709fxm.3 for <username@domain.com>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)\r\nMIME-Version: 1.0\r\nReceived: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)\r\nReceived: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)\r\nDate: Tue, 15 Jun 2010 20:47:33 -0500\r\nMessage-ID: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>\r\nSubject: TEST 12\r\nFrom: Full Name <username@sender.com>\r\nTo: username@domain.com\r\nContent-Type: text/plain; charset=ISO-8859-1 ONE\nTWO\nTHREE"""

msg = email.message_from_string(estr)

print (msg['Subject'])
print (msg['From'])
print (msg['to'])
导入电子邮件
estr=“”接收:(qmail 8580从网络调用);2010年6月15日21:43:22-0400\r\n接收:从mail-fx0-f44.google.com(209.85.161.44)通过ip-73-187-35-131.ip.secureserver.net和SMTP;2010年6月15日21:43:22-0400\r\n接收:通过fxm19,SMTP id为19so170709fxm.3;星期二,2010年6月15日18:47:33-0700(PDT)\r\n时间版本:1.0\r\n收到:通过10.103.84.1,SMTP id为m1mr2774225mul.26.1276652853684;星期二,2010年6月15日18:47:33-0700(PDT)\r\n收到:通过10.123.143.4,HTTP;星期二,2010年6月15日18:47:33-0700(PDT)\r\n日期:2010年6月15日星期二20:47:33-0500\r\n消息ID:\r\n对象:测试12\r\n从:全名\r\n到:username@domain.com\r\n内容类型:text/plain;charset=ISO-8859-1一\n两\n三“”
msg=电子邮件。来自字符串的消息(estr)
打印(msg['Subject'])
打印(消息['From'])
打印(消息['to'])
这样可以很好地打印结果

TEST 12
Full Name <username@sender.com>
username@domain.com
测试12
全名
username@domain.com

因此,从您的第一个代码片段开始,函数input
str(msg[0][1])
必须包含一些不可解析的内容。您必须仔细查看无法解析的
str(msg[0][1])
的内容。

第一个程序的输出是什么?尤其是
print(msg_obj.keys())
。对于每封电子邮件,输出仅为[“b”delivery-To“]。一个无关的警告:在上一个代码段中,您已经覆盖了Python类型的
str