2014-11-18 3 views
4

Я использую python imaplib для загрузки и сохранения вложений в электронной почте. Но когда в электронном письме есть электронное письмо с прикрепленным файлом, x.get_payload() имеет Nonetype. Я думаю, что эти типы писем отправляются с использованием некоторых почтовых клиентов. Поскольку имя файла отсутствует, я попытался изменить имя файла в заголовке, а затем «Content-Disposition». Переименованный файл получает открыт и когда я пытаюсь писать в этот файл, используяКак сохранить электронную почту, прикрепленную в другой, используя python smtplib?

fp.write(part.get_payload(decode=True)) 

он говорит строку или буфер ожидается, но Nonetype найдено.

>>>x.get_payload() 
[<email.message.Message instance at 0x7f834eefa0e0>] 
>>>type(part.get_payload()) 
<type 'list'> 
>>>type(part.get_payload(decode=True)) 
<type 'NoneType'> 

Я удалил расшифровывает = True, и я получил список объектов

x.get_payload()[0] 
<email.message.Message instance at 0x7f834eefa0e0> 

я пытался редактирования файла в случае электронной почты, который в качестве вложения.

if part.get('Content-Disposition'): 
    attachment = str(part.get_filename()) #get filename 
    if attachment == 'None': 
     attachment = 'somename.mail' 
     attachment = self.autorename(attachment)#append (no: of occurences) to filename eg:filename(1) in case file exists 
     x.add_header('Content-Disposition', 'attachment', filename=attachment) 
     attachedmail = 1 

if attachedmail == 1: 
    fp.write(str(x.get_payload())) 
else: 
    fp.write(x.get_payload(decode=True)) #write contents to the opened file 

и файл содержит содержание имя объекта файла приведен ниже

[ < email.message.Message instance at 0x7fe5e09aa248 > ] 

Как я могу писать содержание этих писем, прикрепленных к файлам?

ответ

3

Я решил это сам. как [< email.message.Message экземпляр в 0x7fe5e09aa248>] - это список экземпляров mail.message.Message, каждый из которых имеет метод .as_string(). В моем случае запись содержимого файла .as_string() в файл помогла мне извлечь все данные заголовка, включая вложенные вложения в файл. Затем я просмотрел файл строки за строкой и сохранил содержимое на основе кодировки и типа файла.

>>>x.get_payload() 
[<email.message.Message instance at 0x7f834eefa0e0>] 
>>>fp=open('header','wb') 
>>>fp.write(x.get_payload()[0].as_string()) 
>>>fp.close() 
>>>file_as_list = [] 
>>>fp=open('header','rb') 
>>>file_as_list = fp.readlines() 
>>>fp.close() 

И затем проверяя каждый строк в файле

for x in file_as_list: 
    if 'Content-Transfer-Encoding: quoted-printable' in x: 
     print 'qp encoded data found!' 
    if 'Content-Transfer-Encoding: base64' in x: 
     print 'base64 encoded data found!' 

кодированные данные, представляющий встроенный (встроенные) вложения могут быть пропущены, как imaplib уже захватывает его.