0

以下に 2 つのコード スニペットを記述しました。最初のスニペットの 22 行目の print(msg_obj.keys()) の出力リストに 'Subject','From' キーが含まれていないのに、msg_obj が含まれていない理由がわかりません。 「Subject」、「From」などのヘッダー フィールドが含まれます。このスクリプトを使用して電子メールを mbox ファイルにダンプし、後でユーティリティ (Windows の場合は mboxview.exe) を使用してそのファイルを開くと、ユーティリティはダンプされた電子メールを認識しません。どんな提案でも大歓迎です。

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'])

ここで出力は

TEST 12
Full Name <username@sender.com>
username@domain.com

email.message_from_string() の代わりに email.parser.BytesParser().parsebytes() を使用して問題を解決しました。

4

1 に答える 1

0

あなたのサンプルコードから、私は次のことを試みています:

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'])

それは結果をうまく印刷します。

TEST 12
Full Name <username@sender.com>
username@domain.com

したがって、最初のコード スニペットから、関数入力にstr(msg[0][1])は解析不能なコンテンツが含まれている必要があります。str(msg[0][1])解析に失敗している内容を詳しく調べる必要があります。

于 2013-05-21T05:21:55.663 に答える