2016-10-04 3 views
0

Итак, я пытаюсь сохранить вложенные файлы в формате PDF, отправленные на определенную учетную запись, в определенную сетевую папку, но я застрял в части вложения. У меня есть следующий код, чтобы вытащить невидимые сообщения, но я не уверен, как заставить «части» остаться нетронутыми. Я думаю, что, возможно, смогу понять это, если смогу выяснить, как сохранить сообщение электронной почты в полном объеме. Я никогда не прогонял его «Сделал это, чтобы ходить». Все тестовые письма в этой учетной записи включают вложения в формате PDF. Заранее спасибо.Извлечение pdf-вложения из учетной записи IMAP - python 3.5.2

import imaplib 
import email 
import regex 
import re 

user = 'some_user' 
password = 'gimmeAllyerMoney' 

server = imaplib.IMAP4_SSL('mail.itsstillmonday.com', '993') 
server.login(user, password) 
server.select('inbox') 

msg_ids=[] 
resp, messages = server.search(None, 'UNSEEN') 
for message in messages[0].split(): 
     typ, data = server.fetch(message, '(RFC822)') 
     msg= email.message_from_string(str(data[0][1])) 
     #looking for 'Content-Type: application/pdf 
     for part in msg.walk(): 
       print("Made it to walk") 
       if part.is_multipart(): 
         print("made it to multipart") 
       if part.get_content_maintype() == 'application/pdf': 
         print("made it to content") 
+0

Являются ли эти сообщения многостраничными сообщениями? «Maintype» будет просто «приложением» для чего-то с «Content-type: application/pdf» – tripleee

+0

@ tripleee «Content-Type: multipart» появляется в заголовке сообщения. Я также сделаю обновление для приложения/pdf. – AlliDeacon

ответ

0

Вы можете использовать part.get_content_type(), чтобы получить полный тип контента и part.get_payload(), чтобы получить полезную нагрузку следующим образом:

for part in msg.walk(): 
    if part.get_content_type() == 'application/pdf': 
     # When decode=True, get_payload will return None if part.is_multipart() 
     # and the decoded content otherwise. 
     payload = part.get_payload(decode=True) 

     # Default filename can be passed as an argument to get_filename() 
     filename = part.get_filename() 

     # Save the file. 
     if payload and filename: 
      with open(filename, 'wb') as f: 
       f.write(payload) 

Обратите внимание, что, как tripleee отметил, для часть с типом контента «application/pdf» у вас есть:

>>> part.get_content_type() 
"application/pdf" 
>>> part.get_content_maintype() 
"application" 
>>> part.get_content_subtype() 
"pdf" 
+0

Могу ли я запустить сообщение на части, не превращая его в строку? Я думаю, что может быть, где моя проблема: 'для сообщений в сообщениях [0] .split(): typ, data = server.fetch (message, '(RFC822)') msg = email.message_from_string (str (данные [0] [1])) 'Должен ли я делать что-то еще, прежде чем идти с сообщением? – AlliDeacon

+0

Возможно, вам нужно использовать email.message_from_bytes (данные [0] [1]) для разбора сообщений, например здесь: https://stackoverflow.com/questions/38739739/str-object-has-no-attribute-message-from -bytes. – jerry

Смежные вопросы