2016-10-25 3 views
1

In meinem Python-Code möchte ich den Inhalt meiner Gmail-E-Mails abrufen. Ich möchte, dass es mit jeder E-Mail funktioniert, unabhängig vom Format (Klartext, Mime usw.) und der Textkodierung.Gmail-API Python - E-Mail-Nachrichtentext abrufen

Von dem, was ich gesehen habe, ist der einzige Weg, dies zu tun, einen Decoder zu schreiben, der jedes Szenario bewältigen kann. Bevor ich hineinspringe, habe ich ein paar Fragen:

1- Habe ich Recht, oder gibt es einen einfacheren Weg, von der API oder einem Python-Modul, den Körper von jeder Art von E-Mail zu bekommen? (Ich bin ganz neu in Python und Gmail API)

2- Hat schon jemand solchen Decoder geschrieben, den ich in meinen Code importieren könnte?

Danke, Eric

+1

Refactoring: // Stackoverflow. com/hilfe/wie man fragt. – boardrider

Antwort

0

ist ein einfacher & schneller Sandbox Fall, müssen Sie mögen Sie vielleicht auffrischen auf [MCVE] und http einige Teile

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

Ich werde in den nächsten Tagen daran arbeiten und meine Ergebnisse hier veröffentlichen. Ich verwende IMAP nicht für den Zugriff auf meine E-Mails, aber die Funktion process_mailbox scheint die Lösung für mein Problem zu sein. – Eric

+0

Vielen Dank sowieso! – Eric