Ok, I came up with this so far, many thanks to all who contributed!
Best regards
Franz GEIGER
import os.path, re
from imaplib import *
class Finder:
def __init__(self, text):
self._value = None
results = self._rex.finda ll(text)
if results:
self._value = results[0]
return
def value(self):
return self._value
class UIDfinder(Finde r):
_rex = re.compile(r'UI D (\d+)')
class FileNameFinder( Finder):
_rex = re.compile(r'\( "applicatio n" ".+?" \("name" "(.+?)"\)')
def ft(self):
if not self._value:
return None
root, ft = os.path.splitex t(self._value)
return ft
class SenderFinder(Fi nder):
_rex = re.compile(r'Fr om\: (.+)\r', re.M | re.I)
class SubjectFinder(F inder):
_rex = re.compile(r'Su bject\: (.+)\r', re.M | re.I)
class DateFinder(Find er):
_rex = re.compile(r'Da te\: (.+)\r', re.M | re.I)
class MessageSummary:
def __init__(self, uid, fileName, text):
if not fileName:
fileName = ''
self._uid = uid
self._fileName = fileName
self._sender = ''
self._subject = ''
self._date = ''
f = SenderFinder(te xt)
if f.value():
self._sender = f.value()
f = SubjectFinder(t ext)
if f.value():
self._subject = f.value()
f = DateFinder(text )
if f.value():
self._date = f.value()
return
def __str__(self):
return self.formatted( )
def formatted(self) :
return "From : %s\nSubject : %s\nAttachment: %s\nFile-Name :
%s" % (self._sender, self._subject, self._date, self._fileName)
def uid(self):
return self._uid
class Deleter:
def __init__(self, server, messageSummarie s):
self._server = server
self._messageSu mmaries = messageSummarie s
self._uids = [ms.uid() for ms in self._messageSu mmaries]
return
def run(self):
uids = ','.join(self._ uids)
r = self._server.ui d("STORE", uids, "+FLAGS.SILENT" , "(\Deleted) ")[0]
if r in ("OK", "Ok", "ok"):
return ''
else:
return "Error - Could Not Delete Messages"
class Expunger:
def __init__(self, server):
self._server = server
return
def run(self):
self._server.ex punge()
return
print "Logging in."
server = IMAP4("<myDomai n>")
server.login("< myUserName>", "<myPasswor d>")
server.select()
print "Begin to cleanup mailbox."
messagesToDelet e = []
i = 0
while (1):
i += 1
r, d = server.fetch(i, "(UID BODY)")
if r == 'NO' or d[0] is None:
break
uid = UIDfinder(d[0]).value()
fnf = FileNameFinder( d[0])
fn = fnf.value()
if not fn:
print '.',
continue
ft = fnf.ft()
r, d = server.fetch(i, "(BODY.PEEK[HEADER.FIELDS (Date From Subject)])")
ms = MessageSummary( uid, fn, d[0][1])
if ft.lower() == ".exe":
print '*',
messagesToDelet e.append(ms)
else:
print '.',
if messagesToDelet e:
print "\n" * 4
print "%d messages are tagged to be deleted: " % len(messagesToD elete)
for ms in messagesToDelet e:
print ms.formatted()
print
print
if raw_input("Shal l I delete them now (y/n)? ") == 'y':
print 'Working...'
d = Deleter(server, messagesToDelet e)
d.run()
e = Expunger(server )
e.run()
print "Done. "
else:
print
print "No messages to delete. "
raw_input("Pres s any key to exit...")
"Donn Cave" <do**@drizzle.c om> schrieb im Newsbeitrag
news:1064298380 .225028@yasure. ..
Quoth "F. GEIGER" <fg*****@datec. at>:
| I've stopped here, because I could not figure out how to get at the ids
of | mails with attachments. And if I had that missing link, I'd run into the
| next hindrance: How can I delete a single message? IMAP4::delete()
deletes a | whole mailbox, not just a single mail.
|
| So my code really is only a few lines so far:
|
| i = IMAP4(myDomain)
| i.login(myUser, myPassword)
| i.select() # Select INBOX
| r, d = i.fetch(1, "(BODY.PEEK[HEADER.FIELDS])") # Check 1st mail
|
| Seems I have to get a book about IMAP and how to use it...
The IMAP4rev1 RFC of course covers these things, with examples.
2060, I think it is. A message takes two steps to delete: first,
set a \Deleted flag on it, and then invoke expunge on the folder,
which will remove all delete-flagged messages in the folder.
Donn Cave, do**@drizzle.co m