2016-10-25 52 views
1

在我的Python代碼中,我想獲取我的Gmail電子郵件的正文。我希望它可以與任何電子郵件一起使用,而不受格式(純文本,MIME等)和文本編碼的影響。Gmail API Python - 取回電子郵件正文

從我所看到的,唯一的方法就是編寫一個能夠處理任何場景的解碼器。在跳進它之前,我有幾個問題:

1-我是對的嗎,還是有更簡單的方法,從API或Python模塊獲取任何類型的電子郵件的正文? (我都是Python和Gmail API的新手)

2-有沒有人寫過這樣的解碼器,我可以導入到我的代碼中?

謝謝 埃裏克

+1

你可能要刷上[MCVE]和http://計算器。 COM /幫助/如何對問。 – boardrider

回答

0

是一個簡單的&快速沙箱的情況下,你必須重構一些地方

import re 
import sys 
import imaplib 
import getpass 
import email 
import datetime 
import string 
import get_mail_search 
from sys import stdout 

M = imaplib.IMAP4_SSL('imap.gmail.com') 
class Get_mail(object): 
    """docstring for Get_mail""" 
    def __init__(self, *args): 
     super(Get_mail, self).__init__() 
     c=1 
     self.login(c) 
     self.toast_msg() 

     raw_input() 
    def toast_msg(self, *args): 
     """docstring for Get_mail""" 
     M = self.mailbox() 
     stdout.write("\n{}\n".format(get_mail_search.search_help_info)) 
     serach_input = raw_input() 
     rv, data = M.search(None, serach_input) 
     if rv != 'OK': 
      print "No messages found!" 
     id_ls = data[0].split() 
     rev_id_ls = [i for i in reversed(id_ls)] 
     if rev_id_ls: 
      for o in rev_id_ls: 
       try: 
        msg_content = self.process_mailbox(M, o) 
        _date_ = msg_content[0] 
        _from_ = msg_content[1] 
        _to_ = msg_content[2] 
        _subject_ = msg_content[3] 
        _msg_ = msg_content[4] 
        stdout.write("$$$$$$$$$$$\nDate: {}\nFrom: {}\nTo: {}\nSubject: {}\nMSG: {}\n".format(_date_,_from_,_to_,_subject_,_msg_)) 
       except Exception, e: 
        pass 
     else: 
      stdout.write("No {} Mail Found!".format(serach_input)) 
      raw_input() 
      self.toast_msg() 

    def login(self, try_c, *args): 
     """docstring for Get_mail""" 
     try: 
      stdout.write("\nMail:\n") 
      mail = raw_input() 
      if mail: 
       M.login(str(mail), getpass.getpass()) 
      else: 
       sys.exit(1) 
     except imaplib.IMAP4.error: 
      if try_c<=3: 
       stdout.write("Versuch: {}/3\n".format(try_c)) 
       stdout.write("Die eingegebene E-Mail-Adresse und das Passwort stimmen nicht uberein. Nochmal versuchen") 
       try_c+=1 
       self.login(try_c) 
      else: 
       sys.exit(1) 
    def mailbox(self, *args): 
     """docstring for Get_mail""" 
     rv, mailboxes = M.list() 
     if rv == 'OK': 
      for menu in mailboxes: 
       print('{}'.format(menu)) 
      rv, data = M.select("inbox") 
      if rv == 'OK': 
       return M 
    def eval_decode(self, header, *args): 
     """docstring for Get_mail""" 
     return email.Header.decode_header(header)[0] 

    def process_mailbox(self, M, num, *args): 
     """docstring for Get_mail""" 
     rv, header = M.fetch(num, '(RFC822)') 
     if rv != 'OK': 
      print "ERROR getting message", num 
     header_msg = email.message_from_string(header[0][1]) 
     if header_msg.is_multipart(): 
      body=[payload.get_payload(decode=True) for payload in header_msg.get_payload()] 
     else: 
      body=payload.get_payload(decode=True) 
     from_decode = self.eval_decode(header_msg['From']) 
     subject_decode = self.eval_decode(header_msg['Subject']) 
     date_decode = self.eval_decode(header_msg['Date']) 
     to_decode = self.eval_decode(header_msg['To']) 
     return (date_decode[0], from_decode[0], to_decode[0], subject_decode[0], str(body[0])) 
def run(): 
    try: 
     Get_mail() 
    except KeyboardInterrupt: 
     M.close() 
     M.logout() 
     sys.exit(1) 
run() 
+0

我將在接下來的幾天內爲此工作並在此發佈我的結果。我不使用IMAP訪問我的電子郵件,但您的process_mailbox函數似乎是解決我的問題的方法。 – Eric

+0

反正非常感謝! – Eric