2015-03-09 1 views
0

Хорошо, поэтому загружаю электронное письмо из gmail с помощью imaplib, а затем, когда я пытаюсь разобрать электронную почту, он не отделяет ничего в удобном для использования формате. Я подозреваю, что это происходит потому, что где-то в процессе «<» или «>» добавляются к необработанному электронному письму.email.message_from_string() и imaplib добавление '<' '>'

Вот что отладчик показывает мне после того, как я назвал метод: enter image description here Как вы можете видеть это на самом деле не разбирается что-либо в удобном формате.

Вот код, я использую: (. Примечание: .replace('>', '') кажется, не имеет никакого влияния на конечный результат)

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login('[email protected]', 'password') 
mail.list() 
mail.select('inbox') 
typ, data = mail.search(None, 'ALL') 
ids = data[0] 
id_list = ids.split() 

# get the most recent email id 
latest_email_id = int(id_list[-1]) 

# iterate through 15 messages in descending order starting with latest_email_id 
# the '-1' dictates reverse looping order 

for i in range(latest_email_id -10, latest_email_id-15, -1): 
    typ, data = mail.fetch(str(i), '(RFC822)') 

    for response_part in data: 
     if isinstance(response_part, tuple): 
      msg = str(response_part[1]).replace('<', '') 
      msg = msg.replace('>', '') 
      msg = email.message_from_string(msg) 
      #msg = feedparser.parse(response_part[1]) 
      varSubject = msg['subject'] 
      varFrom = msg['from'] 

python email.message_from_string() parse problems и Parsing email with Python оба были очень похожи и одинаковые проблемы для меня (я думаю), и они решили это, изменив их электронную почту, однако я читаю свою электронную почту прямо с серверов Google, поэтому я не уверен, что делать с электронной почтой, чтобы исправить ее, так как все «<» и «>» очевидно не будет работать.

Как я могу исправить письмо, которое считывается из imaplib, чтобы его можно было легко прочитать с помощью mail.message_from_string()? (Или любые другие улучшения/возможные решения, как я не 100% уверен, что «<» и «>» на самом деле проблема, я только гадать, основанные от этих других вопросов.)

Приветствия

ответ

0

Вы не должны разбирать <, > и данные между ними - это похоже на разбор HTML, но гораздо сложнее. Существуют существующие решения для этого.
Вот мой код, который может читать почту с вложения, извлекать данные, которые могут быть использованы для дальнейшего использования и обработок его удобочитаемого формата и кода. Как вы можете видеть, все задачи выполняются сторонними модулями.

from datetime import datetime 
import imaplib 
import email 
import html2text 
from os import path 

class MailClient(object): 
    def __init__(self): 
     self.m = imaplib.IMAP4_SSL('your.server.com') 
     self.Login() 


    def Login(self): 
     result, data = self.m.login('[email protected]', '[email protected]$w0rd') 
     if result != 'OK': 
      raise Exception("Error connecting to mailbox: {}".format(data)) 


    def ReadLatest(self, delete = True): 
     result, data = self.m.select("inbox") 
     if result != 'OK': 
      raise Exception("Error reading inbox: {}".format(data)) 
     if data == ['0']: 
      return None 
     latest = data[0].split()[-1] 
     result, data = self.m.fetch(latest, "(RFC822)") 
     if result != 'OK': 
      raise Exception("Error reading email: {}".format(data)) 
     if delete: 
      self.m.store(latest, '+FLAGS', '\\Deleted') 

     message = email.message_from_string(data[0][1]) 
     res = { 
      'From' : email.utils.parseaddr(message['From'])[1], 
      'From name' : email.utils.parseaddr(message['From'])[0], 
      'Time' : datetime.fromtimestamp(email.utils.mktime_tz(email.utils.parsedate_tz(message['Date']))), 
      'To' : message['To'], 
      'Subject' : email.Header.decode_header(message["Subject"])[0][0], 
      'Text' : '', 
      'File' : None 
     } 

     for part in message.walk(): 
      if part.get_content_maintype() == 'multipart': 
       continue 
      if part.get_content_maintype() == 'text': 
       # reading as HTML (not plain text) 

       _html = part.get_payload(decode = True) 
       res['Text'] = html2text.html2text(_html) 

      elif part.get_content_maintype() == 'application' and part.get_filename(): 
       fname = path.join("your/folder", part.get_filename()) 
       attachment = open(fname, 'wb') 
       attachment.write(part.get_payload(decode = True)) 
       attachment.close() 
       if res['File']: 
        res['File'].append(fname) 
       else: 
        res['File'] = [fname] 

     return res 


    def __del__(self): 
     self.m.close()