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
|
import logging
from gettext import gettext as _
from poplib import POP3, POP3_SSL
from accounts import StoreAccount
_ok = lambda resp: True if resp.startswith('+OK') else False
class POPError(Exception): pass
class POPStoreAccount(StoreAccount):
def __init__(self, host, port, auth_type, username, password, del_on_retr=True):
StoreAccount.__init__(self, host, port, auth_type, username, password, del_on_retr)
def _connect(self):
cls = POP3_SSL if self._auth_type=='SSL' else POP3
return cls(self._host, self._port)
def _authenticate(self, server):
return ( _ok(server.user(self._username)) and _ok(server.pass_(self._password)) )
def auth_and_quit(self):
server = self._connect()
if (server is None) or (not self._authenticate(server)):
raise POPError
server.quit()
def retrieve_all(self, tracker):
tracker.update(_('Connecting...'))
try:
server = self._connect()
except:
tracker.error(_('Error connecting to %s:%d' % (self._host, self._port)))
return
tracker.update(_('Authenticating...'))
if not self._authenticate(server):
tracker.error(_('Error authenticating %s' % self._user))
server.quit()
return
tracker.update(_('Checking for new mail...'))
(resp, msg_list, octets) = server.list()
if not _ok(resp):
tracker.error(_('Error getting message list.'))
server.quit()
return
num_msgs = len(msg_list)
if num_msgs==0:
tracker.done()
server.quit()
return
for msg_info in msg_list:
(num, octets) = msg_info.split()
tracker.update(_('Retrieving message %s of %d...' %(num, num_msgs)))
(resp, lines, octets) = server.retr(num)
if not _ok(resp):
tracker.error(_('Error retrieving message.')) # so?!
server.quit()
return
tracker.dump_msg('\n'.join(lines))
if (self._del_on_retr and
not _ok(server.dele(num))):
tracker.error(_('Error deleting message.')) # so?!
server.quit()
return
tracker.done()
server.quit()
|