xml-Anhang aus E-mail speicher

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
crumbjunk
User
Beiträge: 2
Registriert: Mittwoch 9. Oktober 2013, 13:44

Hallo zusammen,

ich beschäftige mich seit kurzer Zeit mit Python und es macht wirklich Spaß damit zu arbeiten. Leider habe ich seit zwei Tagen ein Problem...
Ich möchte ein XML-File, das sich im Anhang einer E-Mail befindet speichern, oder besser gesagt auswerten.

Das Auswerten des Files funktioniert wunderbar. Ich habe "nur" das Problem, dass ich zwar auf den E-Mail-Server connecten kann, die E-Mail auch finde und als String ausgeben kann (siehe Code), aber ich weis nicht, wie ich den Anhang speichern kann...

Hier mal mein bisheriger Code, der nur zum speichern des XML-Files dienen soll:

Code: Alles auswählen

import imaplib
import email

# instanzieren und Verbindung herstellen
eMail = imaplib.IMAP4("imap.provider.de")

# einloggen 
eMail.login("email@email.de", "passwort")

# Mailbox auswählen/öffnen
eMail.select("INBOX")

print(eMail.list())

msg = eMail.fetch("3", "(BODY[TEXT])")


#for part in msg.walk():
#    print(part.get_content_type())
    
print(msg)

...

# Mailbox schließen
eMail.close()

# ausloggen
eMail.logout()
Mit dem String fange ich ja nun nicht viel an. Ich könnte vielleicht den Anhang "raussnippen" und dann in ein XML-File formatieren, wobei ich noch nicht genau weiß wie das funktionieren könnte. Aber diese Idee scheint mir doch sehr unschön...

Gibt es nicht die Möglichkeit den String zu parsen? Oder denke ich allgemein zu kompliziert und es gibt eine viel einfacherer Möglichkeit? Ich möchte ja nur den Anhang haben... :K

Ich würde mich sehr über dienliche Hinweise freuen.
BlackJack

@crumbjunk: Du hast das `email`-Modul ja schon importiert. `message_from_string()` ist wohl die passende Funktion. Und dann musst Du durch die Teile der Nachricht gehen bis Du den Anhang gefunden hast.

Die Kommentare sind übrigens allesamt überflüssig weil sie nur genau das beschreiben was man in der nächsten Zeile im Quelltext lesen kann. Und zwar ganz direkt und trivial. Keiner der Kommentare bietet einen Mehrwert.

Der Name `eMail` hält sich nicht an die üblichen Namenskonventionen und ist im Grunde auch falsch, denn das Objekt ist ja keine E-Mail sondern eine Verbindung zu einem IMAP-Server.
crumbjunk
User
Beiträge: 2
Registriert: Mittwoch 9. Oktober 2013, 13:44

Ja, aber bei message_from_string() weis ich nicht was ich übergeben muss. Die Datei der E-Mail auf dem Server wird doch mit den Indizes angesprochen, also in meinem Fall mit "3". Oder kann ich den auch anders ansprechen? Ich glaube nicht.

Was muss man denn in diesem Fall übergeben?

Code: Alles auswählen

msg2 = email.message_from_string(???)
print(msg2)
BlackJack

@crumbjunk: Also in der Dokumentation sollte stehen, dass die Funktion eine RFC822-Formatierte E-Mail haben möchte. Also musst Du so etwas von dem IMAP-Server anfordern. Also '(RFC822)' statt '(BODY[TEXT])'. Wie Du die aus der Antwort heraus bekommst musst Du mal sehen. Um das `imaplib` verwenden zu können muss man das IMAP-Protokoll so im groben verstanden haben. Ich verwende das `imapclient`-Modul für IMAP wofür man zwar immer noch IMAP verstehen muss, was aber ein bisschen besser abstrahiert und praktischere Rückgabewerte hat.

Edit: Wenn das Postfach auch von normalen Mail-Clients aus benutzt wird und Du keine Veränderungen vornehmen willst, solltest Du Dir mal das optionale Argument von `select()` anschauen. Wenn man die Mailbox „nur lesend” öffnet, werden die Mails darin nicht als bereits gesehen markiert.
Antworten