2017-08-22 3 views
0

Ich habe ein Django-Projekt, wo ich an einem E-Mail-Client arbeite. Ich habe mich dafür entschieden, IMAPClient von Python anstelle von imaplib der Standardbibliothek zu verwenden, um Zugriff auf die Nachrichten zu erhalten. Zur Zeit verwende ich python's email package nicht zum Codieren/Decodieren von Antworten, die von IMAPClient empfangen werden, und ich habe das Gefühl, dass ich Dinge manuell umsetze, die von email gehandhabt werden sollten.Interaktion zwischen Python IMAPClient-Bibliothek und E-Mail-Paket

Beispielcode zum Download attachment:

def download_attachment(server, msgid, index, encoding): 
    # index and encoding is known from previous analysis of bodystructure 
    file_content = f_fetch(server, msgid, index) 
    # the below code should be handled by email's message_from_bytes 
    # and subsequent get_payload(decode = True) function 
    if encoding == 'base64': 
     file_content = base64.b64decode(file_content) 
    elif ... 
    ... 
    endif 
    #writing file_content to a folder 
    return 

def f_fetch(server, msgid, index): 
    if not index: 
     index = '1' 
    response = server.fetch(msgid, 'BODY[' + index + ']') 
    key = ('BODY[' + index + ']').encode('utf-8') 
    if type(msgid) is str: 
     msgid = int(msgid) 
    return response[msgid][key] 

Die Frage ist also, wie soll ich diesen Code neu schreiben, um den Einsatz von email zu machen. Speziell, Was soll ich mit der Antwort von IMAPClient tun, um es an E-Mail-Funktion message_from_bytes() zu übergeben?

+0

Wenn Sie das E-Mail-Paket verwenden möchten, sollten Sie wahrscheinlich direkt imaplib verwenden, da IMAPClient die Nachricht bereits analysiert hat. –

+0

@Serge, also bedeutet es, dass ich, solange ich IMAPClient verwende, das Paket "email" vergessen sollte? –

+0

Unsicher davon (der Grund, warum es ein Kommentar ist und keine Antwort ...). Ich verwende IMAPClient nicht, aber ich dachte, dass eines seiner Hauptinteressen darin besteht, die Nachricht zu parsen. Wenn Sie das nicht brauchen, bin ich mir nur nicht sicher, wie Sie IMAPClient verwenden und warum es besser ist als imaplib. Entschuldigung, nicht in der Lage zu sein, mehr zu helfen ... –

Antwort

1

Wenn Sie eine E-Mail mit der Funktion message_from_bytes() des E-Mail-Pakets analysieren möchten, müssen Sie ihr den vollständigen, unveränderten E-Mail-Text übergeben. Um dies zu erhalten, holen die RFC822 Wähler wie folgt aus:

fetch_data = server.fetch(msgid, ['RFC822']) 
parsed = email.message_from_bytes(fetch_data[msgid][b'RFC822']) 

Wenn Sie einzelne Nachrichtenteile/Anlagen aus dem IMAP-Server sind ziehen, dann wird der Server effektiv für Sie die Analyse der Arbeit zu tun und Sie dies nicht tun müssen den Parser des E-Mail-Pakets verwenden.

+0

Verstehe ich richtig, dass, wenn meine Nachricht eine schwere Anlage enthält, sagen wir, eine Videodatei, dann 'RFC822' wird alles herunterladen. Wenn also der Benutzer nur den "Nur-Text/HTML" der Nachricht und die Namen des Anhangs sehen möchte, ist es nicht optimal, "RFC822" herunterzuladen. –

Verwandte Themen