Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-17 Diskussionsfäden Ralph Brugger
Hallo,

> Ralph Brugger:
>> removeattachments.py
> Insgesamt hübsch geworden! Kurze Codekritik:

Wie geschrieben, meine Python Erfahrungen sind gleich Null ;)

>> # Sub: Treewalker
> Hast Du mal VBA programmiert? ;-)

Noe.

>> # 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":
> Solche langen Bedingungen kann man auch gern mal als eigene Funktion
> definieren. Da Du das zwei Mal brauchst, ist das hier IMHO auch
> gerechtfertigt.

Ja, koennte man machen. Für mich war die subjetktive Lesbarkeit am
wichtigsten.

>>   doremove = 1
> 
> Python kennt seit einiger Zeit echte boolsche Typen (True, False), die
> sollte man benutzen, wenn man wirklich nur die zwei Werte braucht.

Ich muss mir mal ein Pythonbuch zulegen.
Muss man für Boolean als Datentypen irgendwas einbinden?

> 
>> 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
> 
> So eine Stringverkettung ist oft böse, weil (wie in Java) jedes Mal ein
> neues String-Objekt erzeugt wird. Mit Multilinestrings und
> Stringformatierung sieht das IMHO auch etwas schöner aus (und geht
> schneller, wenn man das sehr, sehr oft macht):

Ja, das ist klar. Aber von der Performance her spielt es keine Rolle.
Denn die Ausgabe erscheint nur bei Mails bei denen Attachments gelöscht
werden sollen. Und das sind immer nur maximal eine Hand voll.
Bei ca. 30.000 Mails spielt das keine Rolle.
Das Erzeugen der Mailobjekte ist da dann außerdem deutlich relevanter in
der verbratenenen Zeit.
Aber any way, ich mag diese mehrzeiligen Strings nicht. Aber das ist
Gewohnheit.

> echoheader = \
> """Datei: %(filex)
>   Groesse: %(sizekb) > %(minsize)
>   Alter: %(daysold) > %(minalter)
> """ % locals()
> 
> locals() gibt ein Dictionary mit den lokal definierten Variablen zurück.
> 
>> if len(sys.argv) != 5:
> 
> Wenn man eine etwas komplexere Aufrufsyntax hat, lohnt schnell ein Blick
> auf das Modul optparse:
> 
> Ist etwas aufwändig zu benutzen, aber dann funktioniert auch alles sehr
> schön und man bekommt ein paar Sachen quasi umsonst (vor Allem eine
> brauchbar formatierte "usage").

Ah ja, das muß ich mir mal anschauen.

Grüße,

Ralph


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-12 Diskussionsfäden Ralph Brugger
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   "
  print ""
  print "   : Mindestgroesse einer Mail in kB damit Attachments
entfernt werden"
  print ""
  print " : Mindestalter einer Mail in Tagen damit
Attachments entfernt werden"
  print ""
  print "   : Maildirverzeichnis welches rekursiv durchsucht wird."
  print "  ohne abschliessenden /"
  print ""
  print "  : 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]

Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-03 Diskussionsfäden Ralph Brugger
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. ;-)

Mhm. So langsam werden es viele Sprachen ...

> Ein recht anschauliches Beispiel aus der Python-Doku:
> http://docs.python.org/lib/email-unpack.txt
> Die Schleife in der main-Methode (for part in msg.walk()) ist für Dich
> interessant. Diese dann einfach einpacken in sowas wie:
> [...]

Das sieht ja noch erlernbar aus.
Das lesen und auseinanderklamüsern der Mails klappt schon.
Die relevanten Attachments kann ich auch schon löschen.
Jetzt muss das ganze noch rekursiv werden und dann muss das Ergebnis
wieder geschrieben werden.

Und wenn dann mein Maildir kaputt ist, weiß ich, dass das doch nicht so
einfach ist ;)

Ralph


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-03 Diskussionsfäden Peter Velan
am 2006-09-02 12:05 schrieb Ralph Brugger:
> Jetzt würde ich gerne per Script alle Attachments aus den einzelnen
> Mails löschen oder abtrennen, wenn die Mails älter als ein definerbares
> Datum sind. zB älter als 12 Monate.

Wie wärs mit Perl:

MIME::Explode : zerfieselt auch komplexe E-Mails in alle Bestandteile
MIME::Entity  : baut die E-Mail wieder schön zusammen

Gruß,
Peter


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-02 Diskussionsfäden Wolf Wiegand
Hallo,

Paul Muster wrote:

> Wolf Wiegand schrieb:
> 
> > AFAIK kann man mit IMAP keine Nachrichten bearbeiten, sondern muss sie
> > herunterladen, vom Server löschen, die Nachricht bearbeiten und wieder
> > hochladen. Ich habe dazu mal ein Python-Grundgerüst gebastelt, ich hänge
> > das mal an diese Mail dran (<1kB, sollte also i.O. sein).
> 
> Wenn Ralph aber direkten Zugriff auf das Maildir hat, muss er nicht per
> IMAP zugreifen. Evtl. geht es dann einfacher/schneller.

Stimmt, da habe ich nicht genau genug gelesen. In dem Fall würde ich das
auch nicht per IMAP machen, sondern direkt die Dateien bearbeiten.

