2010-02-20 5 views
7

Ich spiele mit Python imaplib (Python 2.6), um E-Mails von GMail zu holen. Alles, was ich eine E-Mail mit Methode http://docs.python.org/library/imaplib.html#imaplib.IMAP4.fetch erhalte ich bekomme ganze E-Mail. Ich brauche nur einen Textteil und analysiere auch Namen von Anhängen, ohne sie herunterzuladen. Wie kann das gemacht werden? Ich sehe, dass E-Mails, die von Google Mail zurückgegeben werden, dem gleichen Format folgen, das Browser an HTTP-Server senden.Wie effizient E-Mails ohne Berühren von Anhängen mit Python zu analysieren

Antwort

0

Ich fürchte, du hast kein Glück. Laut this post gibt es nur zwei Teile der E-Mail - den Header und den Text. Der Körper ist, wo die Anhänge sind, wenn es welche gibt, und Sie müssen den ganzen Körper herunterladen, bevor Sie nur den Nachrichtentext extrahieren. Die Information über den gefundenen FETCH-Befehl here unterstützt diese Meinung ebenfalls. Während es sagt, dass Sie Teilbereiche des Körpers extrahieren können, sind diese in Bezug auf Oktette angegeben, die nicht wirklich helfen.

+0

+1 danke für die Zeiger. Ich werde mehr darüber recherchieren. – Viet

5

Werfen Sie einen Blick auf dieses Rezept: http://code.activestate.com/recipes/498189/

Ich passte es leicht das Von, Betreff, Datum, Name des Attachments, und den Nachrichtentext (nur-Text für jetzt - seine triviale HTML-Nachrichten hinzufügen) drucken .

Ich habe den Gmail pop3 Server in diesem Fall verwendet, aber es sollte auch für IMAP funktionieren.

import poplib, email, string 

mailserver = poplib.POP3_SSL('pop.gmail.com') 
mailserver.user('recent:YOURUSERNAME') #use 'recent mode' 
mailserver.pass_('YOURPASSWORD') #consider not storing in plaintext! 

numMessages = len(mailserver.list()[1]) 
for i in reversed(range(numMessages)): 
    message = "" 
    msg = mailserver.retr(i+1) 
    str = string.join(msg[1], "\n") 
    mail = email.message_from_string(str) 

    message += "From: " + mail["From"] + "\n" 
    message += "Subject: " + mail["Subject"] + "\n" 
    message += "Date: " + mail["Date"] + "\n" 

    for part in mail.walk(): 
     if part.is_multipart(): 
      continue 
     if part.get_content_type() == 'text/plain': 
      body = "\n" + part.get_payload() + "\n" 
     dtypes = part.get_params(None, 'Content-Disposition') 
     if not dtypes: 
      if part.get_content_type() == 'text/plain': 
       continue 
      ctypes = part.get_params() 
      if not ctypes: 
       continue 
      for key,val in ctypes: 
       if key.lower() == 'name': 
        message += "Attachment:" + val + "\n" 
        break 
      else: 
       continue 
     else: 
      attachment,filename = None,None 
      for key,val in dtypes: 
       key = key.lower() 
       if key == 'filename': 
        filename = val 
       if key == 'attachment': 
        attachment = 1 
      if not attachment: 
       continue 
      message += "Attachment:" + filename + "\n" 
     if body: 
      message += body + "\n" 
    print message 
    print 

Dies sollte ausreichen, um Sie in die richtige Richtung zu bringen.

+0

+1 danke! Das ist großartig, um Beispielcode zu sehen! – Viet

+1

['poplib.retr()'] (http://docs.python.org/library/poplib.html#poplib.POP3.retr) lädt die gesamte Nachricht herunter. – Harvey

2

Sie können nur den Klartext der E-Mail erhalten, indem etwas wie tun:

connection.fetch(id, '(BODY[1])') 

Für die Google Mail-Nachrichten Ich habe gesehen, Abschnitt 1 hat den Klartext, einschließlich mehrteiliger Junk. Dies ist möglicherweise nicht so robust.

Ich weiß nicht, wie man den Namen des Anhangs ohne all das bekommt. Ich habe nicht versucht, Teiltöne zu verwenden.