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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#
# A class to hand a unix-style or mmdf-style mailboxes
#
# Jack Jansen, CWI, March 1994.
#
import rfc822
class _Mailbox:
def __init__(self, fp):
self.fp = fp
self.seekp = 0
def seek(self, pos):
self.seekp = pos
def next(self):
while 1:
self.fp.seek(self.seekp)
try:
self._search_start()
except EOFError:
self.seekp = self.fp.tell()
return None
start = self.fp.tell()
self._search_end()
self.seekp = stop = self.fp.tell()
if start <> stop:
break
return rfc822.Message(_Subfile(self.fp, start, stop))
class _Subfile:
def __init__(self, fp, start, stop):
self.fp = fp
self.start = start
self.stop = stop
self.pos = self.start
def read(self, *args):
if self.pos >= self.stop:
return ''
if args == ():
length = self.stop - self.pos
else:
length = args[0]
self.fp.seek(self.pos)
self.pos = self.pos + length
return self.fp.read(length)
def readline(self, *args):
if self.pos >= self.stop:
return ''
if args == ():
length = self.stop - self.pos
else:
length = args[0]
self.fp.seek(self.pos)
data = self.fp.readline(length)
if len(data) < length:
length = len(data)
self.pos = self.pos + length
return data
def tell(self):
return self.pos - self.start
def seek(self, pos):
self.pos = pos + self.start
def close(self):
pass
class UnixMailbox(_Mailbox):
def _search_start(self):
while 1:
line = self.fp.readline()
if not line:
raise EOFError
if line[:5] == 'From ':
return
def _search_end(self):
while 1:
pos = self.fp.tell()
line = self.fp.readline()
if not line:
return
if line[:5] == 'From ':
self.fp.seek(pos)
return
class MmdfMailbox(_Mailbox):
def _search_start(self):
while 1:
line = self.fp.readline()
if not line:
raise EOFError
if line[:5] == '\001\001\001\001\n':
return
def _search_end(self):
while 1:
pos = self.fp.tell()
line = self.fp.readline()
if not line:
return
if line == '\001\001\001\001\n':
self.fp.seek(pos)
return
if __name__ == '__main__':
import posix
import time
import sys
import string
mbox = '/usr/mail/'+posix.environ['USER']
fp = open(mbox, 'r')
mb = UnixMailbox(fp)
msgs = []
while 1:
msg = mb.next()
if not msg:
break
msgs.append(msg)
if len(sys.argv) > 1:
num = string.atoi(sys.argv[1])
print 'Message %d body:'%num
msg = msgs[num-1]
msg.rewindbody()
sys.stdout.write(msg.fp.read())
sys.exit(0)
print 'Mailbox',mbox,'has',len(msgs),'messages:'
for msg in msgs:
f = msg.getheader('from')
s = msg.getheader('subject')
d = (msg.getheader('date'))
print '%20.20s %18.18s %-30.30s'%(f, d[5:], s)
|