Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen
Jochen Schulz schrieb:
> Ralph Brugger:
>> Hallo Jochen,
>>
>>> Ich kenne da nix Fertiges, aber mit Python und den Modulen email und
>>> mailbox sollte das relativ schnell zu bewerkstelligen sein. Eventuell
>>> lohnt auch ein Blick in (das Debianpaket) archivemail.
>> Mit Python kann ich leider nicht dienen. Mal schaue was es für PHP da
>> für Module gibt.
>
> Das ist doch *die* Gelegenheit, mal anzufangen. ;-)
So es ist fertig und hat eben seinen ersten Test bestanden:
removeattachments.py
#!/usr/bin/python
import email
import mailbox
import mimetypes
import os
import sys
import time
global dirs
dirs={}
# Sub: Treewalker
def treewalker(directory, callback):
join = os.path.join
#takes care of top directory
dirs[directory]=[]
for f in os.listdir(directory):
pathname = join(directory, f)
if os.path.isdir(pathname):
dirs[pathname] = []
#print "...in %s" % (pathname)
treewalker(pathname, callback)
elif os.path.isfile(pathname) :
callback(pathname)
# Sub: Callback
def callback(pathname):
dirname = os.path.dirname(pathname)
#if os.path.splitext(pathname)[1] == ftype:
dirs[dirname].append(os.path.normpath(pathname))
# Sub: Nachrichten einlesen
def Maildir_messages (path):
d = os.listdir(path)
for filename in d:
filex = os.path.join(path, filename)
if os.path.isfile(filex):
# Mindestdateigroesse erreicht?
sizekb = os.path.getsize(filex) / 1024
# Mindestalter erreicht
filedate = os.path.getmtime(filex)
nowdate = int(time.mktime(time.localtime(time.time())))
daysold = 1 + int((nowdate - filedate) / 60.0 / 60.0 / 24.0)
if (sizekb >= minsize and daysold >= minalter):
# msg Objekt holen fuer die Datei
fin = file (filex)
msg = email.message_from_file(fin)
fin.close()
# Mime Parts der Nachricht
echoheader1 = ""
doremove = 0
for part in msg.walk():
# Gibt es zu loeschende Parts ?
if part.get_content_type() != "text/plain" and
part.get_content_type() != "multipart/mixed" and part.get_content_type()
!= "multipart/signed":
doremove = 1
# Neu schreiben
if doremove:
# Parts loeschen
for part in msg.walk():
if part.get_content_type() != "text/plain" and
part.get_content_type() != "multipart/mixed" and part.get_content_type()
!= "multipart/signed":
# Header
echoheader1 += " Mimetype: " + part.get_content_type()
echoheader1 += "\n"
if (doit == "yes"):
echoheader1 += " Loeschen ..."
else:
echoheader1 += " Simulieren ..."
echoheader1 += "\n"
# Mime Part Inhalt loeschen
part.set_payload("")
# Mime Typ auf text aendern
part.set_type('text/plain')
# Fileproperties
echoheader = ""
echoheader += "Datei: "
echoheader += filex
echoheader += "\n"
echoheader += " Groesse: %d kB" % sizekb
echoheader += " > %d kB\n" % minsize
echoheader += " Alter: %d" % daysold
echoheader += " > %d Tage\n" % minalter
# Mailproerties
echoheader += " Subject: "
echoheader += msg["Subject"]
echoheader += "\n"
echoheader += " From: "
echoheader += msg["From"]
echoheader += "\n"
echoheader += " To: "
echoheader += msg["To"]
echoheader += "\n"
# Speichern
if (doit == "yes"):
fin = file(filex, "w")
fin.write(msg.as_string(1))
fin.close()
# Ausgabe
echoheader += echoheader1
print echoheader
print ""
if len(sys.argv) != 5:
print "removeattachments.py 1.2"
print "Entfernt Attachments aus allen Mails innerhalb eines Maildir
Verzeichnisses"
print "Verwendung:"
print ""
print "removeattachments.py <Groesse> <Alter> <Maildir>"
print ""
print " <Groesse>: Mindestgroesse einer Mail in kB damit Attachments
entfernt werden"
print ""
print " <Alter> : Mindestalter einer Mail in Tagen damit
Attachments entfernt werden"
print ""
print " <Maildir>: Maildirverzeichnis welches rekursiv durchsucht wird."
print " ohne abschliessenden /"
print ""
print " <doit> : yes = loesche wirklich"
print " : no = mache nichts, zeige nur was gemacht werden
wuerde"
print ""
print "Beispiel:"
print ""
print "removeattachments.py 1024 90 /home/udo/Maildir yes"
print ""
print "Entfernt alle Attachments aus allen E-Mails innerhalb von
/home/udo/Maildir und dessen"
print "Unterverzeichnissen, wenn eine Mail groesser als 1024 kByte und
aelter als 90 Tage ist."
print ""
sys.exit()
else:
minsize = int(sys.argv[1])
minalter = int(sys.argv[2])
mailpath = sys.argv[3]
doit = sys.argv[4]
# Nachrichten durchlaufen
treewalker(mailpath, callback)
for maildir in dirs.keys():
Maildir_messages (maildir)
# Ende Status
if (doit == "yes"):
print "Ende: Attachments *wurden* geloescht"
else:
print "Ende: Loeschen wurde *simuliert*"
print ""
Reply to: