Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/unrefactored/pop.py
diff options
context:
space:
mode:
Diffstat (limited to 'unrefactored/pop.py')
-rw-r--r--unrefactored/pop.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/unrefactored/pop.py b/unrefactored/pop.py
new file mode 100644
index 0000000..fce09f6
--- /dev/null
+++ b/unrefactored/pop.py
@@ -0,0 +1,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()