# -*- coding: utf-8 -*- # note http://docs.python.org/lib/module-doctest.html # resp. file:///usr/share/doc/python-docs-*/html/lib/module-doctest.html # for testing from __future__ import division from java.util import Properties, Date, GregorianCalendar, Locale from java.text import SimpleDateFormat from java.lang import System from javax.mail import * from javax.mail.search import * from com.sun.mail.imap import IMAPFolder, IMAPSSLStore from jarray import array import sys, os from datetime import date import ConfigParser debug=False class SimpleDate(GregorianCalendar): def __init__(self): pass def getDate(): return self.getTime() def decrease(self,howMuch,unit="m"): pass def getMessageDate(msg): """ Return the date of the message @param msg analyzed message @return GregorianCalendar of the messages date @throws MessagingException """ dateMS = msg.getReceivedDate().getTime()//1000 dateStruct = date.fromtimestamp(dateMS) return dateStruct class ArchivedFolder(object): def __init__(self,store,name): self.folder = store.store.getDefaultFolder().getFolder(name) self.folder.open(Folder.READ_WRITE) def purgeOld(self,dateLimit): toBeDeleted = [] for msg in self.folder.getMessages(): flags = msg.getFlags() if (__getMessageDate(msg) < dateLimit) and (flags.contains(Flags.Flag.SEEN)): toBeDeleted.append(msg) self.folder.setFlags(toBeDeleted,Flags.Flag.DELETED, true) self.folder.expunge() class ArchivedStore(object): """ >>> myStore = ArchivedStore(paramServer="zimbra") >>> folderList = myStore.store.getDefaultFolder().list("*") >>> len(folderList)>0 1 >>> myStore.store.close() and >>> myStore = ArchivedStore(paramServer="zimbra") >>> folder = ArchivedFolder(myStore,"INBOX/bugzilla/xgl") >>> folder.folder.getMessageCount() > 0 1 >>> myStore.store.close() """ def __init__(self,paramServer="localhost",paramUser="",paramPassword="",maxageMonth=3): self.props = System.getProperties() self.session = Session.getInstance(self.props,None) self.props.setProperty("javax.net.ssl.keyStore", "/home/matej/.keystore") self.props.setProperty("javax.net.ssl.trustStore", "/home/matej/.keystore") if debug: self.session.setDebug(True) try: self.store = self.session.getStore("imaps") except: print >> sys.stderr, "Cannot get Store" raise conffile = os.path.expanduser("~/.bugzillarc") if paramServer: config = ConfigParser.ConfigParser() config.read([conffile]) user,host,port,password = self.props.getProperty("user.name"),\ "localhost",993,"" if config: if config.has_section(paramServer): if config.has_option(paramServer, "name"): user = config.get(paramServer, "name") if config.has_option(paramServer, "host"): host = config.get(paramServer, "host") if config.has_option(paramServer, "port"): port = config.get(paramServer, "port") if config.has_option(paramServer, "password"): password = config.get(paramServer, "password") if paramUser: user=paramUser if paramPassword: password=paramPassword if debug: print >>sys.stderr,"host = %s, user = %s, password = %s" % \ (host,user,password) self.__login(host,user,password) def __login(self,server,user,password): try: self.store.connect(server,user,password) except: print >> sys.stderr, "Cannot connect to %s as %s with password %s" %\ (server,user,password) raise def main(): """ >>> threeMonthAgo = date.today() >>> JD3MAgo = GregorianCalendar(threeMonthAgo.year, threeMonthAgo.month-1, threeMonthAgo.day,0,0) >>> formatter = SimpleDateFormat("yyyy-MM-dd",Locale.US); >>> JD3MAgoStr = formatter.format(JD3MAgo.getTime()) >>> str(threeMonthAgo)==JD3MAgoStr 1 """ threeMonthAgo = date.today() newmonth = threeMonthAgo.month-3 threeMonthAgo = threeMonthAgo.replace(month=newmonth) JD3MAgo = GregorianCalendar(threeMonthAgo.year, threeMonthAgo.month-1, threeMonthAgo.day,0,0).getTime() myStore = ArchivedStore(paramServer="zimbra") folder = ArchivedFolder(myStore,"INBOX/bugzilla/xgl") unreadTerm = FlagTerm(Flags(Flags.Flag.SEEN),True) dateTerm = ReceivedDateTerm(ComparisonTerm.LT,JD3MAgo) searchTerm = AndTerm(unreadTerm,dateTerm) msgsFound = folder.folder.search(searchTerm) print len(msgsFound) myStore.store.close() if __name__=='__main__': main()