Как определить, закодирована ли загрузка почты по imap base64? - PullRequest
1 голос
/ 02 февраля 2012

Я сохранил все сообщение как xx.eml, но в некоторых почтовых сообщениях сообщается, что почта кодируется с помощью base64 в первой строке, например:

charset="utf-8" Content-Transfer-Encoding: base64   
charset="gb2312" Content-Transfer-Encoding: base64     

Я пытался получить ключи body[0][1], но поле кодировки для передачи содержимого отсутствует (только тип содержимого).

Как мне обработать эту почту?

def saveMail(conn, num):

    typ, body = conn.fetch(num, 'RFC822')

    message = open(emldirPath + '\\' + num + '.eml', 'w+')
    message.write(str(email.message_from_string(body[0][1])))

    print email.message_from_string(body[0][1]).keys()
    #['Received', 'Return-Path', 'Received', 'Received', 'Date', 'From', 'To',
    # 'Subject', 'Message-ID', 'X-mailer', 'Mime-Version', 'X-MIMETrack',
    # 'Content-Type', 'X-Coremail-Antispam']

    message.close()

Я обнаружил проблему, это не проблема декодирования.

по электронной почте следующим образом:
------ = _ Part_446950_1309705579.1326378953207
Тип содержимого: текст / обычный текст;charset = GBK
Content-Transfer-Encoding: base64

что моя программа загружает:
------ = _ Part_446950_1309705579.1326378953207
Content-Type: text / plain;
charset = "utf-8"
Content-Transfer-Encoding: base64

Когда моя программа сохраняет файл .eml, она меняет строку после 'text / plain;'
, поэтому outlook express можетне разбираю почту, если я редактирую строку "" Content-Type: text / html; charset = "utf-8" ",
это работает

Теперь вопрос: как редактировать мойпрограмма, чтобы не дать ей изменить строку?

1 Ответ

0 голосов
/ 02 февраля 2012

В сообщениях электронной почты, передаваемых как BASE64, должно быть установлено Content-Transfer-Encoding. Однако вы, скорее всего, имеете дело с сообщением MIME / Multipart (например, как text / plain, так и HTML в одном сообщении), и в этом случае кодировка передачи устанавливается отдельно для каждой части. Вы можете проверить с is_multipart() или если Content-Type равно multipart/alternative. В этом случае вы используете walk для итерации по различным частям.

РЕДАКТИРОВАТЬ: это вполне нормально для отправки текста / обычного с использованием цитируемой печати и HTML с использованием BASE64.

Content-Type: multipart/alternative; boundary="=_d6644db1a848db3cb25f2a8973539487"
Subject: multipart sample
From: Foo Bar <foo@example.net>
To: Fred Flintstone <fred@example.net>

--=_d6644db1a848db3cb25f2a8973539487
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=utf-8

SOME BASE64 HERE
--=_d6644db1a848db3cb25f2a8973539487
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=utf-8

AND SOME OTHER BASE64 HERE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...