同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
"""A POP3 client class.Based on the J. Myers POP3 draft, Jan. 96"""# Author: David Ascher <david_ascher@brown.edu># [heavily stealing from nntplib.py]# Updated: Piers Lauder <piers@cs.su.oz.au> [Jul '97]# String method conversion and test jig improvements by ESR, February 2001.# Added the POP3_SSL class. Methods loosely based on IMAP_SSL. Hector Urtubia <urtubia@mrbook.org> Aug 2003# Example (see the test function at the end of this file)# Importsimport errnoimport reimport socketimport systry:import sslHAVE_SSL = Trueexcept ImportError:HAVE_SSL = False__all__ = ["POP3","error_proto"]# Exception raised when an error or invalid response is received:class error_proto(Exception): pass# Standard PortPOP3_PORT = 110# POP SSL PORTPOP3_SSL_PORT = 995# Line terminators (we always output CRLF, but accept any of CRLF, LFCR, LF)CR = b'\r'LF = b'\n'CRLF = CR+LF# maximal line length when calling readline(). This is to prevent# reading arbitrary length lines. RFC 1939 limits POP3 line length to# 512 characters, including CRLF. We have selected 2048 just to be on# the safe side._MAXLINE = 2048class POP3:"""This class supports both the minimal and optional command sets.Arguments can be strings or integers (where appropriate)(e.g.: retr(1) and retr('1') both work equally well.Minimal Command Set:USER name user(name)PASS string pass_(string)STAT stat()LIST [msg] list(msg = None)RETR msg retr(msg)DELE msg dele(msg)NOOP noop()RSET rset()QUIT quit()Optional Commands (some servers support these):RPOP name rpop(name)APOP name digest apop(name, digest)TOP msg n top(msg, n)UIDL [msg] uidl(msg = None)CAPA capa()STLS stls()UTF8 utf8()Raises one exception: 'error_proto'.Instantiate with:POP3(hostname, port=110)NB: the POP protocol locks the mailbox from userauthorization until QUIT, so be sure to get in, suckthe messages, and quit, each time you access themailbox.POP is a line-based protocol, which means large mailmessages consume lots of python cycles reading themline-by-line.If it's available on your mail server, use IMAP4instead, it doesn't suffer from the two problemsabove."""encoding = 'UTF-8'def __init__(self, host, port=POP3_PORT,timeout=socket._GLOBAL_DEFAULT_TIMEOUT):self.host = hostself.port = portself._tls_established = Falsesys.audit("poplib.connect", self, host, port)self.sock = self._create_socket(timeout)self.file = self.sock.makefile('rb')self._debugging = 0self.welcome = self._getresp()def _create_socket(self, timeout):return socket.create_connection((self.host, self.port), timeout)def _putline(self, line):if self._debugging > 1: print('*put*', repr(line))sys.audit("poplib.putline", self, line)self.sock.sendall(line + CRLF)# Internal: send one command to the server (through _putline())def _putcmd(self, line):if self._debugging: print('*cmd*', repr(line))line = bytes(line, self.encoding)self._putline(line)# Internal: return one line from the server, stripping CRLF.# This is where all the CPU time of this module is consumed.# Raise error_proto('-ERR EOF') if the connection is closed.def _getline(self):line = self.file.readline(_MAXLINE + 1)if len(line) > _MAXLINE:raise error_proto('line too long')if self._debugging > 1: print('*get*', repr(line))if not line: raise error_proto('-ERR EOF')octets = len(line)# server can send any combination of CR & LF# however, 'readline()' returns lines ending in LF# so only possibilities are ...LF, ...CRLF, CR...LFif line[-2:] == CRLF:return line[:-2], octetsif line[:1] == CR:return line[1:-1], octetsreturn line[:-1], octets# Internal: get a response from the server.# Raise 'error_proto' if the response doesn't start with '+'.def _getresp(self):resp, o = self._getline()if self._debugging > 1: print('*resp*', repr(resp))if not resp.startswith(b'+'):raise error_proto(resp)return resp# Internal: get a response plus following text from the server.def _getlongresp(self):resp = self._getresp()list = []; octets = 0line, o = self._getline()while line != b'.':if line.startswith(b'..'):o = o-1line = line[1:]octets = octets + olist.append(line)line, o = self._getline()return resp, list, octets# Internal: send a command and get the responsedef _shortcmd(self, line):self._putcmd(line)return self._getresp()# Internal: send a command and get the response plus following textdef _longcmd(self, line):self._putcmd(line)return self._getlongresp()# These can be useful:def getwelcome(self):return self.welcomedef set_debuglevel(self, level):self._debugging = level# Here are all the POP commands:def user(self, user):"""Send user name, return response(should indicate password required)."""return self._shortcmd('USER %s' % user)def pass_(self, pswd):"""Send password, return response(response includes message count, mailbox size).NB: mailbox is locked by server from here to 'quit()'"""return self._shortcmd('PASS %s' % pswd)def stat(self):"""Get mailbox status.Result is tuple of 2 ints (message count, mailbox size)"""retval = self._shortcmd('STAT')rets = retval.split()if self._debugging: print('*stat*', repr(rets))numMessages = int(rets[1])sizeMessages = int(rets[2])return (numMessages, sizeMessages)def list(self, which=None):"""Request listing, return result.Result without a message number argument is in form['response', ['mesg_num octets', ...], octets].Result when a message number argument is given is asingle response: the "scan listing" for that message."""if which is not None:return self._shortcmd('LIST %s' % which)return self._longcmd('LIST')def retr(self, which):"""Retrieve whole message number 'which'.Result is in form ['response', ['line', ...], octets]."""return self._longcmd('RETR %s' % which)def dele(self, which):"""Delete message number 'which'.Result is 'response'."""return self._shortcmd('DELE %s' % which)def noop(self):"""Does nothing.One supposes the response indicates the server is alive."""return self._shortcmd('NOOP')def rset(self):"""Unmark all messages marked for deletion."""return self._shortcmd('RSET')def quit(self):"""Signoff: commit changes on server, unlock mailbox, close connection."""resp = self._shortcmd('QUIT')self.close()return respdef close(self):"""Close the connection without assuming anything about it."""try:file = self.fileself.file = Noneif file is not None:file.close()finally:sock = self.sockself.sock = Noneif sock is not None:try:sock.shutdown(socket.SHUT_RDWR)except OSError as exc:# The server might already have closed the connection.# On Windows, this may result in WSAEINVAL (error 10022):# An invalid operation was attempted.if (exc.errno != errno.ENOTCONNand getattr(exc, 'winerror', 0) != 10022):raisefinally:sock.close()#__del__ = quit# optional commands:def rpop(self, user):"""Not sure what this does."""return self._shortcmd('RPOP %s' % user)timestamp = re.compile(br'\+OK.[^<]*(<.*>)')def apop(self, user, password):"""Authorisation- only possible if server has supplied a timestamp in initial greeting.Args:user - mailbox user;password - mailbox password.NB: mailbox is locked by server from here to 'quit()'"""secret = bytes(password, self.encoding)m = self.timestamp.match(self.welcome)if not m:raise error_proto('-ERR APOP not supported by server')import hashlibdigest = m.group(1)+secretdigest = hashlib.md5(digest).hexdigest()return self._shortcmd('APOP %s %s' % (user, digest))def top(self, which, howmuch):"""Retrieve message header of message number 'which'and first 'howmuch' lines of message body.Result is in form ['response', ['line', ...], octets]."""return self._longcmd('TOP %s %s' % (which, howmuch))def uidl(self, which=None):"""Return message digest (unique id) list.If 'which', result contains unique id for that messagein the form 'response mesgnum uid', otherwise result isthe list ['response', ['mesgnum uid', ...], octets]"""if which is not None:return self._shortcmd('UIDL %s' % which)return self._longcmd('UIDL')def utf8(self):"""Try to enter UTF-8 mode (see RFC 6856). Returns server response."""return self._shortcmd('UTF8')def capa(self):"""Return server capabilities (RFC 2449) as a dictionary>>> c=poplib.POP3('localhost')>>> c.capa(){'IMPLEMENTATION': ['Cyrus', 'POP3', 'server', 'v2.2.12'],'TOP': [], 'LOGIN-DELAY': ['0'], 'AUTH-RESP-CODE': [],'EXPIRE': ['NEVER'], 'USER': [], 'STLS': [], 'PIPELINING': [],'UIDL': [], 'RESP-CODES': []}>>>Really, according to RFC 2449, the cyrus folks should avoidhaving the implementation split into multiple arguments..."""def _parsecap(line):lst = line.decode('ascii').split()return lst[0], lst[1:]caps = {}try:resp = self._longcmd('CAPA')rawcaps = resp[1]for capline in rawcaps:capnm, capargs = _parsecap(capline)caps[capnm] = capargsexcept error_proto as _err:raise error_proto('-ERR CAPA not supported by server')return capsdef stls(self, context=None):"""Start a TLS session on the active connection as specified in RFC 2595.context - a ssl.SSLContext"""if not HAVE_SSL:raise error_proto('-ERR TLS support missing')if self._tls_established:raise error_proto('-ERR TLS session already established')caps = self.capa()if not 'STLS' in caps:raise error_proto('-ERR STLS not supported by server')if context is None:context = ssl._create_stdlib_context()resp = self._shortcmd('STLS')self.sock = context.wrap_socket(self.sock,server_hostname=self.host)self.file = self.sock.makefile('rb')self._tls_established = Truereturn respif HAVE_SSL:class POP3_SSL(POP3):"""POP3 client class over SSL connectionInstantiate with: POP3_SSL(hostname, port=995, keyfile=None, certfile=None,context=None)hostname - the hostname of the pop3 over ssl serverport - port numberkeyfile - PEM formatted file that contains your private keycertfile - PEM formatted certificate chain filecontext - a ssl.SSLContextSee the methods of the parent class POP3 for more documentation."""def __init__(self, host, port=POP3_SSL_PORT, keyfile=None, certfile=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT, context=None):if context is not None and keyfile is not None:raise ValueError("context and keyfile arguments are mutually ""exclusive")if context is not None and certfile is not None:raise ValueError("context and certfile arguments are mutually ""exclusive")if keyfile is not None or certfile is not None:import warningswarnings.warn("keyfile and certfile are deprecated, use a ""custom context instead", DeprecationWarning, 2)self.keyfile = keyfileself.certfile = certfileif context is None:context = ssl._create_stdlib_context(certfile=certfile,keyfile=keyfile)self.context = contextPOP3.__init__(self, host, port, timeout)def _create_socket(self, timeout):sock = POP3._create_socket(self, timeout)sock = self.context.wrap_socket(sock,server_hostname=self.host)return sockdef stls(self, keyfile=None, certfile=None, context=None):"""The method unconditionally raises an exception since theSTLS command doesn't make any sense on an already establishedSSL/TLS session."""raise error_proto('-ERR TLS session already established')__all__.append("POP3_SSL")if __name__ == "__main__":import sysa = POP3(sys.argv[1])print(a.getwelcome())a.user(sys.argv[2])a.pass_(sys.argv[3])a.list()(numMsgs, totalSize) = a.stat()for i in range(1, numMsgs + 1):(header, msg, octets) = a.retr(i)print("Message %d:" % i)for line in msg:print(' ' + line)print('-----------------------')a.quit()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。