Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:sysadmin:tools:imap-mit-python

IMAP mit Python

Mails in anderen Ordner verschieben

Szenario: Ja, jetzt habe ich vorm (wohlverdienten) Urlaub bei der Mailsortierung mit Maildrop oder Sieve die Cronjobs vergessen und die verstopfen jetzt die Inbox. Verd*@#! Ich kann sie natürlich mit dem Mailprogramm rumschieben (nur sind es zu viele und das Mailprogramm verdampft nach längeren Bemühungen wegen der Datenmenge …). Oder vielleicht mach ich es ja auch mit IMAP auf der Kommandozeile. Aber wenn ich da höhere Auswahlkriterien habe, wirds auch mühsam. (Hier trotzdem erst mal ein Beispiel mit einfachen Auswahlkriterien).

Lösung: Python!

Achtung, wenn der Zielordner nicht vorhanden ist, könnte die Mail gelöscht werden

#!/usr/bin/env python
"""
cronjobmailsverschieben.py
 
Hella Breitkopf, http://www.unixwitch.de, 2012-03-07
"""
 
import imaplib
import re
 
myuser="annabeispiel"
mypw="gehEIM!!!"
myserver="imap.example.com"
myport="993"  # naja, defaultport, kann man auch weglassen
 
imapquellordner='INBOX'
imapzielordner='INBOX.cron-jobs-2tage'
 
if __name__ == '__main__':
 
    # Verbindung zum IMAP-Server + Login
    M=imaplib.IMAP4_SSL(myserver,myport)
    M.login(myuser,mypw)
 
    # Ordner aussuchen
    M.select(imapquellordner)
 
    # Mails suchen
    status,msgnums = M.search(None,'FROM','"Cron"')
 
    # die Message-ID-Liste ist bei mir eine Liste, in der
    # ein String (Zahlen und Leerzeichen) steckt -> mach ne richtige Liste draus
    msgidliste=msgnums[0].split()
 
    # Ein Message-Set ist entweder im Format 1 bzw. 1:20 bzw 1,2,4:50,52,59
    # wir machen einfach eine kommaseparierte Liste (in einem String)
    message_set=','.join(msgidliste)
 
    # wenn dieser String leer ist, dann koennen wir nichts machen und hoeren
    # auf (ohne Fehler -> da koennen auch mal keine Mails sein)
    if (not message_set):
        print "keine Mails gefunden"
        sys.exit(0)
 
    # Kopiere das Message-Set in den Zielordner und setze das Delete-Flag
    M.copy(message_set,imapzielordner)
    M.store(message_set,'+FLAGS','\\Deleted')
 
    # damit das Delete-Flag wirksam wird, muss man entweder einen "expunge"
    # machen oder die Verbindung schliessen ...
 
    M.close()
    M.logout()

alte Mails löschen

Achtung: das Script löscht alte Mails ohne Nachfrage!

#!/usr/bin/env python
"""
altmailloeschen
Hella Breitkopf, http://www.unixwitch.de, 2012-06-25
"""
# Quellen:
# http://bobpeers.com/technical/telnet_imap
# http://docs.python.org/library/imaplib.html
 
import imaplib
import re
import time
import sys
 
myuser="annabeispiel"
mypw="gehEIM!!!"
myserver="imap.example.com"
 
myport="993"
 
imapquellordner='INBOX'
 
loeschalter=32  # alles was aelter als 32 Tage ist, wird geloescht
 
jetztepoch=int(time.strftime ('%s',time.localtime()))
 
timeformatSTR="%d-%b-%Y" # 24-Jun-2012
 
epochday=60 * 60 * 24
 
def loeschzualt(tage):
    message_set=''
    loeschliste=[]
 
    grenzdatum=time.strftime(
        timeformatSTR,
        time.localtime(time.time() - tage*epochday)
        )
    print "Loesche alles aelter als %s (%s Tage)" % (grenzdatum,tage)
 
    status,msgnums = M.search(None,'''(BEFORE "%s")''' % grenzdatum)
 
    msgidlisteall=msgnums[0].split()
 
    # wenn die Listen zu lange werden kann es bei der Uebergabe der Message-IDs
    # Probleme geben. Deswegen loeschen wir hier nur 1000 Mails auf einmal ...
    while (len(msgidlisteall) > 1000):
        print "... noch %s Mails" % (len(msgidlisteall))
        msgidliste=msgidlisteall[0:1000]
        message_set=''
        message_set=','.join(msgidliste)
        if (message_set):
            M.store(message_set,'+FLAGS','\\Deleted')
        M.expunge()
 
        status,msgnums = M.search(None,'''(BEFORE "%s")''' % grenzdatum)
        msgidlisteall=msgnums[0].split()
 
    msgidliste=msgidlisteall
    message_set=''
    message_set=','.join(msgidliste)
    if (message_set):
        M.store(message_set,'+FLAGS','\\Deleted')
    M.expunge()
 
 
 
if __name__ == '__main__':
 
        print "Untersuche Mailbox von %s" % myuser
 
        # verbindung zum imap-server aufnehmen
        M=imaplib.IMAP4_SSL(myserver,myport)
        M.login(myuser,mypw)
 
        # mailbox auswaehlen und ansehen
        M.select(imapquellordner)
        status,msgnums = M.search(None,'ALL')
 
        msgidlisteall=msgnums[0].split()
        print "Mailbox von %s enthaelt vorm Loeschen %s Mails" % (myuser,len(msgidlisteall))
 
        loeschzualt(loeschalter)
 
        status,msgnums = M.search(None,'ALL')
        msgidlisteall=msgnums[0].split()
        print "Mailbox von %s enthaelt jetzt noch %s Mails" % (myuser,len(msgidlisteall))
 
        M.expunge()
        M.close()
        M.logout()
 
        print "\n"
de/sysadmin/tools/imap-mit-python.txt · Zuletzt geändert: 2012-10-21 22:00 von hella

Seiten-Werkzeuge