home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / poplib.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  8.4 KB  |  289 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. import re
  5. import socket
  6. __all__ = [
  7.     'POP3',
  8.     'error_proto']
  9.  
  10. class error_proto(Exception):
  11.     pass
  12.  
  13. POP3_PORT = 110
  14. POP3_SSL_PORT = 995
  15. CR = '\r'
  16. LF = '\n'
  17. CRLF = CR + LF
  18.  
  19. class POP3:
  20.     
  21.     def __init__(self, host, port = POP3_PORT, timeout = socket._GLOBAL_DEFAULT_TIMEOUT):
  22.         self.host = host
  23.         self.port = port
  24.         self.sock = socket.create_connection((host, port), timeout)
  25.         self.file = self.sock.makefile('rb')
  26.         self._debugging = 0
  27.         self.welcome = self._getresp()
  28.  
  29.     
  30.     def _putline(self, line):
  31.         if self._debugging > 1:
  32.             print '*put*', repr(line)
  33.         self.sock.sendall('%s%s' % (line, CRLF))
  34.  
  35.     
  36.     def _putcmd(self, line):
  37.         if self._debugging:
  38.             print '*cmd*', repr(line)
  39.         self._putline(line)
  40.  
  41.     
  42.     def _getline(self):
  43.         line = self.file.readline()
  44.         if self._debugging > 1:
  45.             print '*get*', repr(line)
  46.         if not line:
  47.             raise error_proto('-ERR EOF')
  48.         octets = len(line)
  49.         if line[-2:] == CRLF:
  50.             return (line[:-2], octets)
  51.         if None[0] == CR:
  52.             return (line[1:-1], octets)
  53.         return (None[:-1], octets)
  54.  
  55.     
  56.     def _getresp(self):
  57.         (resp, o) = self._getline()
  58.         if self._debugging > 1:
  59.             print '*resp*', repr(resp)
  60.         c = resp[:1]
  61.         if c != '+':
  62.             raise error_proto(resp)
  63.         return resp
  64.  
  65.     
  66.     def _getlongresp(self):
  67.         resp = self._getresp()
  68.         list = []
  69.         octets = 0
  70.         (line, o) = self._getline()
  71.         while line != '.':
  72.             if line[:2] == '..':
  73.                 o = o - 1
  74.                 line = line[1:]
  75.             octets = octets + o
  76.             list.append(line)
  77.             (line, o) = self._getline()
  78.         return (resp, list, octets)
  79.  
  80.     
  81.     def _shortcmd(self, line):
  82.         self._putcmd(line)
  83.         return self._getresp()
  84.  
  85.     
  86.     def _longcmd(self, line):
  87.         self._putcmd(line)
  88.         return self._getlongresp()
  89.  
  90.     
  91.     def getwelcome(self):
  92.         return self.welcome
  93.  
  94.     
  95.     def set_debuglevel(self, level):
  96.         self._debugging = level
  97.  
  98.     
  99.     def user(self, user):
  100.         return self._shortcmd('USER %s' % user)
  101.  
  102.     
  103.     def pass_(self, pswd):
  104.         return self._shortcmd('PASS %s' % pswd)
  105.  
  106.     
  107.     def stat(self):
  108.         retval = self._shortcmd('STAT')
  109.         rets = retval.split()
  110.         if self._debugging:
  111.             print '*stat*', repr(rets)
  112.         numMessages = int(rets[1])
  113.         sizeMessages = int(rets[2])
  114.         return (numMessages, sizeMessages)
  115.  
  116.     
  117.     def list(self, which = None):
  118.         if which is not None:
  119.             return self._shortcmd('LIST %s' % which)
  120.         return None._longcmd('LIST')
  121.  
  122.     
  123.     def retr(self, which):
  124.         return self._longcmd('RETR %s' % which)
  125.  
  126.     
  127.     def dele(self, which):
  128.         return self._shortcmd('DELE %s' % which)
  129.  
  130.     
  131.     def noop(self):
  132.         return self._shortcmd('NOOP')
  133.  
  134.     
  135.     def rset(self):
  136.         return self._shortcmd('RSET')
  137.  
  138.     
  139.     def quit(self):
  140.         
  141.         try:
  142.             resp = self._shortcmd('QUIT')
  143.         except error_proto:
  144.             val = None
  145.             resp = val
  146.  
  147.         self.file.close()
  148.         self.sock.close()
  149.         del self.file
  150.         del self.sock
  151.         return resp
  152.  
  153.     
  154.     def rpop(self, user):
  155.         return self._shortcmd('RPOP %s' % user)
  156.  
  157.     timestamp = re.compile('\\+OK.*(<[^>]+>)')
  158.     
  159.     def apop(self, user, secret):
  160.         m = self.timestamp.match(self.welcome)
  161.         if not m:
  162.             raise error_proto('-ERR APOP not supported by server')
  163.         import hashlib
  164.         digest = hashlib.md5(m.group(1) + secret).digest()
  165.         digest = ''.join(map((lambda x: '%02x' % ord(x)), digest))
  166.         return self._shortcmd('APOP %s %s' % (user, digest))
  167.  
  168.     
  169.     def top(self, which, howmuch):
  170.         return self._longcmd('TOP %s %s' % (which, howmuch))
  171.  
  172.     
  173.     def uidl(self, which = None):
  174.         if which is not None:
  175.             return self._shortcmd('UIDL %s' % which)
  176.         return None._longcmd('UIDL')
  177.  
  178.  
  179.  
  180. try:
  181.     import ssl
  182. except ImportError:
  183.     pass
  184.  
  185.  
  186. class POP3_SSL(POP3):
  187.     
  188.     def __init__(self, host, port = POP3_SSL_PORT, keyfile = None, certfile = None):
  189.         self.host = host
  190.         self.port = port
  191.         self.keyfile = keyfile
  192.         self.certfile = certfile
  193.         self.buffer = ''
  194.         msg = 'getaddrinfo returns an empty list'
  195.         self.sock = None
  196.         for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
  197.             (af, socktype, proto, canonname, sa) = res
  198.             
  199.             try:
  200.                 self.sock = socket.socket(af, socktype, proto)
  201.                 self.sock.connect(sa)
  202.             except socket.error:
  203.                 msg = None
  204.                 if self.sock:
  205.                     self.sock.close()
  206.                 self.sock = None
  207.                 continue
  208.  
  209.         
  210.         if not self.sock:
  211.             raise socket.error, msg
  212.         self.file = self.sock.makefile('rb')
  213.         self.sslobj = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
  214.         self._debugging = 0
  215.         self.welcome = self._getresp()
  216.  
  217.     
  218.     def _fillBuffer(self):
  219.         localbuf = self.sslobj.read()
  220.         if len(localbuf) == 0:
  221.             raise error_proto('-ERR EOF')
  222.         self.buffer += localbuf
  223.  
  224.     
  225.     def _getline(self):
  226.         line = ''
  227.         renewline = re.compile('.*?\\n')
  228.         match = renewline.match(self.buffer)
  229.         while not match:
  230.             self._fillBuffer()
  231.             match = renewline.match(self.buffer)
  232.         line = match.group(0)
  233.         self.buffer = renewline.sub('', self.buffer, 1)
  234.         if self._debugging > 1:
  235.             print '*get*', repr(line)
  236.         octets = len(line)
  237.         if line[-2:] == CRLF:
  238.             return (line[:-2], octets)
  239.         if None[0] == CR:
  240.             return (line[1:-1], octets)
  241.         return (None[:-1], octets)
  242.  
  243.     
  244.     def _putline(self, line):
  245.         if self._debugging > 1:
  246.             print '*put*', repr(line)
  247.         line += CRLF
  248.         bytes = len(line)
  249.         while bytes > 0:
  250.             sent = self.sslobj.write(line)
  251.             if sent == bytes:
  252.                 break
  253.             line = line[sent:]
  254.             bytes = bytes - sent
  255.  
  256.     
  257.     def quit(self):
  258.         
  259.         try:
  260.             resp = self._shortcmd('QUIT')
  261.         except error_proto:
  262.             val = None
  263.             resp = val
  264.  
  265.         self.sock.close()
  266.         del self.sslobj
  267.         del self.sock
  268.         return resp
  269.  
  270.  
  271. __all__.append('POP3_SSL')
  272. if __name__ == '__main__':
  273.     import sys
  274.     a = POP3(sys.argv[1])
  275.     print a.getwelcome()
  276.     a.user(sys.argv[2])
  277.     a.pass_(sys.argv[3])
  278.     a.list()
  279.     (numMsgs, totalSize) = a.stat()
  280.     for i in range(1, numMsgs + 1):
  281.         (header, msg, octets) = a.retr(i)
  282.         print 'Message %d:' % i
  283.         for line in msg:
  284.             print '   ' + line
  285.         
  286.         print '-----------------------'
  287.     
  288.     a.quit()
  289.