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()
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"
Siehe auch: IMAP mit openSSL testen (IMAPs von der Kommandozeile), Mail sortieren mit Maildrop (≤ 2008), SIEVE Mailsortierung (mein Sieve-Script)
Quellen:
ausserdem empfehlenswert:
gilt für alle Tipps, Tricks & Spickzettel:
dies sind einfache, teils banale Notizen für meinen persönlichen Gebrauch,
die hier eher zufällig auch öffentlich lesbar sind
(vielleicht hilft es ja jemandem weiter). Verwendung auf eigene Gefahr
Fehler-Hinweise, Dankesschreiben , etc. bitte an: web.21@unixwitch.de
weitere Tools / Spickzettel