aboutsummaryrefslogtreecommitdiffstats
path: root/website/fetchmail-SA-2007-01.txt
Commit message (Collapse)AuthorAgeFilesLines
* Track website in separate SVN directory (mostly symlinks for now).Matthias Andree2008-06-171-0/+1
svn path=/branches/BRANCH_6-3/; revision=5197
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
# Mold Remover
#
# A short python script to remove old read mail from a pop3 mailserver.
# Distributed under the GNU GPL (http://www.gnu.org/copyleft/gpl.html)
# Dovetails with fetchmail with keep option.
# Run it as a cron job... Remember to stop fetchmail in the cron job
# before calling mold_remover, and to restart fetchmail after mold_remover
# e.g.: 
#
#	/etc/init.d/fetchmail stop >> /var/log/messages
#	/usr/bin/python /usr/local/bin/mold_remover.py >> /var/log/messages
#	/etc/init.d/fetchmail start >> /var/log/messages
#
# Version 0.3 by James Stone (jmstone@dsl.pipex.com)
# 15th March 2004
# 
# Changes:
# 0.1 25th September 2003 Original version
# 0.2 6th March 2004 Info added regarding use, and explicit mention of GPL made.
# 0.3 15th March 2004 days changed to list, 1 day changed from 24 to 23 hours.
# 
# please submit bug reports and code optimisations as you see fit!

import string
import poplib
import time

#user editable section

mailserver=["mail.server1","mail.server2"] #list of mailservers
login=["login1","login2"] #list of logins for corresponding mailserver
password=["pass1","pass2"] #list of passwords (note: chmod 700 for this script)
days=[2,3] #number of days to keep on server.
localuidlcache="/var/mail/.fetchmail-UIDL-cache" #fetchmail's UIDL cache
localuidldate="/var/mail/.UIDLDate" #mold remover's UIDL datefile

#end of user editable section

readfile=open(localuidlcache, 'r')
datefile=open(localuidldate, 'a+')
tempfile=open("/tmp/uidltmp", 'w+')
popuidllist=[] #list of undeleted uidls on all servers
totnum=0 #number of undeleted messages on all servers
connectedto=-1

#connect to each mailserver get all the new message UIDLs and delete any
#expired messages.

for a in range(len(mailserver)):
    connect=poplib.POP3(mailserver[a])
    connect.user(login[a])
    connect.pass_(password[a])
    connectedto=a
    number,size=connect.stat()
    totnum+=number
    for mesnum in range(number):
        messagedeleted=0
        datefile.seek(0)
        for uidldate in datefile:
            uidldatesplit=uidldate.split(' ')
            if(connectedto==int(uidldatesplit[2])):
                if (time.time()-float(uidldatesplit[1]))>(86400*days[a]-3600):
                    try:
                        recheckuidl=connect.uidl(mesnum+1)
                        recheckuidlsplit=recheckuidl.split(' ')
                        if (recheckuidlsplit[2]==uidldatesplit[0]):
                            print('deleting'+recheckuidlsplit[1])
                            print(connect.dele(recheckuidlsplit[1]))
                            messagedeleted=1
                            totnum-=1
                    except poplib.error_proto:
                        pass #skip over messages that have already been deleted.
        if not(messagedeleted):
            popuidllist.append(connect.uidl(mesnum+1)+' '+str(a))
    connect.quit()        


#get rid of lines in uidldate file corresponding to the messages that have been
#expired (and hopefully been deleted)

datefile.seek(0)
for uidldate in datefile:
    uidldatesplit=uidldate.split(' ')
    if not(time.time()-float(uidldatesplit[1]))>(86400*days[int(uidldatesplit[2])]):
        tempfile.write(uidldate)
datefile.close()
datefile=open(localuidldate,'w+')
tempfile.seek(0)
for line in tempfile:
        datefile.write(line)
datefile.close()
datefile=open(localuidldate,'a+')

#add date to uidl for any messages still on the server which have been read 
#(check in readfile) and store in local datefile.

for mesnum in range(totnum):    
            popuidl=popuidllist[mesnum]
            popuidlsplit=popuidl.split(' ')
            readfile.seek(0)
            for localuidl in readfile:
                if(localuidl.find(popuidlsplit[2])<>-1):
                    foundindatefile=0
                    datefile.seek(0)
                    for stored in datefile:
                        if (stored.find(popuidlsplit[2])<>-1):
                            foundindatefile=1
                    if not(foundindatefile):
                        datefile.write(popuidlsplit[2]+' '+str(time.time())+' '
                            +popuidlsplit[3]+'\n')