Schönen Gruß,

Wolf
-- 
> who|grep -i blonde|talk; cd ~; wine; touch; finger; unzip; touch;
> strip; gasp; finger; mount; fsck; more; yes; gasp; umount; make clean; sleep
Jedes mal wenn ich diese Zeile sehe bin ich der Meinung, dass das Ganze mit 
"&&" statt ";" verknüft werden müsste. (Lukas Barth in d.a.s.r.)


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-02 Diskussionsfäden Paul Muster
Wolf Wiegand schrieb:

> AFAIK kann man mit IMAP keine Nachrichten bearbeiten, sondern muss sie
> herunterladen, vom Server löschen, die Nachricht bearbeiten und wieder
> hochladen. Ich habe dazu mal ein Python-Grundgerüst gebastelt, ich hänge
> das mal an diese Mail dran (<1kB, sollte also i.O. sein).

Wenn Ralph aber direkten Zugriff auf das Maildir hat, muss er nicht per
IMAP zugreifen. Evtl. geht es dann einfacher/schneller.


mfG Paul


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-02 Diskussionsfäden Ralph Brugger
Wolf Wiegand schrieb:
> Hallo,
> 
> Ralph Brugger wrote:
> 
>> Hallo Jochen,
>>
>>>> Jetzt würde ich gerne per Script alle Attachments aus den einzelnenh
>>>> Mails löschen oder abtrennen, wenn die Mails älter als ein definerbares
>>>> Datum sind. zB älter als 12 Monate.
>>> 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.
> Iieh - PHP :-)

Ieeeh Attachments ;)

> AFAIK kann man mit IMAP keine Nachrichten bearbeiten, sondern muss sie
> herunterladen, vom Server löschen, die Nachricht bearbeiten und wieder
> hochladen. Ich habe dazu mal ein Python-Grundgerüst gebastelt, ich hänge
> das mal an diese Mail dran (<1kB, sollte also i.O. sein).

Das muss ja nicht per IMAP laufen. Ich hatte ja geschrieben "Attachments
aus Mails in Maildir Verzeichnis per Script löschen".
Also auf Dateiebene direkt die Dateien (Mails) im Maildir Verzeichnis
öffnen. Das wäre ja auch effektiver als den Mailserver über IMAP
anzusprechen.

Aber danke für das Python Paket. Schaue ich mir mal an.

Per PHP kann man zumindest mit PEAR mimeDecode die Mails analysieren und
in die MIME Bestandteile zerlegen. Das wird aber schon recht aufwändig.
Aber da muss ich mich wohl durchbeisen ;)

Grüße,

Ralph


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-02 Diskussionsfäden Wolf Wiegand
Hallo,

Ralph Brugger wrote:

> Hallo Jochen,
> 
> >> Jetzt würde ich gerne per Script alle Attachments aus den einzelnen
> >> Mails löschen oder abtrennen, wenn die Mails älter als ein definerbares
> >> Datum sind. zB älter als 12 Monate.
> > 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.

Iieh - PHP :-)

AFAIK kann man mit IMAP keine Nachrichten bearbeiten, sondern muss sie
herunterladen, vom Server löschen, die Nachricht bearbeiten und wieder
hochladen. Ich habe dazu mal ein Python-Grundgerüst gebastelt, ich hänge
das mal an diese Mail dran (<1kB, sollte also i.O. sein).

hth, Wolf
-- 
Büroschimpfwort des Tages: Diplomperforator - Kollege, der nix kann, außer den 
Locher zu bedienen. (Sven-Lukas Müller)
#!/usr/bin/python 

import sys
from imaplib import *

passw = "geheim"
user = "username"
srv = "imapserver"

server = IMAP4(srv)

code, msg = server.login(user, passw)

if not code=="OK":
	print "Login failed: %s"%msg[0]
	sys.exit(1)

ret, num_msg = server.select("INBOX")

if not ret=="OK":
	print "Source mailbox not found"
	sys.exit(2)

num_msg = int(num_msg[0])

msg_idx=1

for msg_idx in range(1, num_msg+1):
	
	ret, tmp = server.fetch(str(msg_idx), '(RFC822)')

	if tmp[0] is None:
		# retrieval of msg failed - this should be looked at
		# more closely, actually
		continue
	else:
		# retrieve the content of the mail (all headers and body)
		msg=tmp[0][1]
		
		# at this point, the mail could be altered, piped through
		# an external command, etc.

		# to copy msg to another mailbox
		# server.append("INBOX.SPAM", None, None, msg)

		# to mark msg as deleted:
		# server.store(str(msg_idx), '+FLAGS', '\\Deleted')
		
# remove mails marked as deleted
# server.expunge


Re: Attachments aus Mails in Maildir Verzeichnis per Script löschen

2006-09-02 Diskussionsfäden Ralph Brugger
Hallo Jochen,

>> Jetzt würde ich gerne per Script alle Attachments aus den einzelnen
>> Mails löschen oder abtrennen, wenn die Mails älter als ein definerbares
>> Datum sind. zB älter als 12 Monate.
> 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.

Grüße,

Ralph


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)