o ?Ogw@sV ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m ZgdZdZdZdZdZdZd Zed ejZGd d d eZGd ddeZGdddeZGdddeZGdddeZGdddeZGdddeZ GdddeZ!GdddeZ"GdddeZ#dd Z$d!d"Z%d#d$Z&d%d&Z'd'd(Z(zddl)Z)Wn e*yd)Z+Ynwd*Z+Gd+d,d,Z,e+rGd-d.d.e,Z-e.d.d/Z/Gd0d1d1e,Z0e1d2kr)d3d4Z2e2d5Z3e2d64d7Z5e6d8d9Z7 e j89Z:e:sne7e:Z7qe6d;e;e7e,d<Ze3e5e7e)emailutils parseaddrstrip startswithZ addrstringZ displaynameaddrrrrr s r cCs$tj|\}}||fdkr|S|S)Nr')r*r+r,r/rrr _addr_onlys r1c Cs tddtdt|S)Nz(?m)^\.z..(?:\r\n|\n|\r(?!\n))resubCRLFdatarrrrs rcCstdd|S)Ns(?m)^\.s..)r4r5)Zbindatarrr_quote_periodsr9cCstdt|S)Nr2r3r7rrr _fix_eolsr:r;FTc@seZdZ dZdZdZdZdZdZdZ e Z ddde j dfddZdd Zd d Zd d ZddZddZdNddZddZdOddZddZdOddZdOddZdOdd Zd!d"ZdOd#d$Zd%d&Zd'd(Zd)d*ZdPd,d-Z dPd.d/Z!d0d1Z"d2d3Z#e#Z$d4d5Z%d6d7Z&d8d9d:d;Z'dQdd?Z)dQd@dAZ*d8d9dBdCZ+dRdDdEZ, + +dSdFdGZ-  +dTdHdIZ.dJdKZ/dLdMZ0dS)UrrNehloFr(c Cs ||_||_i|_d|_||_d|_|r*|||\}}|dkr*|t|||dur3||_ dSt }d|vr@||_ dSd} z t t } Wn t jyUYnwd| |_ dS)Nasciir.z 127.0.0.1z[%s])_hosttimeoutesmtp_featurescommand_encodingsource_address_auth_challenge_countconnectcloser local_hostnamesocketZgetfqdnZ gethostbynameZ gethostnameZgaierror) r hostportrHrArDr!r"Zfqdnr0rrrr#s0   z SMTP.__init__cCs|Srrr rrr __enter__szSMTP.__enter__cGs`z*z|d\}}|dkrt||Wn tyYnwW|dSW|dS|w)NZQUIT)docmdrrrG)r rr!messagerrr__exit__s   z SMTP.__exit__cCs ||_dSr) debuglevel)r rRrrrset_debuglevel"s zSMTP.set_debuglevelcGsD|jdkrttjg|RdtjidSt|dtjidS)Nfile)rRprintdatetimeZnowtimesysstderrr rrrr _print_debug+s &zSMTP._print_debugcCsF|dur |s td|jdkr|d||f|jt||f||jS)N0Non-blocking socket (timeout=0) is not supportedrz connect: to) ValueErrorrRr\rDrIZcreate_connection)r rJrKrArrr _get_socket1s   zSMTP._get_socket localhostcCs |r||_|s<|d|dkr<|d}|dkr<|d|||dd}}zt|}Wn ty;tdw|sA|j}td|||| |||j |_ d|_ | \}}|jdkrh|dt|||fS)N:rrTznonnumeric portzsmtplib.connectconnect:)rDfindrfindintr^OSError default_portrYauditr_rAsockrUgetreplyrRr\repr)r rJrKrDir!r"rrrrF;s*      z SMTP.connectcCs |jdkr|dt||jr[A-Za-z0-9][A-Za-z0-9\-]*) ?feature)rBrxehlo_msgrHrjrrGr ehlo_resp does_esmtpdecodesplit OLDSTYLE_AUTHmatchgetgroupsr4grouplowerstringendr-) r rr!r"reachZ auth_matchmrparamsrrrr<sF        z SMTP.ehlocCs ||jvSr)rrB)r optrrrhas_extnsz SMTP.has_extncCs |d||dS)NhelprTrr[rrrrs  z SMTP.helpcCs d|_|dS)Nr=rset)rCrOrLrrrrs z SMTP.rsetcCs& z|WdStyYdSwr)rrrLrrr_rsets  z SMTP._rsetcCs |dS)Nnoop)rOrLrrrr s z SMTP.nooprcCsj d}|r%|jr%tdd|Dr|drd|_ntddd|}|dd t||f|S) Nr(css|] }|dkVqdS)smtputf8N)r).0xrrr szSMTP.mail..rzutf-8z SMTPUTF8 not supported by serverrsmailz FROM:%s%s) ranyrrCrrrxr rj)r r%options optionlistrrrrs  z SMTP.mailcCs> d}|r|jrdd|}|ddt||f|S)Nr(rsrcptzTO:%s%s)rrrxr rj)r Zreciprrrrrr$s  z SMTP.rcptcCs |d|\}}|jdkr|d||f|dkr"t||t|tr.t|d}t |}|ddt kr>|t }|dt }| ||\}}|jdkr\|d||f||fS)Nr8rzdata:ibr=.) rxrjrRr\r rnror;rpr9bCRLFrr)r r"r!replqrrrr8,s$        z SMTP.datacC |dt||S)Nvrfyrxr1rjr ZaddressrrrverifyIz SMTP.verifycCr)NexpnrrrrrrPrz SMTP.expncCsp |jdur0|jdur2d|dkrdks4n|\}}d|kr*dks6nt||dSdSdSdS)Nri+)rrr<rr )r r!rrrrehlo_or_helo_if_neededWs   zSMTP.ehlo_or_helo_if_neededTinitial_response_okc Cs |}|r |nd}|dur)t|ddd}|d|d|\}}d|_n |d|\}}d|_|dkri|jd7_t|}t||ddd}||\}}|jtkretd t ||f|dks8|d vrq||fSt ||) Nr=r()ZeolZAUTHrsrTriNz4Server AUTH mechanism infinite loop. Last response: i) upper encode_base64rprOrEbase64Z decodebytes _MAXCHALLENGErrkr ) r Z mechanismZ authobjectrZinitial_responseZresponser!r challengerrrrhs4     z SMTP.authcCs2 |durdS|jdt|jd|dS)Nrsr=Zmd5)userhmacZHMACpasswordrpZ hexdigestr rrrr auth_cram_md5s zSMTP.auth_cram_md5cCs d|j|jfS)Nz%s%s)rrrrrr auth_plainszSMTP.auth_plaincCs |dus |jdkr |jS|jS)N)rErrrrrr auth_loginszSMTP.auth_loginc s ||dstd|jdgd}fdd|D}|s(td|||_|_|D]:}d| dd }z|j |t |||d \}} |d vrV|| fWSWq1t yk} z| } WYd} ~ q1d} ~ ww| ) Nrz,SMTP AUTH extension not supported by server.)zCRAM-MD5ZPLAINZLOGINcsg|]}|vr|qSrr)rrZadvertised_authlistrr szSMTP.login..z(No suitable authentication method found.Zauth_-_rr) rrrrBrrrrrrvrgetattrr ) r rrrZpreferred_authsZauthlistZ authmethodZ method_namer!rrZlast_exceptionrrrlogins6   z SMTP.logincCs ||dstd|d\}}|dkrrtstd|dur+|dur+td|dur7|dur7td|dus?|durJddl}|d t d |durUt j ||d }|j |j |jd |_ d|_d|_d|_i|_d |_||fSt||)Nstarttlsz+STARTTLS extension not supported by server.ZSTARTTLSr>z&No SSL support included in this Python4context and keyfile arguments are mutually exclusive5context and certfile arguments are mutually exclusiverAkeyfile and certfile are deprecated, use a custom context insteadrcertfilekeyfileZserver_hostnameF)rrrrO _have_ssl RuntimeErrorr^warningswarnDeprecationWarningssl_create_stdlib_context wrap_socketrir@rUrrrBrr)r rrcontextrZreplyrrrrrsB  z SMTP.starttlsc CsZ |g}t|trt|d}|jr.|dr$|dt||D]}||q&| ||\}} |dkrM|dkrC| n| t || |i} t|trW|g}|D]$} | | |\}} |dkrq|dkrq|| f| | <|dkr}| t| qYt| t|kr| t| ||\}} |dkr|dkr| n| t|| | S)Nr=sizezsize=%dri)rrnror;rprrrrrrGrrrrr8r ) r from_addrto_addrsr" mail_options rcpt_optionsZ esmtp_optsZoptionr!rZsenderrsrrrrsendmail(sJ>         z SMTP.sendmailcCs ||d}|durd}n t|dkrd}ntd|dur?|d|vr.||dn||d}tj|gdd}|durdd d ||d ||d ||d fD}dd tj|D}t|} | d =| d=d} z d|g| dWnt y| dst dd} Ynwt 2} | rtjj| |jjddd} g|ddR}ntj| } | j| dd| } Wdn1swY|||| ||S)Nz Resent-Dater(rTzResent-z0message has more than one 'Resent-' header blockZSenderFromrcSsg|]}|dur|qSrr)rfrrrrsz%SMTP.send_message..ToZBccZCccSsg|]}|dqS)rTr)rarrrrsz Resent-BccFr=rzOne or more source or delivery addresses require internationalized email support, but the server does not advertise the required SMTPUTF8 capabilityT)utf8)policyZSMTPUTF8z BODY=8BITMIMEr)linesep)rZget_allrr^r*r+Z getaddressescopyrrpUnicodeEncodeErrorrrioBytesIO generatorZBytesGeneratorrZcloneZflattengetvaluer)r r"rrrrZresentZ header_prefixZ addr_fieldsZmsg_copyZ internationalZbytesmsggZflatmsgrrr send_messages\             zSMTP.send_messagecCsZ z|j}d|_|r|W|j}d|_|r|dSdS|j}d|_|r,|wwr)rUrGri)r rUrirrrrGs"  z SMTP.closecCs0 |d}d|_|_i|_d|_||S)NquitF)rOrrrBrrG)r resrrrrs  z SMTP.quitr`rN)r()rr)NNN)rr)NNrr)1rrrrRrirUrrrr SMTP_PORTrgrI_GLOBAL_DEFAULT_TIMEOUTr#rMrQrSr\r_rFrrrxrjrOrr<rrrrrrrr8rrrrrrrrrrrrrGrrrrrrsh 0   !  1  3    0  B8 h M rcs>eZdZ eZdddddejddfddZfddZZ S)SMTP_SSLr(rNc Cs|dur |dur td|dur|durtd|dus |dur+ddl} | dtd||_||_|dureZdZ dZdeddejffdd Zd fdd ZZ S) LMTPZlhlor(Ncs tj|||||ddS)N)rHrDrA)rr#)r rJrKrHrDrArrrr#<s  z LMTP.__init__r`rcs |ddkrtj|||dS|jdur|jstdz!ttjtj|_|jtjur3|j |jd|_ |j|Wnt y[|j dkrO| d||jrW|jd|_w|\}}|j dkrm| d|||fS)Nr/)rDr]z connect fail:rb)rrFrAr^rIZAF_UNIXZ SOCK_STREAMrirZ settimeoutrUrfrRr\rGrj)r rJrKrDr!r"rrrrFBs.         z LMTP.connectr) rrrr LMTP_PORTrIrr#rFrrrrrr,s r__main__cCs(tj|dtjtjS)Nz: )rYstdoutwriteflushstdinrr-)promptrrrr as r rr,zEnter message, end with ^D:r(rTzMessage length is %dr`)@rIrr4Z email.utilsr*Z email.messageZemail.generatorrrrrWrYZemail.base64mimerr__all__rrr6rrrcompileIrrfrrrrrrr r r r r r1rr9r;r ImportErrorrrrrrrrr ZfromaddrrZtoaddrsrVr"r rrrZserverrSrrrrrrs)       < / 4