a DOg]@sVddlZddlZddlZddlZddlZddlZddlZddlZddl 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(z ddl)Z)Wne*y~d)Z+Yn0d*Z+Gd+d,d,Z,e+rGd-d.d.e,Z-e.d.d/Z/Gd0d1d1e,Z0e1d2krRd3d4Z2e2d5Z3e2d64d7Z5e6d8d9Z7e j89Z:e:sqe7e:Z7qe6d:e;e7e,d;Ze3e5e7etj|\}}||fdkr6|dr.|Sd|Sd|S)Nr%)emailutils parseaddrstrip startswithZ addrstringZ displaynameaddrrrrr s  r cCs$tj|\}}||fdkr |S|S)Nr$)r'r(r)r,rrr _addr_onlys r.c Cstddtdt|S)Nz(?m)^\.z..(?:\r\n|\n|\r(?!\n))resubCRLFdatarrrrs rcCstdd|S)Ns(?m)^\.s..)r1r2)Zbindatarrr_quote_periodssr6cCstdt|S)Nr/r0r4rrr _fix_eolssr7FTc@sveZdZdZdZdZdZdZdZdZ e Z ddde j dfddZddZd d Zd d Zd dZddZdMddZddZdNddZddZdOddZdPddZdQddZd d!ZdRd"d#Zd$d%Zd&d'Zd(d)ZdSd+d,Z dTd-d.Z!d/d0Z"d1d2Z#e#Z$d3d4Z%d5d6Z&d7d8d9d:Z'dUd;d<Z(dVd=d>Z)dWd?d@Z*d7d8dAdBZ+dXdCdDZ,dYdEdFZ-dZdGdHZ.dIdJZ/dKdLZ0dS)[rrNehlor%c Cs||_||_i|_d|_||_d|_|rR|||\}}|dkrR|t|||durb||_ nNt }d|vrz||_ n6d} zt t } Wnt jyYn0d| |_ dS)Nasciir.z 127.0.0.1z[%s])_hosttimeoutesmtp_featurescommand_encodingsource_address_auth_challenge_countconnectcloser local_hostnamesocketgetfqdn gethostbyname gethostnamegaierror) rhostportrDr=r@rrZfqdnr-rrrr s, z SMTP.__init__cCs|Srrrrrr __enter__szSMTP.__enter__cGsTzDz$|d\}}|dkr$t||Wnty8Yn0W|n |0dS)NZQUIT)docmdrrrC)rrrmessagerrr__exit__s z SMTP.__exit__cCs ||_dSr) debuglevel)rrRrrrset_debuglevel"szSMTP.set_debuglevelcGsB|jdkr.ttjg|Rdtjint|dtjidS)Nfile)rRprintdatetimeZnowtimesysstderrrrrrr _print_debug+s $zSMTP._print_debugcCsF|dur|std|jdkr2|d||f|jt||f||jS)N0Non-blocking socket (timeout=0) is not supportedrz connect: to) ValueErrorrRr\r@rEcreate_connection)rrJrKr=rrr _get_socket1s   zSMTP._get_socket localhostcCs|r ||_|sz|d|dkrz|d}|dkrz|d|||dd}}z t|}WntyxtdYn0|s|j}td|||| |||j |_ d|_ | \}}|jdkr|dt|||fS)N:rrTznonnumeric portzsmtplib.connectconnect:)r@findrfindintr^OSError default_portrYauditr`r=sockrUgetreplyrRr\repr)rrJrKr@irrrrrrB;s&      z SMTP.connectcCs|jdkr|dt||jrzt|tr6||j}t d||z|j |Wqt yv| t dYq0nt ddS)Nrzsend:z smtplib.sendServer not connectedzplease run connect() first)rRr\rlrj isinstancestrencoder?rYrisendallrgrCr)rsrrrsend\s    z SMTP.sendcCsd|dkr|}n|d|}d|vs,d|vrN|dddd}td|||tdS)Nr%   z\nz\rz=command and arguments contain prohibited newline characters: )replacer^rtr3)rcmdrrsrrrputcmdosz SMTP.putcmdc CsPg}|jdur|jd|_z|jtd}Wn<tyl}z$|tdt|WYd}~n d}~00|s|td|j dkr| dt |t |tkr|t dd||d dd |dd }z t|}Wntyd }Yq Yn0|d d d krq qd|}|j dkrH| d||f||fS)NrbrTz Connection unexpectedly closed: zConnection unexpectedly closedrzreply:izLine too long.s - zreply: retcode (%s); Msg: %a)rUrjmakefilereadline_MAXLINErgrCrrprRr\rllenrappendr*rfr^join)rresplineerZerrcodeerrmsgrrrrk|s>          z SMTP.getreplycCs||||Srrzrk)rryrrrrrOs z SMTP.docmdcCs,|d|p|j|\}}||_||fS)Nhelo)rzrDrk helo_resp)rnamerrrrrrs z SMTP.heloc Cs.i|_||j|p|j|\}}|dkrJt|dkrJ|td||_|dkr`||fSd|_ |j d d}|d=|D]}t |}|r|jdd d |dd|jd<qt d |}|r|d }|j|d d} |dkr|j|d d | |j|<q| |j|<q||fS) Nr~rrnrTzlatin-1rwauthr%ruz((?P[A-Za-z0-9][A-Za-z0-9\-]*) ?feature)r>rzehlo_msgrDrkrrCr ehlo_resp does_esmtpdecodesplit OLDSTYLE_AUTHmatchgetgroupsr1grouplowerstringendr*) rrrrreachZ auth_matchmrparamsrrrr8sB         z SMTP.ehlocCs||jvSr)rr>)roptrrrhas_extnsz SMTP.has_extncCs|d||dS)NhelprTrr[rrrrs z SMTP.helpcCsd|_|dS)Nr9rset)r?rOrLrrrrsz SMTP.rsetcCs$z |WntyYn0dSr)rrrLrrr_rsets  z SMTP._rsetcCs |dS)Nnoop)rOrLrrrr sz SMTP.nooprcCshd}|rH|jrHtdd|Dr:|dr2d|_ntddd|}|dd t||f|S) Nr%css|]}|dkVqdS)smtputf8N)r).0xrrr zSMTP.mail..rzutf-8z SMTPUTF8 not supported by serverrumailz FROM:%s%s) ranyrr?rrrzr rk)rr"options optionlistrrrrs   z SMTP.mailcCs<d}|r|jrdd|}|ddt||f|S)Nr%rurcptzTO:%s%s)rrrzr rk)rZreciprrrrrr$s  z SMTP.rcptcCs|d|\}}|jdkr0|d||f|dkrDt||n|t|tr\t|d}t |}|ddt kr||t }|dt }| ||\}}|jdkr|d||f||fSdS)Nr5rzdata:ibr9.) rzrkrRr\r rorpr7rqr6bCRLFrt)rrrreplqrrrr5,s"         z SMTP.datacCs|dt||S)Nvrfyrzr.rkraddressrrrverifyIsz SMTP.verifycCs|dt||S)NexpnrrrrrrPsz SMTP.expncCsb|jdur^|jdur^d|dkr0dks^n|\}}d|krRdks^nt||dS)Nri+)rrr8rr )rrrrrrehlo_or_helo_if_neededWs  zSMTP.ehlo_or_helo_if_neededTinitial_response_okc Cs|}|r|nd}|durPt|ddd}|d|d|\}}d|_n|d|\}}d|_|dkr|jd7_t|}t||ddd}||\}}|jtkrftd t ||fqf|d vr||fSt ||dS) Nr9r%)ZeolZAUTHrurTriNz4Server AUTH mechanism infinite loop. Last response: i) upper encode_base64rqrOrAbase64Z decodebytes _MAXCHALLENGErrlr ) rZ mechanismZ authobjectrZinitial_responseresponserr challengerrrrhs0   z SMTP.authcCs0|dur dS|jdt|jd|dS)Nrur9md5)userhmacHMACpasswordrq hexdigestrrrrr auth_cram_md5s  zSMTP.auth_cram_md5cCsd|j|jfS)Nz%s%s)rrrrrr auth_plainszSMTP.auth_plaincCs"|dus|jdkr|jS|jSdS)N)rArrrrrr auth_loginszSMTP.auth_loginc s||dstd|jdgd}fdd|D}|sNtd|||_|_|D]v}d| dd }z4|j |t |||d \}} |d vr|| fWSWq`t y} z| } WYd} ~ q`d} ~ 00q`| dS) Nrz,SMTP AUTH extension not supported by server.)zCRAM-MD5ZPLAINZLOGINcsg|]}|vr|qSrr)rrZadvertised_authlistrr szSMTP.login..z(No suitable authentication method found.Zauth_-_rr) rrrr>rrrrrrxrgetattrr ) rrrrZpreferred_authsZauthlistZ authmethodZ method_namerrrZlast_exceptionrrrlogins.   z SMTP.logincCs||dstd|d\}}|dkrtsrr)rrrcontextrZreplyrrrrrs@  z SMTP.starttlsc Cs^|g}t|tr$t|d}|jrZ|drF|dt||D]}||qJ| ||\}} |dkr|dkr| n| t || |i} t|tr|g}|D]H} | | |\}} |dkr|dkr|| f| | <|dkr| t| qt| t|kr| t| ||\}} |dkrZ|dkrH| n| t|| | S)Nr9sizezsize=%dri)rrorpr7rqrrrrrrCrrrrr5r ) r from_addrto_addrsr mail_options rcpt_optionsZ esmtp_optsoptionrrZsenderrsrrrrsendmail(sF@            z SMTP.sendmailcCs||d}|dur d}nt|dkr2d}ntd|dur||d|vrZ||dn ||d}tj|gdd}|durd d ||d ||d ||d fD}dd tj|D}t|} | d =| d=d} zd|g| dWn,t y&| dst dd} Yn0t f} | rftjj| |jjddd} g|ddR}n tj| } | j| dd| } Wdn1s0Y|||| ||S)Nz Resent-Dater%rTzResent-z0message has more than one 'Resent-' header blockZSenderFromrcSsg|]}|dur|qSrr)rfrrrrsz%SMTP.send_message..ToZBccZCccSsg|] }|dqS)rTr)rarrrrrz Resent-BccFr9rzOne 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 getaddressescopyrrqUnicodeEncodeErrorrrioBytesIO generatorZBytesGeneratorrZcloneZflattengetvaluer)rrrrrrZresentZ header_prefixZ addr_fieldsZmsg_copy internationalZbytesmsggZflatmsgrrr send_messagesV           ( zSMTP.send_messagecCsTz4|j}d|_|r|W|j}d|_|rP|n|j}d|_|rN|0dSr)rUrCrj)rrUrjrrrrCs  z SMTP.closecCs.|d}d|_|_i|_d|_||S)NquitF)rOrrr>rrC)rresrrrrs   z SMTP.quit)rarN)r%)r%)r%)r%)r%)r)r)N)N)N)NNN)rr)NNrr)1rrrrRrjrUrrrr SMTP_PORTrhrE_GLOBAL_DEFAULT_TIMEOUTr rMrQrSr\r`rBrtrzrkrOrr8rrrrrrrr5rrrrrrrrrrrrrCrrrrrrsd 0   ! 1  3    0  B 8 h M rcs<eZdZeZdddddejddfddZfddZZ S)SMTP_SSLr%rNc Cs|dur|durtd|dur0|dur0td|dus@|durVddl} | dtd||_||_|durxtj||d}||_t ||||||dS)Nrrrrrr) r^rrrrrrrrrr ) rrJrKrDrrr=r@rrrrrr s&zSMTP_SSL.__init__cs@|jdkr|d||ft|||}|jj||jd}|S)Nrrcr)rRr\superr`rrr<)rrJrKr=Z new_socket __class__rrr`s zSMTP_SSL._get_socket) rrr SMTP_SSL_PORTrhrErr r` __classcell__rrr rrs rics<eZdZdZdeddejffdd Zd fdd ZZ S) LMTPZlhlor%Ncstj|||||ddS)N)rDr@r=)rr )rrJrKrDr@r=r rrr <s z LMTP.__init__rarcs|ddkrtj|||dS|jdur6|js6tdzBttjtj|_|jtjurd|j |jd|_ |j|Wn@t y|j dkr| d||jr|jd|_Yn0|\}}|j dkr| d|||fS)Nr/)r@r]z connect fail:rc)rrBr=r^rEAF_UNIX SOCK_STREAMrjr settimeoutrUrgrRr\rCrk)rrJrKr@rrr rrrBBs*         z LMTP.connect)rarN) rrrr LMTP_PORTrErr rBr rrr rr ,s r __main__cCs(tj|dtjtjS)Nz: )rYstdoutwriteflushstdinrr*)promptrrrras rrr,zEnter message, end with ^D:r%zMessage length is %drarT)@rErr1Z email.utilsr'Z email.messageZemail.generatorrrrrWrYZemail.base64mimerr__all__rr r3rrrcompileIrrgrrrrrrr r r r r r.rr6r7r ImportErrorrrrrrr rrZfromaddrrZtoaddrsrVrrrrrZserverrSrrrrrr,s       </ 4