[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: