Ńň 6ŐUc @sŠdZddkZddkZddgZdefd„ƒYZdZdZdZd Z ee Z dfd „ƒYZ yddk Z Wne j on%Xd e fd „ƒYZeid ƒed joÚddkZe eidƒZeiƒGHeieidƒeieidƒeiƒeiƒ\ZZx[ededƒD]FZeieƒ\ZZZ deGHxeD]Z!de!GHq{WdGHqMWei"ƒndS(s@A POP3 client class. Based on the J. Myers POP3 draft, Jan. 96 i˙˙˙˙NtPOP3t error_protocBseZRS((t__name__t __module__(((s/usr/lib/python2.6/poplib.pyRsiniăs s cBsűeZdZeeid„Zd„Zd„Zd„Z d„Z d„Z d„Z d„Z d „Zd „Zd „Zd „Zd „Zdd„Zd„Zd„Zd„Zd„Zd„Zd„ZeidƒZd„Zd„Zdd„Z RS(sĎ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) 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^||_||_ti||f|ƒ|_|iidƒ|_d|_|iƒ|_ dS(Ntrbi( thosttporttsockettcreate_connectiontsocktmakefiletfilet _debuggingt_getresptwelcome(tselfRRttimeout((s/usr/lib/python2.6/poplib.pyt__init__Os    cCsA|idjodGt|ƒGHn|iid|tfƒdS(Nis*put*s%s%s(R treprR tsendalltCRLF(Rtline((s/usr/lib/python2.6/poplib.pyt_putlineYscCs.|iodGt|ƒGHn|i|ƒdS(Ns*cmd*(R RR(RR((s/usr/lib/python2.6/poplib.pyt_putcmd`s cCsŚ|iiƒ}|idjodGt|ƒGHn|ptdƒ‚nt|ƒ}|dtjo|d |fS|dtjo|dd!|fS|d |fS(Nis*get*s-ERR EOFiţ˙˙˙ii˙˙˙˙(R treadlineR RRtlenRtCR(RRtoctets((s/usr/lib/python2.6/poplib.pyt_getlineis cCs`|iƒ\}}|idjodGt|ƒGHn|d }|djot|ƒ‚n|S(Nis*resp*t+(RR RR(Rtresptotc((s/usr/lib/python2.6/poplib.pyR {s  cCsž|iƒ}g}d}|iƒ\}}xd|djoV|d djo|d}|d}n||}|i|ƒ|iƒ\}}q-W|||fS(Nit.is..i(R Rtappend(RRtlistRRR((s/usr/lib/python2.6/poplib.pyt _getlongresp†s     cCs|i|ƒ|iƒS(N(RR (RR((s/usr/lib/python2.6/poplib.pyt _shortcmd–s cCs|i|ƒ|iƒS(N(RR$(RR((s/usr/lib/python2.6/poplib.pyt_longcmds cCs|iS(N(R(R((s/usr/lib/python2.6/poplib.pyt getwelcome¤scCs ||_dS(N(R (Rtlevel((s/usr/lib/python2.6/poplib.pytset_debuglevel¨scCs|id|ƒS(sVSend user name, return response (should indicate password required). sUSER %s(R%(Rtuser((s/usr/lib/python2.6/poplib.pyR*ŽscCs|id|ƒS(s Send password, return response (response includes message count, mailbox size). NB: mailbox is locked by server from here to 'quit()' sPASS %s(R%(Rtpswd((s/usr/lib/python2.6/poplib.pytpass_śscCsb|idƒ}|iƒ}|iodGt|ƒ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/usr/lib/python2.6/poplib.pytstatŔs  cCs,|dj o|id|ƒS|idƒS(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/usr/lib/python2.6/poplib.pyR#Ís cCs|id|ƒS(soRetrieve whole message number 'which'. Result is in form ['response', ['line', ...], octets]. sRETR %s(R&(RR7((s/usr/lib/python2.6/poplib.pytretrŰscCs|id|ƒS(sFDelete message number 'which'. Result is 'response'. sDELE %s(R%(RR7((s/usr/lib/python2.6/poplib.pytdeleăscCs |idƒS(sXDoes nothing. One supposes the response indicates the server is alive. tNOOP(R%(R((s/usr/lib/python2.6/poplib.pytnoopëscCs |idƒS(s(Unmark all messages marked for deletion.tRSET(R%(R((s/usr/lib/python2.6/poplib.pytrsetóscCs[y|idƒ}Wntj o}|}nX|iiƒ|iiƒ|`|`|S(sDSignoff: commit changes on server, unlock mailbox, close connection.tQUIT(R%RR tcloseR (RRtval((s/usr/lib/python2.6/poplib.pytquitřs    cCs|id|ƒS(sNot sure what this does.sRPOP %s(R%(RR*((s/usr/lib/python2.6/poplib.pytrpopss\+OK.*(<[^>]+>)cCsŒ|ii|iƒ}|ptdƒ‚nddk}|i|idƒ|ƒiƒ}dit d„|ƒƒ}|i d||fƒS(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 serveri˙˙˙˙NitcSsdt|ƒS(s%02x(tord(tx((s/usr/lib/python2.6/poplib.pytss APOP %s %s( t timestamptmatchRRthashlibtmd5tgrouptdigesttjointmapR%(RR*tsecrettmRIRL((s/usr/lib/python2.6/poplib.pytapops  "cCs|id||fƒS(s­Retrieve 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/usr/lib/python2.6/poplib.pyttop#scCs,|dj o|id|ƒS|idƒS(sěReturn 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/usr/lib/python2.6/poplib.pytuidl,s N(!RRt__doc__t POP3_PORTRt_GLOBAL_DEFAULT_TIMEOUTRRRRR R$R%R&R'R)R*R,R4R6R#R8R9R;R=RARBtretcompileRGRQRSRU(((s/usr/lib/python2.6/poplib.pyR$s4(                 tPOP3_SSLcBsDeZdZeddd„Zd„Zd„Zd„Zd„Z RS(sÂPOP3 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 CsX||_||_||_||_d|_d}d|_x­ti|i|idti ƒD]Š}|\}}} } } y,ti||| ƒ|_|ii | ƒWn?ti j o0}|io|ii ƒnd|_q^nXPq^W|ipti |‚n|ii dƒ|_ti|i|i|iƒ|_d|_|iƒ|_dS(NRCs!getaddrinfo returns an empty listiR(RRtkeyfiletcertfiletbufferR6R Rt getaddrinfot SOCK_STREAMtconnectterrorR?R R tsslt wrap_sockettsslobjR R R( RRRR\R]tmsgtrestaftsocktypetprotot canonnametsa((s/usr/lib/python2.6/poplib.pyRJs2      "   ! cCsE|iiƒ}t|ƒdjotdƒ‚n|i|7_dS(Nis-ERR EOF(RetreadRRR^(Rtlocalbuf((s/usr/lib/python2.6/poplib.pyt _fillBufferdscCsüd}tidƒ}|i|iƒ}x(|p |iƒ|i|iƒ}q*W|idƒ}|id|idƒ|_|idjodGt|ƒGHnt |ƒ}|dt jo|d |fS|dt jo|dd!|fS|d |fS(NRCs.*?\niis*get*iţ˙˙˙i˙˙˙˙( RYRZRHR^RoRKtsubR RRRR(RRt renewlineRHR((s/usr/lib/python2.6/poplib.pyRjs"  cCsŠ|idjodGt|ƒGHn|t7}t|ƒ}xJ|djo<|ii|ƒ}||joPn||}||}q<WdS(Nis*put*i(R RRRRetwrite(RRtbytestsent((s/usr/lib/python2.6/poplib.pyR|s     cCsNy|idƒ}Wntj o}|}nX|iiƒ|`|`|S(sDSignoff: commit changes on server, unlock mailbox, close connection.R>(R%RR R?Re(RRR@((s/usr/lib/python2.6/poplib.pyRA‡s   N( RRRVt POP3_SSL_PORTR6RRoRRRA(((s/usr/lib/python2.6/poplib.pyR[=s     t__main__iiis Message %d:s s-----------------------(#RVRYRt__all__t ExceptionRRWRuRtLFRRRct ImportErrorR[R"RtsystargvtaR'R*R,R#R4tnumMsgst totalSizetrangetiR8theaderRfRRRA(((s/usr/lib/python2.6/poplib.pytsB   ˙T