5

Python/Django で imaplib を使用してメールを取得しています。

私の目標は、プレーン テキストと HTML の両方のメールを読むことです。

私は使用しています:

mail.select('inbox', readonly=True)
result, data = mail.uid('fetch', email_uid, '(RFC822)')

raw_email = data[0][1]
email_message = email.message_from_string(raw_email)

#print "EMAIL:",email_message
#print "HEADERS",email_message.items()

subject = get_decoded_header(email_message['Subject'])
from_address = get_decoded_header(email_message['From'])

date = email_message['Date']
date = parse_date(date)

body = ''+get_first_text_block(email_message)

get_first_text_block のコード (Web から取得):

def get_first_text_block(email_message_instance):
    maintype = email_message_instance.get_content_maintype()

    if maintype == 'multipart':
        for part in email_message_instance.get_payload():
            if part.get_content_maintype() == 'text':
                return part.get_payload()
    elif maintype == 'text':
        return email_message_instance.get_payload()

    # In cases of emails with empty body
    return ''

さて、これの問題は、テキストがフォーマットされていないように見えることです。具体的には: プレーン テキストの電子メールの場合、テキストは改行、段落、および行間に空行があるのではなく、1 つの大きな統合された文字列として表示されます。

HTML テキストの場合、HTML はまったく表示されず、HTML のフラグメントが内部にあるプレーンテキストとして表示されます (Django で |safe フィルターを使用しても)。

メールのペイロードが文字列に変換されるなどの不具合が起きているのではないかと思いますが、すべてチェックしましたが、どこが間違っているのかわかりませんでした。

私は何を間違っていますか?

4

2 に答える 2

2

問題は、メール本文に最初のテキストブロックのみを使用していることです。代わりに次のことを試して、機能するかどうかを確認してください。Djangoの問題ではありません。

body = email_message.get_payload()[1].get_payload()

インデックスを変更してテストし、htmlが表示されるかどうかを確認してください。

これに基づいて、メールの本文を取得するように関数を変更する必要があります。

編集:私はあなたがマルチパートメッセージを見ているとここで仮定しています

于 2012-11-29T14:55:52.880 に答える
1

テキストバージョンを抽出するには、以下のコードを使用できます。電子メールユイストのhtmlバージョンが必要な場合は、に置き換え!= 'plain'!= 'html'ください。

import email
resp, data = M.FETCH(1, '(RFC822)')
mail = email.message_from_string(data[0][1])

for part in mail.walk():
 print 'Content-Type:',part.get_content_type()
 print 'Main Content:',part.get_content_maintype()
 print 'Sub Content:',part.get_content_subtype()

for part in mail.walk():

  if part.get_content_maintype() == 'multipart':
    continue

  if part.get_content_subtype() != 'plain':
    continue

  payload = part.get_payload()
  print payload
于 2013-02-26T22:38:09.043 に答える