Pc@sdZddlZddlZddgZdefdYZdZdZdZd Z ee Z dfd YZ yddl Z Wne k rn$Xd e fd YZejd ed krddlZe ejdZejGHejejdejejdejej\ZZx[ededD]FZeje\ZZZ deGHxeD]Z!de!GHqxWdGHqJWej"ndS(s@A POP3 client class. Based on the J. Myers POP3 draft, Jan. 96 iNtPOP3t error_protocBseZRS((t__name__t __module__(((s..\python\lib\poplib.pyRsinis s cBseZdZeejdZdZdZdZ dZ dZ dZ dZ d Zd Zd Zd Zd ZddZdZdZdZdZdZdZejdZdZdZddZ RS(sThis 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) Raises one exception: 'error_proto'. Instantiate with: POP3(hostname, port=110) NB: the POP protocol locks the mailbox from user authorization until QUIT, so be sure to get in, suck the messages, and quit, each time you access the mailbox. POP is a line-based protocol, which means large mail messages consume lots of python cycles reading them line-by-line. If it's available on your mail server, use IMAP4 instead, it doesn't suffer from the two problems above. cCs^||_||_tj||f||_|jjd|_d|_|j|_ dS(Ntrbi( thosttporttsockettcreate_connectiontsocktmakefiletfilet _debuggingt_getresptwelcome(tselfRRttimeout((s..\python\lib\poplib.pyt__init__Os    cCs?|jdkr!dGt|GHn|jjd|tfdS(Nis*put*s%s%s(R treprR tsendalltCRLF(Rtline((s..\python\lib\poplib.pyt_putlineYscCs,|jrdGt|GHn|j|dS(Ns*cmd*(R RR(RR((s..\python\lib\poplib.pyt_putcmd`s cCs|jj}|jdkr0dGt|GHn|sEtdnt|}|dtkro|d |fS|dtkr|dd!|fS|d |fS(Nis*get*s-ERR EOFiii(R treadlineR RRtlenRtCR(RRtoctets((s..\python\lib\poplib.pyt_getlineis cCs\|j\}}|jdkr3dGt|GHn|d }|dkrXt|n|S(Nis*resp*t+(RR RR(Rtresptotc((s..\python\lib\poplib.pyR {s  cCs|j}g}d}|j\}}x`|dkr|d dkr`|d}|d}n||}|j||j\}}q-W|||fS(Nit.is..i(R Rtappend(RRtlistRRR((s..\python\lib\poplib.pyt _getlongresps     cCs|j||jS(N(RR (RR((s..\python\lib\poplib.pyt _shortcmds cCs|j||jS(N(RR$(RR((s..\python\lib\poplib.pyt_longcmds cCs|jS(N(R(R((s..\python\lib\poplib.pyt getwelcomescCs ||_dS(N(R (Rtlevel((s..\python\lib\poplib.pytset_debuglevelscCs|jd|S(sVSend user name, return response (should indicate password required). sUSER %s(R%(Rtuser((s..\python\lib\poplib.pyR*scCs|jd|S(sSend password, return response (response includes message count, mailbox size). NB: mailbox is locked by server from here to 'quit()' sPASS %s(R%(Rtpswd((s..\python\lib\poplib.pytpass_scCs`|jd}|j}|jr6dGt|GHnt|d}t|d}||fS(s]Get mailbox status. Result is tuple of 2 ints (message count, mailbox size) tSTATs*stat*ii(R%tsplitR Rtint(Rtretvaltretst numMessagest sizeMessages((s..\python\lib\poplib.pytstats  cCs*|dk r|jd|S|jdS(sRequest 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 a single response: the "scan listing" for that message. sLIST %stLISTN(tNoneR%R&(Rtwhich((s..\python\lib\poplib.pyR#s cCs|jd|S(soRetrieve whole message number 'which'. Result is in form ['response', ['line', ...], octets]. sRETR %s(R&(RR7((s..\python\lib\poplib.pytretrscCs|jd|S(sFDelete message number 'which'. Result is 'response'. sDELE %s(R%(RR7((s..\python\lib\poplib.pytdelescCs |jdS(sXDoes nothing. One supposes the response indicates the server is alive. tNOOP(R%(R((s..\python\lib\poplib.pytnoopscCs |jdS(s(Unmark all messages marked for deletion.tRSET(R%(R((s..\python\lib\poplib.pytrsetscCsYy|jd}Wntk r.}|}nX|jj|jj|`|`|S(sDSignoff: commit changes on server, unlock mailbox, close connection.tQUIT(R%RR tcloseR (RRtval((s..\python\lib\poplib.pytquits    cCs|jd|S(sNot sure what this does.sRPOP %s(R%(RR*((s..\python\lib\poplib.pytrpopss\+OK.*(<[^>]+>)cCs|jj|j}|s*tdnddl}|j|jd|j}djt d|}|j d||fS(s Authorisation - only possible if server has supplied a timestamp in initial greeting. Args: user - mailbox user; secret - secret shared between client and server. NB: mailbox is locked by server from here to 'quit()' s!-ERR APOP not supported by serveriNitcSsdt|S(Ns%02x(tord(tx((s..\python\lib\poplib.pytss APOP %s %s( t timestamptmatchRRthashlibtmd5tgrouptdigesttjointmapR%(RR*tsecrettmRIRL((s..\python\lib\poplib.pytapops  "cCs|jd||fS(sRetrieve message header of message number 'which' and first 'howmuch' lines of message body. Result is in form ['response', ['line', ...], octets]. s TOP %s %s(R&(RR7thowmuch((s..\python\lib\poplib.pyttop#scCs*|dk r|jd|S|jdS(sReturn message digest (unique id) list. If 'which', result contains unique id for that message in the form 'response mesgnum uid', otherwise result is the list ['response', ['mesgnum uid', ...], octets] sUIDL %stUIDLN(R6R%R&(RR7((s..\python\lib\poplib.pytuidl,s N(!RRt__doc__t POP3_PORTRt_GLOBAL_DEFAULT_TIMEOUTRRRRR R$R%R&R'R)R*R,R4R6R#R8R9R;R=RARBtretcompileRGRQRSRU(((s..\python\lib\poplib.pyR$s4(                 tPOP3_SSLcBsDeZdZedddZdZdZdZdZ RS(sPOP3 client class over SSL connection Instantiate with: POP3_SSL(hostname, port=995, keyfile=None, certfile=None) hostname - the hostname of the pop3 over ssl server port - port number keyfile - PEM formatted file that countains your private key certfile - PEM formatted certificate chain file See the methods of the parent class POP3 for more documentation. c CsR||_||_||_||_d|_d}d|_xtj|j|jdtj D]}|\}}} } } y,tj||| |_|jj | Wn;tj k r}|jr|jj nd|_q^nXPq^W|jstj |n|jj d|_tj|j|j|j|_d|_|j|_dS(NRCs!getaddrinfo returns an empty listiR(RRtkeyfiletcertfiletbufferR6R Rt getaddrinfot SOCK_STREAMtconnectterrorR?R R tsslt wrap_sockettsslobjR R R( RRRR\R]tmsgtrestaftsocktypetprotot canonnametsa((s..\python\lib\poplib.pyRJs0      (   ! cCsC|jj}t|dkr0tdn|j|7_dS(Nis-ERR EOF(RetreadRRR^(Rtlocalbuf((s..\python\lib\poplib.pyt _fillBufferdscCsd}tjd}|j|j}x&|sO|j|j|j}q*W|jd}|jd|jd|_|jdkrdGt|GHnt |}|dt kr|d |fS|dt kr|dd!|fS|d |fS(NRCs.*?\niis*get*ii( RYRZRHR^RoRKtsubR RRRR(RRt renewlineRHR((s..\python\lib\poplib.pyRjs    cCs|jdkr!dGt|GHn|t7}t|}xF|dkr|jj|}||krhPn||}||}q:WdS(Nis*put*i(R RRRRetwrite(RRtbytestsent((s..\python\lib\poplib.pyR|s    cCsLy|jd}Wntk r.}|}nX|jj|`|`|S(sDSignoff: commit changes on server, unlock mailbox, close connection.R>(R%RR R?Re(RRR@((s..\python\lib\poplib.pyRAs   N( RRRVt POP3_SSL_PORTR6RRoRRRA(((s..\python\lib\poplib.pyR[=s     t__main__iiis Message %d:s s-----------------------(#RVRYRt__all__t ExceptionRRWRuRtLFRRRct ImportErrorR[R"RtsystargvtaR'R*R,R#R4tnumMsgst totalSizetrangetiR8theaderRfRRRA(((s..\python\lib\poplib.pyts>    T