1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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')
|