Frage

Ich mag die ganze Nachricht von IMAP4-Server holen. wenn dieses Stück Code, das funktioniert gefunden in Python-Dokumentation:

>>> t, data = M.fetch('1', '(RFC822)')
>>> body = data[0][1]

Ich frage mich, ob ich immer, dass die Daten vertrauen kann [0] [1] gibt den Körper der Nachricht. Wenn ich habe laufen ‚RFC822.SIZE‘ Ich habe nur einen String statt eines Tupels bekam.

Ich habe durch rfc1730 abgeschöpft, aber ich war nicht in der Lage die richtige Antwort-Struktur für die ‚RFC822‘ herauszufinden. Es ist auch schwer zu sagen, die Ergebnisstruktur aus imaplib Dokumentation holen.

Hier ist, was ich bekomme, wenn RFC822 holen:

('OK', [('1 (RFC822 {858569}', 'body of the message', ')')])

Aber wenn ich hole RFC822.SIZE erhalte ich:

('OK', ['1 (RFC822.SIZE 847403)'])

Wie soll ich richtig die Daten [0] Liste behandeln? Kann ich darauf vertrauen, dass, wenn es sich um eine Liste von Tupeln die Tupel ist genau 3 Teile und der zweite Teil ist die Nutzlast?

Vielleicht kennen Sie eine bessere Bibliothek für IMAP4?

War es hilfreich?

Lösung

Nein ... imaplib ist eine ziemlich gute Bibliothek, es ist imap, die so unverständlich ist.

Wir empfehlen Ihnen, dass t == 'OK' zu überprüfen, aber data[0][1] funktioniert wie erwartet für so viel, wie ich habe es benutzt.

Hier ist ein kurzes Beispiel ich signierte Zertifikate extrahieren ich per E-Mail erhalten haben, nicht bombensicher, sondern passt meine Zwecke:

import getpass, os, imaplib, email
from OpenSSL.crypto import load_certificate, FILETYPE_PEM

def getMsgs(servername="myimapserverfqdn"):
  usernm = getpass.getuser()
  passwd = getpass.getpass()
  subject = 'Your SSL Certificate'
  conn = imaplib.IMAP4_SSL(servername)
  conn.login(usernm,passwd)
  conn.select('Inbox')
  typ, data = conn.search(None,'(UNSEEN SUBJECT "%s")' % subject)
  for num in data[0].split():
    typ, data = conn.fetch(num,'(RFC822)')
    msg = email.message_from_string(data[0][1])
    typ, data = conn.store(num,'-FLAGS','\\Seen')
    yield msg

def getAttachment(msg,check):
  for part in msg.walk():
    if part.get_content_type() == 'application/octet-stream':
      if check(part.get_filename()):
        return part.get_payload(decode=1)

if __name__ == '__main__':
  for msg in getMsgs():
    payload = getAttachment(msg,lambda x: x.endswith('.pem'))
    if not payload:
      continue
    try:
      cert = load_certificate(FILETYPE_PEM,payload)
    except:
      cert = None
    if cert:
      cn = cert.get_subject().commonName
      filename = "%s.pem" % cn
      if not os.path.exists(filename):
        open(filename,'w').write(payload)
        print "Writing to %s" % filename
      else:
        print "%s already exists" % filename

Andere Tipps

Die IMAPClient Paket ist ein gutes Stück leichter Arbeit mit. Aus der Beschreibung:

  

Easy-to-use, Pythonic und vollständiger   IMAP-Client-Bibliothek.

Dies war meine Lösung die Nutzbits von Informationen zu extrahieren. Es ist zuverlässig bisher:

import datetime
import email
import imaplib
import mailbox


EMAIL_ACCOUNT = "your@gmail.com"
PASSWORD = "your password"

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(EMAIL_ACCOUNT, PASSWORD)
mail.list()
mail.select('inbox')
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN)
i = len(data[0].split())

for x in range(i):
    latest_email_uid = data[0].split()[x]
    result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
    # result, email_data = conn.store(num,'-FLAGS','\\Seen') 
    # this might work to set flag to seen, if it doesn't already
    raw_email = email_data[0][1]
    raw_email_string = raw_email.decode('utf-8')
    email_message = email.message_from_string(raw_email_string)

    # Header Details
    date_tuple = email.utils.parsedate_tz(email_message['Date'])
    if date_tuple:
        local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
        local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S")))
    email_from = str(email.header.make_header(email.header.decode_header(email_message['From'])))
    email_to = str(email.header.make_header(email.header.decode_header(email_message['To'])))
    subject = str(email.header.make_header(email.header.decode_header(email_message['Subject'])))

    # Body details
    for part in email_message.walk():
        if part.get_content_type() == "text/plain":
            body = part.get_payload(decode=True)
            file_name = "email_" + str(x) + ".txt"
            output_file = open(file_name, 'w')
            output_file.write("From: %s\nTo: %s\nDate: %s\nSubject: %s\n\nBody: \n\n%s" %(email_from, email_to,local_message_date, subject, body.decode('utf-8')))
            output_file.close()
        else:
            continue

imap-tools Bibliothek für effektives Arbeiten mit E-Mail-Nachrichten IMAP-Protokoll.

  • transparente Arbeit mit Buchstaben Attribute (einschließlich uid)
  • Arbeit mit Buchstaben in Verzeichnissen (Kopieren, Löschen, Flagge, verschieben, zu sehen ist)
  • Arbeit mit Verzeichnissen (Liste, Satz, erhalten, erstellen, besteht, umbenennen, löschen, Status)
  • keine externen Abhängigkeiten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top