meine eigentliche Herausforderung ist es, Mails aus einer IMAP-Mailbox auszulesen und in eine mbox-Datei zu schreiben.
Ich kann auch problemlos die Mail abholen, in einen String umwandeln und in eine Datei schreiben, aber...
mbox verlangt ja noch nach der "From_"- Zeile, die ich mir eigentlich aus dem Envelope bauen wollte.
Ich kann aber nirgends ein modul/Methode/... finden, welceh den Envelope, der hier als String zurückgegeben wird , parst und irgendwie nutzbar macht.
Code: Alles auswählen
import imaplib
M = imaplib.IMAP4('server')
M.login('user','pwd')
M.select('user.user.subfolder')
typ, data = M.search(None, 'ALL')
for num in data[0].split():
typ, message_parts = M.fetch(num, '(ENVELOPE)')
print message_parts[0]
M.close()
M.logout()
Kann man das irgendwie (ohne regexes1 (ENVELOPE ("Fri, 30 Jan 2009 14:54:29 +0100" "subject" (("Sender Name" NIL "user" "tld.de")) ((("Sender Name" NIL "user" "tld.de")) ((("Sender Name" NIL "user" "tld.de")) ((NIL NIL "empfaenger" "tld2.de")) NIL NIL NIL "<RFRYVkZPVihTMCRRW0U6MjIxNjA5ODQ@digassist>"))

mit Regexes sähe das in etwa so aus:
Code: Alles auswählen
for num in data[0].split():
typ, message_parts = M.fetch(num, '(RFC822 ENVELOPE)')
envelope = email.message_from_string(message_parts[0][0])
msg = email.message_from_string( message_parts[0][1])
# blöde regex, um die From_ Zeile bauen zu können
pattern=re.compile('ENVELOPE \("([^"]+)".+?\(\((".*?")\)\)')
m = pattern.search(envelope.__str__())
# baue Sender für From_ Zeile
senderfelder = m.group(2).split('"')
sender = '@'.join([senderfelder[3], senderfelder[5]])
# generiere die ASCII-Time für die From_ Zeile
timestr = time.strftime('%a %b %d %H:%M:%S %Y', email.utils.parsedate(m.group(1)))
# setze From_ Zeile
msg.set_unixfrom(" ".join(["From", sender, timestr]))
# Mail auf stdout ausgeben
print msg.as_string(True)
Danke,
Sven