home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / mail / pop.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  6.7 KB  |  204 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from mail.smtp import SMTPEmailAccount
  5. from common import pref
  6. from util import ResetTimer
  7. from util.primitives.funcs import get
  8. from logging import getLogger
  9. log = getLogger('popmail')
  10. info = log.info
  11. from mail.emailobj import DecodedEmail
  12. from mail.emailobj import Email
  13. from traceback import print_exc
  14. import email
  15. from hashlib import sha1
  16. from util.command_queue import CommandQueue, cmdqueue, callback_cmdqueue
  17.  
  18. class PopMail(SMTPEmailAccount):
  19.     protocol = 'pop'
  20.     default_timeout = 20
  21.     
  22.     def __init__(self, **options):
  23.         d = self.default
  24.         self.popserver = options.get('popserver', '')
  25.         self.require_ssl = options.get('require_ssl', d('require_ssl'))
  26.         self.popport = options.get('popport', d('popport'))
  27.         self.uidlworks = None
  28.         self.topworks = True
  29.         self.cmdq = CommandQueue(start_hooks = [
  30.             self._connect], end_hooks = [
  31.             self._quit])
  32.         self.timeouttimer = ResetTimer(pref('pop.timeout', self.default_timeout), self.timeout_check)
  33.         SMTPEmailAccount.__init__(self, **options)
  34.  
  35.     can_has_preview = True
  36.     
  37.     def timeout_check(self):
  38.         log.info('Checking server connection for %r', self)
  39.         if self.state in (self.Statuses.OFFLINE, self.Statuses.ONLINE):
  40.             log.info('%s is not currently checking', self)
  41.             return True
  42.         if get(self, 'conn', False):
  43.             
  44.             try:
  45.                 self.conn.noop()
  46.             self.on_error()
  47.             log.error("%s's server connection has failed", self)
  48.             return False
  49.  
  50.         else:
  51.             log.error('%s has no conn attribute', self)
  52.             self.on_error()
  53.             return False
  54.         return get(self, 'conn', False)
  55.  
  56.     
  57.     def update(self):
  58.         SMTPEmailAccount.update(self)
  59.         log.info('starting timeout timer')
  60.         self.timeouttimer.start()
  61.         self.real_update(success = self.finish_update)
  62.  
  63.     
  64.     def finish_update(self, updates):
  65.         import time
  66.         if self.state == self.Statuses.OFFLINE:
  67.             log.error('finish_update exiting early, state is %s', self.state)
  68.             return None
  69.         (updated_emails, updated_count) = updates
  70.         log.info('%s got %d new messages %s', self, updated_count, time.ctime(time.time()))
  71.         self._received_emails(updated_emails[:25], updated_count)
  72.         self.error_count = 0
  73.         log.info('stopping timeout timer')
  74.         self.timeouttimer.stop()
  75.  
  76.     
  77.     def real_update(self):
  78.         if self.state == self.Statuses.OFFLINE:
  79.             return None
  80.         conn = self.conn
  81.         (num_emails, box_size) = conn.stat()
  82.         num_emails = int(num_emails)
  83.         emails = []
  84.         
  85.         def retr(mid):
  86.             if self.topworks:
  87.                 
  88.                 try:
  89.                     return conn.top(mid, 100)
  90.                 self.topworks = False
  91.  
  92.             
  93.             return conn.retr(mid)
  94.  
  95.         uidl = conn.uidl()
  96.         if uidl[0].startswith('+'):
  97.             self.uidlworks = True
  98.             msg_tups = [ tuple(tup.split()) for tup in uidl[1] ][-25:]
  99.             for tup in msg_tups:
  100.                 
  101.                 try:
  102.                     mailmsg = retr(tup[0])
  103.                 except Exception:
  104.                     []
  105.                     []
  106.                     []
  107.                     print_exc()
  108.                     continue
  109.                     (None, self.state == self.Statuses.OFFLINE)
  110.  
  111.                 
  112.                 try:
  113.                     email_id = tup[1]
  114.                 except IndexError:
  115.                     []
  116.                     []
  117.                     []
  118.                     email_id = None
  119.                 except:
  120.                     (None, self.state == self.Statuses.OFFLINE)
  121.  
  122.                 emails.append(Email.fromEmailMessage(email_id, DecodedEmail(email.message_from_string('\n'.join(mailmsg[1])))))
  123.             
  124.         else:
  125.             self.uidlworks = False
  126.             num_to_get = min(num_emails, 25)
  127.             for i in xrange(num_to_get, max(num_to_get - 25, -1), -1):
  128.                 
  129.                 try:
  130.                     mailmsg = retr(str(i))
  131.                 except Exception:
  132.                     print_exc()
  133.                     continue
  134.  
  135.                 emailstring = '\n'.join(mailmsg[1])
  136.                 de = DecodedEmail(email.message_from_string(emailstring))
  137.                 emails.append(Email.fromEmailMessage(sha1(emailstring).hexdigest() + 'SHA' + str(i) + 'SHA', de))
  138.             
  139.         return (emails, num_emails)
  140.  
  141.     real_update = callback_cmdqueue()(real_update)
  142.     
  143.     def _connect(self):
  144.         if self.require_ssl:
  145.             pop = POP3_SSL
  146.             import poplib
  147.         else:
  148.             pop = POP3
  149.             import poplib
  150.         
  151.         try:
  152.             conn = pop(self.popserver, self.popport)
  153.         except Exception:
  154.             e = None
  155.             log.error('There was an error connecting: %s', e)
  156.             self.on_error()
  157.             raise 
  158.  
  159.         self.conn = conn
  160.         log.info(conn.user(self.name))
  161.         
  162.         try:
  163.             password = self._decryptedpw().encode('utf-8')
  164.             log.info(conn.pass_(password))
  165.         except Exception:
  166.             e = None
  167.             log.error('Bad password: %s', e)
  168.             self._auth_error_msg = e.message
  169.             self.set_offline(self.Reasons.BAD_PASSWORD)
  170.             self.timer.stop()
  171.             raise 
  172.  
  173.         return conn
  174.  
  175.     
  176.     def _quit(self):
  177.         
  178.         try:
  179.             self.conn.quit()
  180.         except Exception:
  181.             e = None
  182.             log.error('Error when disconnecting: %s', str(e))
  183.             if self.state != self.Statuses.ONLINE:
  184.                 self.set_offline(self.Reasons.CONN_FAIL)
  185.             
  186.         except:
  187.             self.state != self.Statuses.ONLINE
  188.  
  189.  
  190.     
  191.     def delete(self, msg):
  192.         SMTPEmailAccount.delete(self, msg)
  193.         conn = self.conn
  194.  
  195.     delete = cmdqueue()(delete)
  196.     
  197.     def _get_options(self):
  198.         opts = SMTPEmailAccount._get_options(self)
  199.         opts.update((dict,)((lambda .0: for a in .0:
  200. (a, getattr(self, a)))('popserver popport require_ssl'.split())))
  201.         return opts
  202.  
  203.  
  204.