Экспортируйте Gmail с помощью Python imaplib - текст, исправленный из-за проблем с новой строкой - PullRequest
0 голосов
/ 06 декабря 2011

Я использую следующий код для экспорта всех писем в определенную папку Gmail.

Он работает хорошо, поскольку он вытягивает все электронные письма, которые я ожидаю, но он (или я), похоже, искажает кодировку для CR / newline.

Код:

import imaplib
import email
import codecs
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('myUser@gmail.com', 'myPassword')  #user / password
mail.list()
mail.select("myFolder") # connect to folder with matching label

result, data = mail.uid('search', None, "ALL") # search and return uids instead
i = len(data[0].split())

for x in range(i):
    latest_email_uid = data[0].split()[x]
    result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
    raw_email = email_data[0][1]
    email_message = email.message_from_string(raw_email)
    save_string = str("C:\\\googlemail\\boxdump\\email_" + str(x) + ".eml") #set to   save location
    myfile = open(save_string, 'a')
    myfile.write(email_message)
    myfile.close()

Моя проблема в том, что к тому времени, когда я добираюсь до объекта, он усеян '= 0A', что, как я полагаю, неправильно интерпретируется как символ перевода строки или возврата каретки.

Я могу найти его в шестнадцатеричном виде, [d3 03 03 0a], но, поскольку это не «символы», я не могу найти способ, чтобы str.replace () мог убрать детали. Я на самом деле не хочу флагов новой строки.

Я мог бы преобразовать всю строку в шестнадцатеричный формат и выполнить замену команды sorts / regex, но это похоже на убийство - когда проблема заключается в кодировании / чтении исходных данных

Что я вижу:

====
CAUTION:  This email message and any attachments con= tain information that may be confidential and may be LEGALLY PRIVILEGED. If yo= u are not the intended recipient, any use, disclosure or copying of this messag= e or attachments is strictly prohibited. If you have received this email messa= ge in error please notify us immediately and erase all copies of the message an= d attachments. Thank you.
==== 

что я хочу:

====
CAUTION:  This email message and any attachments contain information that may be confidential and may be LEGALLY PRIVILEGED. If you are not the intended recipient, any use, disclosure or copying of this message or attachments is strictly prohibited. If you have received this email message in error please notify us immediately and erase all copies of the message and attachments. Thank you.
====  

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

То, на что вы смотрите, это Цитируемое для печати кодирование.

Попробуйте изменить:

email_message = email.message_from_string(raw_email)

до:

email_message = str(email.message_from_string(raw_email)).decode("quoted-printable")

Подробнее см. Стандартные кодировки в модуле кодеков Python.

0 голосов
/ 01 июля 2013

Всего 2 дополнительных предмета, которые пропали, подумали об этом на один день. 1 сделайте это на уровне полезной нагрузки, чтобы вы могли обработать ваш email_message для получения адресов электронной почты и т. Д. Из вашей почты.

2 Вам также нужно декодировать набор кодировок, у меня были проблемы с людьми, копирующими и вставляющими html с веб-страниц и контент из документов Word и т. Д. В электронные письма, которые я тогда пытался обработать.

if maintype == 'multipart':
                    for part in email_message.get_payload():
                            if part.get_content_type() == 'text/plain':
                                text += part.get_payload().decode("quoted-printable").decode(part.get_content_charset())

Надеюсь, это кому-нибудь поможет!

Dave

...