Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/unrefactored/pop.py
blob: fce09f623018ff57f62185a068ed465674e53ced (plain)
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()