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