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
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.
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.
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.
+1 danke für die Zeiger. Ich werde mehr darüber recherchieren. – Viet