a 5êdgøåã@sšddlZddlZddlZddlmZddlmZddl Zddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZmZm Z ddl!m"Z"ej#Z#ej$d krd d „Z%e%e j&_%d d „Z'Gdd„dƒZ(Gdd„de(ej)ƒZ*Gdd„de(ej)ƒZ+dd„Z,dZ-dZ.Gdd„dej)ƒZ/Gdd„dej)ƒZ0Gdd„dej)ƒZ1Gdd„dej)ƒZ2Gd d!„d!ej)ƒZ3d"d#d$d%œZ4d&Z5d'Z6d(d)gd*gd+œZ7Gd,d-„d-e8ƒZ9Gd.d/„d/e j&ƒZ:Gd0d1„d1e j;ƒZGd6d7„d7ej)ƒZ?ed8d9d:Z@Gd;d<„d„d>e<ƒZBGd?d@„d@ej)ƒZCeDdAkr–e E¡dS)BéN)Ú EmailMessage)Ú body_encode)ÚsupportÚ mock_socket)Úhashlib_helper)Ú socket_helper)Úthreading_setupÚthreading_cleanupÚ join_thread)ÚMockÚdarwincCsdS©N©©Úselfrrú-/usr/local/lib/python3.9/test/test_smtplib.pyÚ handle_expt!src Cs´| ¡| ¡zŒz| ¡\}}Wntjy6YnT0d}|r‚|dkr‚t g|gg¡\}}}|rx| |¡} || d…}|d8}q<| ¡W| ¡| ¡n| ¡| ¡0dS)Niôré)ÚlistenÚsetÚacceptÚsocketÚtimeoutÚselectÚsendÚclose) ÚevtÚbufÚservÚconnÚaddrÚnÚrÚwÚeÚsentrrrÚserver&s$      ÿr&c@steZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„ZdS)Ú GeneralTestscCstt_d|_dS)Né)rÚsmtplibrÚportrrrrÚsetUp>szGeneralTests.setUpcCs tt_dSr )rr)rrrrÚtearDownBszGeneralTests.tearDowncCsd}d}| |t |¡¡dS)Nzabc .jkl foo ..bluezabc ..jkl foo ...blue)Ú assertEqualr)Z quotedata)rZteststrÚexpectedrrrÚ testQuoteDataGszGeneralTests.testQuoteDatacCs$t d¡| t|j¡}| ¡dS)Nó220 Hola mundo©rÚ reply_withÚclientÚHOSTr*r©rr3rrrÚ testBasic1Ls zGeneralTests.testBasic1cCs6t d¡|jt|jdd}| |jd¡| ¡dS)Nr0)z 127.0.0.1i¤M)Úsource_address)rr2r3r4r*r-r7rr5rrrÚtestSourceAddressRs   ÿzGeneralTests.testSourceAddresscCs*t d¡| dt|jf¡}| ¡dS)Nr0z%s:%sr1r5rrrÚ testBasic2Zs zGeneralTests.testBasic2cCs6t d¡|jt|jdd}| |jd¡| ¡dS)Nr0Ztesthost)Úlocal_hostname)rr2r3r4r*r-r:rr5rrrÚtestLocalHostName`s zGeneralTests.testLocalHostNamec Cszt d¡| t ¡¡t d¡| t ¡d¡z| t|j¡}Wt d¡n t d¡0| |j   ¡d¡|  ¡dS)Nr0é) rr2Ú assertIsNoneÚgetdefaulttimeoutÚsetdefaulttimeoutr-r3r4r*ÚsockÚ gettimeoutrr5rrrÚtestTimeoutDefaultgs  zGeneralTests.testTimeoutDefaultc Cslt d¡| t ¡¡t d¡z |jt|jdd}Wt d¡n t d¡0| |j   ¡¡|  ¡dS©Nr0r<©r) rr2r=rr>r?r3r4r*r@rArr5rrrÚtestTimeoutNoness  zGeneralTests.testTimeoutNonecCsJt d¡| t¡"|jt|jddWdƒn1s<0YdS)Nr0rrD)rr2Ú assertRaisesÚ ValueErrorr3r4r*rrrrÚtestTimeoutZero~s  zGeneralTests.testTimeoutZerocCs:t d¡|jt|jdd}| |j ¡d¡| ¡dSrC) rr2r3r4r*r-r@rArr5rrrÚtestTimeoutValueƒs zGeneralTests.testTimeoutValuecCs|t d¡| ¡}| d¡t ¡}| t|j¡Wdƒn1sH0Y|  ¡t   dt j ¡}|  | ¡|¡dS)Nó220 Hello worldrz ^connect:©rr2r3Zset_debuglevelrZcaptured_stderrÚconnectr4r*rÚreÚcompileÚ MULTILINEÚ assertRegexÚgetvalue©rr3Ústderrr.rrrÚtest_debuglevel‰s   ,zGeneralTests.test_debuglevelcCs|t d¡| ¡}| d¡t ¡}| t|j¡Wdƒn1sH0Y|  ¡t   dt j ¡}|  | ¡|¡dS)NrJéz#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rKrRrrrÚtest_debuglevel_2“s   ,ÿzGeneralTests.test_debuglevel_2N)Ú__name__Ú __module__Ú __qualname__r+r,r/r6r8r9r;rBrErHrIrTrVrrrrr'<s   r'c@seZdZejZdS)ÚSMTPGeneralTestsN)rWrXrYr)ÚSMTPr3rrrrrZŸsrZcs<eZdZejZe ee dƒd¡dd„ƒZ ‡fdd„Z ‡Z S)ÚLMTPGeneralTestsÚAF_UNIXz test requires Unix domain socketc CsTd}t d¡z| ||j¡}Wt d¡n t d¡0| |j ¡¡| ¡dS)Nú!/some/local/lmtp/delivery/programrJ) rr2r3r*r?r=r@rAr)rÚ local_hostr3rrrÚ"testUnixDomainSocketTimeoutDefault¨s z3LMTPGeneralTests.testUnixDomainSocketTimeoutDefaultcsJtƒ ¡d}| t¡|j|ddWdƒn1s<0YdS)Nr^rrD)ÚsuperrHrFrGr3)rr_©Ú __class__rrrH³s  z LMTPGeneralTests.testTimeoutZero) rWrXrYr)ZLMTPr3ÚunittestZ skipUnlessÚhasattrrr`rHÚ __classcell__rrrbrr\¤s r\c CsÔ| ¡zšzVttdƒrtj}ntj}d}tjr^|dkr^|dtjƒ| ¡rT| ¡q^|d8}q(Wnt j ytYn0W| ¡s’t   d¡| ¡t  ¡| ¡n,| ¡s¾t   d¡| ¡t  ¡| ¡0dS)NÚpollièrç{®Gáz„?rgà?)rrerÚasyncoreZpoll2rgZ socket_mapÚis_setrrrÚtimeÚsleepZ close_all)rÚserv_evtÚ client_evtZpoll_funr!rrrÚdebugging_serverºs0    û roz&---------- MESSAGE FOLLOWS ---------- z&------------ END MESSAGE ------------ c@sÈeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„ZdS)0ÚDebuggingServerTestsNcCsÌtƒ|_tj|_tjt_tj|_t   ¡|_ |j t_t   ¡|_t   ¡|_tj|_t   ¡t_tjtdfddd|_|jj ¡dd…\|_|_|j|j|jf}t jt|d|_|j ¡|j ¡|j ¡dS)Nr©ZnowhereéÿÿÿÿT©Ú decode_datarU©ÚtargetÚargs)rÚ thread_keyrÚgetfqdnÚ real_getfqdnrÚsysÚstdoutÚ old_stdoutÚioÚStringIOÚoutputÚ threadingÚEventrmrnÚsmtpdÚ DEBUGSTREAMÚold_DEBUGSTREAMZDebuggingServerr4rÚ getsocknameÚhostr*ÚThreadroÚthreadÚstartÚwaitÚclear©rZ serv_argsrrrr+æs&     ÿ  zDebuggingServerTests.setUpcCsZ|jt_|j ¡|j ¡t|jƒ|j t _ t j  ¡|jt _ |`| ¡t|jŽdSr )rzrryrnrrmr‹r r‰r}r{r|rƒr„rr…Ú doCleanupsr rxrrrrr,s    zDebuggingServerTests.tearDowncCs$|j ¡}tjdd|tjtjBdS)Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)Úflags)r€rQrMÚsubrOÚDOTALL)rÚ test_outputrrrÚget_output_without_xpeers  ÿz-DebuggingServerTests.get_output_without_xpeercCs"tjt|jdtjd}| ¡dS©NÚ localhost©r:r©r)r[r4r*rÚLOOPBACK_TIMEOUTÚquit©rÚsmtprrrÚ testBasics ÿzDebuggingServerTests.testBasicc Cs¨t ¡}zZtj|j|jdtj|j|fd}| |j ¡|  |j |j|f¡|  |j d¡|  ¡Wn@ty¢}z(|jtjkrŒ| d|¡‚WYd}~n d}~00dS)Nr•)r:rr7zcouldn't bind to source port %d)rZfind_unused_portr)r[r‡r*rr˜Ú addCleanuprr-r7r:r™ÚOSErrorÚerrnoZ EADDRINUSEZskipTest)rZsrc_portr›r$rrrr8sþ   z&DebuggingServerTests.testSourceAddresscCsBtjt|jdtjd}| |j¡d}| |  ¡|¡|  ¡dS©Nr•r–©éúsOK) r)r[r4r*rr˜rrr-Únoopr™©rr›r.rrrÚtestNOOP,s ÿ zDebuggingServerTests.testNOOPcCsBtjt|jdtjd}| |j¡d}| |  ¡|¡|  ¡dSr ) r)r[r4r*rr˜rrr-Zrsetr™r¤rrrÚtestRSET4s ÿ zDebuggingServerTests.testRSETcCsBtjt|jdtjd}| |j¡d}| |  ¡|¡|  ¡dS)Nr•r–)r¢s SIZE 33554432 HELP) r)r[r4r*rr˜rrr-Úehlor™r¤rrrÚtestELHO<s ÿ zDebuggingServerTests.testELHOcCsLtjt|jdtjd}| |j¡d}| d¡|  |  ¡|¡|  ¡dS)Nr•r–)iösEXPN not implementedZEXPN) r)r[r4r*rr˜rrZputcmdr-Zgetreplyr™r¤rrrÚtestEXPNNotImplementedEs ÿ  z+DebuggingServerTests.testEXPNNotImplementedcCsVtjt|jdtjd}| |j¡d}| |  d¡|¡| |  d¡|¡|  ¡dS)Nr•r–)éüs>Cannot VRFY user, but will accept message and attempt deliveryúnobody@nowhere.com) r)r[r4r*rr˜rrr-ÚvrfyZverifyr™r¤rrrÚtestVRFYOs ÿ zDebuggingServerTests.testVRFYcCsJtjt|jdtjd}| |j¡| ¡d}|  | ¡|¡|  ¡dS)Nr•r–)i÷sDuplicate HELO/EHLO) r)r[r4r*rr˜rrZhelor-r™r¤rrrÚtestSecondHELOYs ÿ z#DebuggingServerTests.testSecondHELOcCs>tjt|jdtjd}| |j¡| |  ¡d¡|  ¡dS)Nr•r–s@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY) r)r[r4r*rr˜rrr-Úhelpr™ršrrrÚtestHELPds  ÿ zDebuggingServerTests.testHELPcCsˆd}tjt|jdtjd}| |j¡| dd|¡t   d¡|  ¡|j   ¡|j ¡|j ¡dt|tf}| |j ¡|¡dS)NúA test messager•r–ÚJohnÚSallyrhú%s%s %s©r)r[r4r*rr˜rrÚsendmailrkrlr™rnrrmr‹r€ÚflushÚ MSG_BEGINÚMSG_ENDr-rQ©rÚmr›ÚmexpectrrrÚtestSendls ÿ     zDebuggingServerTests.testSendcCsŽd}tjt|jdtjd}| |j¡| dd|¡t   d¡|  ¡|j   ¡|j ¡|j ¡dt| d¡tf}| |j ¡|¡dS) NsA test messager•r–r²r³rhr´Úascii)r)r[r4r*rr˜rrr¶rkrlr™rnrrmr‹r€r·r¸Údecoder¹r-rQrºrrrÚtestSendBinarys ÿ     z#DebuggingServerTests.testSendBinarycCsˆd}tjt|jdtjd}| |j¡| dd|¡t   d¡|  ¡|j   ¡|j ¡|j ¡dt|tf}| |j ¡|¡dS)Nz.A test .mes.sage.r•r–r²r³rhr´rµrºrrrÚtestSendNeedingDotQuotes ÿ     z,DebuggingServerTests.testSendNeedingDotQuotecCs¬d}tjt|jdtjd}| |j¡| dd|¡t   d¡|  ¡|j   ¡|j ¡|j ¡dt|tf}| |j ¡|¡tj ¡}t dtj¡}| ||¡dS) Nr±r•r–z<>r³rhr´z ^sender: <>$)r)r[r4r*rr˜rrr¶rkrlr™rnrrmr‹r€r·r¸r¹r-rQrƒr„rMrNrOrP)rr»r›r¼ÚdebugoutÚsenderrrrÚtestSendNullSender s  ÿ      z'DebuggingServerTests.testSendNullSendercCs tjj d¡}tjt|jdtj d}|  |j ¡|j |dddt  d¡| ¡|j ¡|j ¡|j ¡| ¡}|d=d t| ¡tf}| ||¡dS) Nr±r•r–r²r³©Z from_addrZto_addrsrhúX-Peerr´)ÚemailÚmimeÚtextÚMIMETextr)r[r4r*rr˜rrÚ send_messagerkrlr™rnrrmr‹r€r·r“r¸Ú as_stringr¹r-)rr»r›r’r¼rrrÚtestSendMessage³s ÿ     z$DebuggingServerTests.testSendMessagec Cstjj d¡}d|d<d|d<d|d<d|d <tjt|jd tj d }|  |j ¡|  |¡t  d ¡| ¡| |d d¡|j ¡|j ¡|j ¡| ¡}|d =|d =dt| ¡tf}| ||¡tj ¡}t dtj ¡}| !||¡dD]$}t d "|¡tj ¡}| !||¡qôdS)Nr±ú foo@bar.comÚFromr²ÚToú Sally, FredÚCCú?John Root , "Dinsdale" ÚBccr•r–rhrÆr´ú^sender: foo@bar.com$)r²r³ZFredzroot@localhostzwarped@silly.walks.comú^recips: .*'{}'.*$)#rÇrÈrÉrÊr)r[r4r*rr˜rrrËrkrlr™r-rnrrmr‹r€r·r“r¸rÌr¹rƒr„rQrMrNrOrPÚformat© rr»r›r’r¼rÂrÃr Úto_addrrrrÚtestSendMessageWithAddressesÉs: ÿ          ÿz1DebuggingServerTests.testSendMessageWithAddressesc Csøtjj d¡}d|d<d|d<tjt|jdtj d}|  |j ¡|  |¡t  d¡| ¡|j ¡|j ¡|j ¡| ¡}|d =d t| ¡tf}| ||¡tj ¡}t d tj ¡}| !||¡d D]$}t d  "|¡tj ¡}| !||¡qÎdS)Nr±rÎrÏúJohn, DinsdalerÐr•r–rhrÆr´rÕ©r²ÚDinsdalerÖ©#rÇrÈrÉrÊr)r[r4r*rr˜rrrËrkrlr™rnrrmr‹r€r·r“r¸rÌr¹r-rƒr„rQrMrNrOrPr×rØrrrÚ testSendMessageWithSomeAddressesís2 ÿ          ÿz5DebuggingServerTests.testSendMessageWithSomeAddressesc Cstjj d¡}d|d<d|d<tjt|jdtj d}|  |j ¡|j |dd d t  d ¡| ¡|j ¡|j ¡|j ¡| ¡}|d =d t| ¡tf}| ||¡tj ¡}t dtj ¡}| !||¡dD]$}t d "|¡tj ¡}| #||¡qÔt dtj ¡} | !|| ¡dS)Nr±rÎrÏrÛrÐr•r–zjoe@example.comzfoo@example.netrÅrhrÆr´z^sender: joe@example.com$rÜrÖz^recips: .*'foo@example.net'.*$)$rÇrÈrÉrÊr)r[r4r*rr˜rrrËrkrlr™rnrrmr‹r€r·r“r¸rÌr¹r-rƒr„rQrMrNrOrPr×ZassertNotRegex) rr»r›r’r¼rÂrÃr rÙZreciprrrÚ%testSendMessageWithSpecifiedAddresses s6 ÿ         ÿz:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc Cstjj d¡}d|d<d|d<d|d<tjt|jdtj d }|  |j ¡|  |¡t  d ¡| ¡|j ¡|j ¡|j ¡| ¡}|d =d t| ¡tf}| ||¡tj ¡}t d tj ¡}| !||¡dD]$}t d "|¡tj ¡}| !||¡qÖdS)Nr±zBernard, BiancarÏz#the_rescuers@Rescue-Aid-Society.comZSenderrÛrÐr•r–rhrÆr´z-^sender: the_rescuers@Rescue-Aid-Society.com$rÜrÖrÞrØrrrÚtestSendMessageWithMultipleFrom)s4 ÿ          ÿz4DebuggingServerTests.testSendMessageWithMultipleFromc Cs6tjj d¡}d|d<d|d<d|d<d|d <d |d <d |d <d|d<d|d<tjt|jdtj d}|  |j ¡|  |¡t  d¡| ¡|j ¡|j ¡|j ¡|d =|d=| ¡}|d=dt| ¡tf}| ||¡tj ¡}t dtj ¡}| !||¡dD]&}t d "|¡tj ¡}| !||¡q dS)Nr±rÎrÏr²rÐrÑrÒrÓrÔúThu, 1 Jan 1970 17:42:00 +0000ú Resent-Dateúholy@grail.netú Resent-Fromú&Martha , Jeffú Resent-Toúdoe@losthope.netú Resent-Bccr•r–rhrÆr´z^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffrèrÖrÞrØrrrÚtestSendMessageResentGsB ÿ          ÿz*DebuggingServerTests.testSendMessageResentcCsÈtjj d¡}d|d<d|d<d|d<d|d <d |d <d |d <d|d<d|d<d|d <d |d<d|d <tjt|jdtj d}|  |j ¡|  t ¡| |¡Wdƒn1s²0Y|  ¡dS)Nr±rÎrÏr²rÐrÑrÒrÓrÔrârãrärårærçrèrézThu, 2 Jan 1970 17:42:00 +0000r•r–)rÇrÈrÉrÊr)r[r4r*rr˜rrrFrGrË©rr»r›rrrÚ#testSendMessageMultipleResentRaisesls& ÿ  (z8DebuggingServerTests.testSendMessageMultipleResentRaises)rWrXrYÚmaxDiffr+r,r“rœr8r¥r¦r¨r©r­r®r°r½rÀrÁrÄrÍrÚrßràrárêrìrrrrrpâs0    $%rpc@s$eZdZdd„Zdd„Zdd„ZdS)ÚNonConnectingTestscCs.t ¡}| tj|j¡| tj|jd¡dS)Nztest msg)r)r[rFÚSMTPServerDisconnectedr§rršrrrÚtestNotConnected‚s ÿz#NonConnectingTests.testNotConnectedcCs&| ttjdd¡| ttjd¡dS)Nr•Zboguszlocalhost:bogus)rFržr)r[rrrrÚtestNonnumericPortŒs  ÿ ÿz%NonConnectingTests.testNonnumericPortcCs8t ¡}| |j¡Wdƒn1s*0YdSr )r)r[r=r@ršrrrÚtestSockAttributeExists“s z*NonConnectingTests.testSockAttributeExistsN)rWrXrYrðrñròrrrrrî€s rîc@s$eZdZdd„Zdd„Zdd„ZdS)ÚDefaultArgumentsTestscCsDtƒ|_d|jd<t ¡|_tdd|j_tƒtƒ|j_|j_dS)NõPáolo rÏ)éÈZOK)Z return_value) rÚmsgr)r[r›r r§Úhas_extnr¶rrrrr+s   zDefaultArgumentsTests.setUpcCs`d}|j |j¡|j |j¡| |jjjddd|¡| |jjjddd|¡dS)N)ÚSMTPUTF8ú BODY=8BITMIMErér©r›rËrör-r¶Zcall_args_list)rÚexpected_mail_optionsrrrrͤsÿÿz%DefaultArgumentsTests.testSendMessagecCsNdg}d}|j |jdd|¡| |dg¡| |jjjddd|¡dS)NÚSTARTTLS)rýrørùrrúrû)rÚ mail_optionsrürrrÚtestSendMessageWithMailOptions­sÿz4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rWrXrYr+rÍrÿrrrrró›s róc@s$eZdZdd„Zdd„Zdd„ZdS)ÚBadHELOServerTestscCs4tt_t d¡tj|_t ¡|_ |j t_d|_ dS)Ns199 no hello for you!r() rr)rr2r{r|r}r~rr€r*rrrrr+¹s   zBadHELOServerTests.setUpcCstt_|jt_dSr )rr)r}r{r|rrrrr,ÁszBadHELOServerTests.tearDowncCs| tjtjt|jdd¡dS©Nr•rú)rFr)ZSMTPConnectErrorr[r4r*rrrrÚtestFailingHELOÅs  ÿz"BadHELOServerTests.testFailingHELON)rWrXrYr+r,rrrrrr·src@s:eZdZddejddZdd„Zdd„Zd d „Zd S) ÚTooLongLineTestss250 OKó.rUó cCsštƒ|_tj|_t ¡|_|jt_t  ¡|_ t   t j t j ¡|_|j d¡t |j¡|_|j |j|jf}tjt|d|_|j ¡|j  ¡|j  ¡dS)Néru)rrxr{r|r}r~rr€rr‚rrÚAF_INETÚ SOCK_STREAMr@Ú settimeoutrZ bind_portr*Úrespdatarˆr&r‰rŠr‹rŒ)rZservargsrrrr+Ís     zTooLongLineTests.setUpcCs6|j ¡|jt_t|jƒ|`| ¡t|j ŽdSr ) rr‹r}r{r|r r‰rŽr rxrrrrr,Ýs   zTooLongLineTests.tearDowncCs| tjtjt|jdd¡dSr)rFr)ÚSMTPResponseExceptionr[r4r*rrrrÚtestLineTooLongås  ÿz TooLongLineTests.testLineTooLongN) rWrXrYr)Z_MAXLINEr r+r,r rrrrrÊsrzJohn AzSally BzRuth C)úMr.A@somewhere.comúMs.B@xn--fo-fka.comúMrs.C@somewhereesle.com)r Z somepasswordzrz+SimSMTPChannel.__init__..)ÚjoinÚ_extrafeaturesrarÚ__init__)rZextra_featuresrwÚkwrbrrrs ÿzSimSMTPChannel.__init__c s˜|j|jkrŠ|j |j¡}tdt|ƒtjdg|_z|  |¡WnBt y„}z*|j |_|  d|j |jf¡WYd}~n d}~00dStƒ ¡dS)NzData:)Úfileú%s %s)Ú smtp_stateÚAUTHZ _emptystringrZreceived_linesÚprintÚreprrƒr„Ú auth_objectrÚCOMMANDÚpushÚ smtp_codeÚ smtp_errorraÚfound_terminator)rÚliner$rbrrr' s ,zSimSMTPChannel.found_terminatorcCsä|js| d¡dS|jr$d|jvr2| d¡dS|jdurJ| d¡dS| ¡}t|ƒdvrl| d¡dSd|d ¡ d d ¡}zt ||ƒ|_ Wn$t y¸| d   |¡¡YdS0|j |_|  t|ƒd krÚ|d nd¡dS)Nz503 Error: send EHLO firstrz(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)rrUz/501 Syntax: AUTH [initial-response]z_auth_%srú-Ú_zQ504 Command parameter not implemented: unsupported authentication mechanism {!r}rUr)Ú seen_greetingr$Ú extended_smtprÚauthenticated_userÚsplitÚlenÚlowerÚreplaceÚgetattrr"ÚAttributeErrorr×rr)rÚargrwZauth_object_namerrrÚ smtp_AUTHs2   ÿ   ÿzSimSMTPChannel.smtp_AUTHcCs,|r||_| d¡n | d¡|j|_dS)Nz235 Authentication Succeededz&535 Authentication credentials invalid)r-r$r#r)rÚuserZvalidrrrÚ_authenticated1s   zSimSMTPChannel._authenticatedcCst | d¡¡ d¡S)Nr¾úutf-8)Úbase64Z decodebytesÚencoder¿)rÚstringrrrÚ_decode_base649szSimSMTPChannel._decode_base64c Cs†|dur| d¡nn| |¡}z| d¡^}}}Wn8tyl}z | d ||¡¡WYd}~dSd}~00| ||tdk¡dS)Nz334 úú=535 Splitting response {!r} into user and password failed: {}r)r$r<r.rGr×r7Úsim_auth)rr4Úlogpassr*r6Úpasswordr$rrrÚ _auth_plain<s  ÿzSimSMTPChannel._auth_plaincCs^|dur| d¡nFt|dƒs6| |¡|_| d¡n$| |¡}| |j|tdk¡|`dS)Nz334 VXNlcm5hbWU6Ú_auth_login_userz334 UGFzc3dvcmQ6r)r$rer<rCr7r?)rr4rArrrÚ _auth_loginIs     zSimSMTPChannel._auth_logincCs| d¡dS)Nz334 QnVHZ1liVWdHeQ==)r$©rr4rrrÚ _auth_buggyVszSimSMTPChannel._auth_buggyc Csª|dur| d t¡¡nŒ| |¡}z| ¡\}}Wn8tyl}z | d ||¡¡WYd}~dSd}~00t td  d¡| t¡  d¡d¡  ¡}|  |||k¡dS)Nz334 {}r>Frr¾Úmd5) r$r×Úsim_cram_md5_challenger<r.rGÚhmacZHMACr?r:Ú hexdigestr7)rr4r@r6Z hashed_passr$Zvalid_hashed_passrrrÚ_auth_cram_md5[s  ÿ ýzSimSMTPChannel._auth_cram_md5cCs,d}||jd}| |¡||_d|_dS)NzH250-testhost 250-EXPN 250-SIZE 20000000 250-STARTTLS 250-DELIVERBY z250 HELPT)rr$r+r,)rr4ÚresprrrÚ smtp_EHLOms  zSimSMTPChannel.smtp_EHLOcCs8|tvr&| dt|t |¡f¡n| d|¡dS)Nú 250 %s %sz550 No such user: %s)Ú sim_usersr$r)Ú quoteaddrrErrrÚ smtp_VRFYxszSimSMTPChannel.smtp_VRFYcCs‚| ¡}|tvrtt|}t|ƒD]P\}}t |¡}|t|ƒdkrZ| dt||f¡q | dt||f¡q n | d¡dS)Nrz 250-%s %srNz550 No access for you!)r0Ú sim_listsÚ enumerater)rPr/r$rO)rr4Z list_nameZ user_listr!Z user_emailZ quoted_addrrrrÚ smtp_EXPNs zSimSMTPChannel.smtp_EXPNcs4|jdurtt|ƒ |¡n| |j¡| ¡dSr )Ú quit_responserarÚ smtp_QUITr$Úclose_when_donerErbrrrVŒs  zSimSMTPChannel.smtp_QUITcs6|jdurtƒ |¡n| |j¡|jr2| ¡dSr )Ú mail_responseraÚ smtp_MAILr$Ú disconnectrWrErbrrrY“s   zSimSMTPChannel.smtp_MAILcsB|jdurtƒ |¡dS|jd7_| |j|jd¡dS©Nr)Ú rcpt_responseraÚ smtp_RCPTÚ rcpt_countr$rErbrrr]›s   zSimSMTPChannel.smtp_RCPTcs|jd7_tƒ |¡dSr[)Ú rset_countraÚ smtp_RSETrErbrrr`¢szSimSMTPChannel.smtp_RSETcs(|jdurtƒ |¡n | |j¡dSr )Ú data_responseraÚ smtp_DATAr$rErbrrrb¦s zSimSMTPChannel.smtp_DATAcCs‚dSr rrrrrÚ handle_error¬szSimSMTPChannel.handle_error)N)N)N)N)rWrXrYrUrXr\rar^r_rZrr-rr'r5r7r<rBrDrFrKrMrQrTrVrYr]r`rbrcrfrrrbrrøs6          rc@s8eZdZeZdd„Zdd„Zdd„Zdd„Zd d „Z d S) Ú SimSMTPServercOs*g|_i|_tjj|g|¢Ri|¤ŽdSr )Ú_extra_featuresÚ _addressesrƒÚ SMTPServerr©rrwrrrrr´szSimSMTPServer.__init__cCs|j|j||||jd|_dS)Nrs)Ú channel_classreÚ _decode_dataÚ _SMTPchannel©rrr rrrÚhandle_accepted¹s þzSimSMTPServer.handle_acceptedcCs||jd<||jd<dS)NÚfromÚtos)rf)rÚpeerÚmailfromÚrcpttosÚdatarrrÚprocess_message¾s zSimSMTPServer.process_messagecCs|j |¡dSr )reÚappend)rZfeaturerrrÚ add_featureÂszSimSMTPServer.add_featurecCs‚dSr rrrrrrcÅszSimSMTPServer.handle_errorN) rWrXrYrrirrmrtrvrcrrrrrd°s rdc@sèeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z e d¡dd„ƒZe d¡dd„ƒZdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4S)5Ú SMTPSimTestscCs”tƒ|_tj|_tjt_t ¡|_t ¡|_ t t dfddd|_ |j j  ¡d|_|j |j|j f}tjt|d|_|j ¡|j ¡|j ¡dS©NrrqTrsrru)rrxrryrzrrr‚rmrnrdr4rr†r*rˆror‰rŠr‹rŒrrrrr+Ís    zSMTPSimTests.setUpcCs@|jt_|j ¡|j ¡t|jƒ|`|  ¡t |j ŽdSr © rzrryrnrrmr‹r r‰rŽr rxrrrrr,ßs   zSMTPSimTests.tearDowncCs"tjt|jdtjd}| ¡dSr”r—ršrrrrœês ÿzSMTPSimTests.testBasiccCs€tjt|jdtjd}| |ji¡ddddddœ}| ¡| |j|¡|D]}|  |  |¡¡qN|  |  d¡¡|  ¡dS)Nr•r–rZ20000000)ÚexpnÚsizeZstarttlsZ deliverbyr¯zunsupported-feature) r)r[r4r*rr˜r-Úesmtp_featuresr§Ú assertTruer÷Ú assertFalser™)rr›Zexpected_featuresÚkrrrÚtestEHLOðs  ÿüzSMTPSimTests.testEHLOcCsŠtjt|jdtjd}t ¡D]6\}}dtd|t  |¡fdƒf}|  |  |¡|¡qd}dd|  d¡f}|  |  |¡|¡|  ¡dS) Nr•r–r¢rr¾r«é&zNo such user: %s)r)r[r4r*rr˜rOÚitemsÚbytesrPr-r¬r:r™)rr›Z addr_specÚnameÚexpected_knownÚuÚexpected_unknownrrrr­s ÿ ÿþzSMTPSimTests.testVRFYc Csžtjt|jdtjd}t ¡D]X\}}g}|D] }| dt |t  |¡f¡q.dt d  |¡dƒf}|  | |¡|¡qd}d}|  | |¡|¡| ¡dS) Nr•r–rr¢Ú r¾zPSU-Members-List)rsNo access for you!)r)r[r4r*rr˜rRr‚rurOrPrƒrr-rzr™) rr›ZlistnameÚmembersZusersr»r…r†r‡rrrÚtestEXPNs ÿzSMTPSimTests.testEXPNcCsN|j d¡tjt|jdtjd}| t dt d¡}|  |d¡|  ¡dS)Nú AUTH PLAINr•r–rr©éësAuthentication Succeeded© rrvr)r[r4r*rr˜Úloginr?r-r©rr›rLrrrÚtestAUTH_PLAIN%s  ÿ zSMTPSimTests.testAUTH_PLAINcCsN|j d¡tjt|jdtjd}| t dt d¡}|  |d¡|  ¡dS)Nú AUTH LOGINr•r–rrrŒrŽrrrrÚtestAUTH_LOGIN-s  ÿ zSMTPSimTests.testAUTH_LOGINcCsz|j d¡tjt|jdtjdD}t\|_ |_ |  d¡|j d|j dd}| |d¡Wdƒn1sl0YdS) Nr’r•r–Útest_auth_loginÚLOGINT©Zinitial_response_okrŒ©rrvr)r[r4r*rr˜r?r6rAr§ÚauthZ auth_loginr-rrrrÚ"testAUTH_LOGIN_initial_response_ok5s  ÿ  z/SMTPSimTests.testAUTH_LOGIN_initial_response_okcCsz|j d¡tjt|jdtjdD}t\|_ |_ |  d¡|j d|j dd}| |d¡Wdƒn1sl0YdS) Nr’r•r–r”r•Fr–rŒr—rrrrÚ%testAUTH_LOGIN_initial_response_notok>s  ÿ  z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokcs¤ˆj d¡d ‡fdd„ }tjtˆjdtjd}zdt\|_ |_ |  d¡d}ˆ  tj |¡ }|jd|d d Wdƒn1s€0YW| ¡n | ¡0dS) Nz AUTH BUGGYcsˆ d|¡dS)Ns BuGgYbUgGyr=)r-)Z challengerrrÚ auth_buggyJs z/SMTPSimTests.testAUTH_BUGGY..auth_buggyr•r–Ztest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr–)N)rrvr)r[r4r*rr˜r?r6rAr§ZassertRaisesRegexZ SMTPExceptionr˜r)rr›r›ÚexpectÚcmrrrÚtestAUTH_BUGGYGs þ  0zSMTPSimTests.testAUTH_BUGGYrGcCsN|j d¡tjt|jdtjd}| t dt d¡}|  |d¡|  ¡dS)Nz AUTH CRAM-MD5r•r–rrrŒrŽrrrrÚtestAUTH_CRAM_MD5[s  ÿ zSMTPSimTests.testAUTH_CRAM_MD5cCsN|j d¡tjt|jdtjd}| t dt d¡}|  |d¡|  ¡dS)NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r•r–rrrŒrŽrrrrÚtestAUTH_multipleds  ÿ zSMTPSimTests.testAUTH_multiplec Csøddh}z t ¡Wnty&Yn 0| d¡|D]}|j d |¡¡q6|D] }|j|d€tj t |j dt j d}| d¡td td |_|_d | ¡ d d ¡}| |t||ƒ¡}| |d¡| ¡WdƒqR1sè0YqRdS)NZPLAINr•zCRAM-MD5zAUTH {})Ú mechanismr•r–ZfoorrZauth_r)r*rŒ)ÚhashlibrGrGÚaddrrvr×ZsubTestr)r[r4r*rr˜r§r?r6rAr0r1r˜r2r-r)rZ supportedr¡r›ÚmethodrLrrrÚtest_auth_functionns(    þ  zSMTPSimTests.test_auth_functioncCstjt|jdtjd}| ¡\}}| |d¡| d|j ¡|  ¡|  d|j ¡|  t|j¡|  d|j ¡|  ¡| d|j ¡|  ¡dS)Nr•r–r¢r{)r)r[r4r*rr˜r§r-ÚassertInr|r™Z assertNotInrLZehlo_or_helo_if_needed©rr›ÚcodeÚmessagerrrÚtest_quit_resets_greeting„s þ  z&SMTPSimTests.test_quit_resets_greetingcCs¤t t|j¡(}| ¡\}}| |d¡Wdƒn1s<0Y| tj|jd¡t t|j¡}|  ¡Wdƒn1s„0Y| tj|jd¡dS)Nr¢sfoo) r)r[r4r*r£r-rFrïrrr§rrrÚtest_with_statement“s *&z SMTPSimTests.test_with_statementc Cs| tj¡P}t t|j¡"}| ¡d|jj_ Wdƒn1sD0YWdƒn1sb0Y|  |j j d¡|  |j j d¡dS)Nz421 QUIT FAILEDé¥s QUIT FAILED)rFr)r r[r4r*r£rrkrUr-Ú exceptionr%r&)rÚerrorr›rrrÚ test_with_statement_QUIT_failureœs Fz-SMTPSimTests.test_with_statement_QUIT_failurecCs|tjt|jdtjd}| ¡d|jj_ d|jj_ |  tj ¡|  ddd¡Wdƒn1sb0Y| |j¡dS)Nr•r–z451 Requested action abortedTr²r³ú test message)r)r[r4r*rr˜r£rrkrXrZrFÚSMTPSenderRefusedr¶r=r@ršrrrÚtest__rest_from_mail_cmd¨s ÿ  ,z%SMTPSimTests.test__rest_from_mail_cmdcCs„tjt|jdtjd}| ¡d|jj_ |  tj ¡|  ddd¡Wdƒn1sX0Y|  |j¡| |jjjd¡dS)Nr•r–z421 closing connectionr²r³r°r)r)r[r4r*rr˜r£rrkrXrFr±r¶r=r@r-r_ršrrrÚtest_421_from_mail_cmd³s ÿ , z#SMTPSimTests.test_421_from_mail_cmdcCs¤tjt|jdtjd}| ¡ddg|jj_ |  tj ¡"}|  dgd¢d¡Wdƒn1s`0Y|  |j¡| |jjjd¡| |jjdd d i¡dS) Nr•r–z 250 acceptedú 421 closingr²)r³ÚFrankZGeorger°rrµ)r¬sclosing)r)r[r4r*rr˜r£rrkr\rFZSMTPRecipientsRefusedr¶r=r@r-r_ÚassertDictEqualr­rw)rr›r"rrrÚtest_421_from_rcpt_cmd½s ÿ0 z#SMTPSimTests.test_421_from_rcpt_cmdcCs”Gdd„dtƒ}||j_tjt|jdtjd}|  ¡|  tj ¡ |  ddgd¡Wdƒn1sh0Y|  |j¡| |jjjd¡dS) NcseZdZ‡fdd„Z‡ZS)z=SMTPSimTests.test_421_from_data_cmd..MySimSMTPChannelcs&|j|jkr| d¡n tƒ ¡dS)Nr´)rZDATAr$rar'rrbrrr'Ês  zNSMTPSimTests.test_421_from_data_cmd..MySimSMTPChannel.found_terminator)rWrXrYr'rfrrrbrÚMySimSMTPChannelÉsr¸r•r–z John@foo.orgz Sally@foo.orgr°r)rrrir)r[r4r*rr˜r£rFZ SMTPDataErrorr¶r=r@r-rkr^)rr¸r›rrrÚtest_421_from_data_cmdÈs ÿ. z#SMTPSimTests.test_421_from_data_cmdcCs‚tjt|jdtjd}| |j¡| ¡|  |j ¡|  |  d¡¡|j tj|jdddddgd |j tj|jdddgd dS) Nr•r–Úsmtputf8r²r³rrùrø©rþ©Úoptions)r)r[r4r*rr˜rrr§r}Ú does_esmtpr~r÷rFÚSMTPNotSupportedErrorr¶ÚmailršrrrÚ4test_smtputf8_NotSupportedError_if_no_server_supportØs"þ   ý þzASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportcCsJtjt|jdtjd}| |j¡| t |j ddd¡| t |j d¡dS)Nr•r–ZAliceuBöbruÄlice) r)r[r4r*rr˜rrrFÚUnicodeEncodeErrorr¶rÀršrrrÚ"test_send_unicode_without_SMTPUTF8èsþ z/SMTPSimTests.test_send_unicode_without_SMTPUTF8cCsztƒ}d|d<d|d<d|d<tjt|jdtjd}| |j¡|  tj ¡|  |¡Wdƒn1sl0YdS) NrôrÏrÝrÐõNudge nudge, wink, wink á½ 9ÚSubjectr•r–) rr)r[r4r*rr˜rrrFr¿rË)rrör›rrrÚ9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8ðsþ zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8cCsˆtjt|jdtjd}| |j¡tƒ}t j   d¡|d<t j   d¡|d<|  |  |¡i¡| |jjdd¡| |jjd d g¡dS) Nr•r–)uMichaëlúmichael@example.comrÏ)uRenéúrene@example.comrÐrnrÇrorÈ)r)r[r4r*rr˜rrrrÇZutilsZ formataddrr¶rËr-rrf)rr›r©rrrÚ1test_name_field_not_included_in_envelop_addressesþsþ z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rWrXrYr+r,rœr€r­rŠr‘r“r™ršržrZrequires_hashdigestrŸr r¥rªr«r¯r²r³r·r¹rÁrÃrÆrÉrrrrrwËs6          rwc@s&eZdZdd„Zdd„Zddd„ZdS) ÚSimSMTPUTF8ServercOs(ddg|_tjj|g|¢Ri|¤ŽdS)NrøZ8BITMIME)rerƒrgrrhrrrrs zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd|_dS)N©rtÚenable_SMTPUTF8)rirerjrÌrkrlrrrrms  ýz!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dSr )Z last_peerÚ last_mailfromÚ last_rcpttosÚ last_messageÚlast_mail_optionsÚlast_rcpt_options)rrprqrrrsrþZ rcpt_optionsrrrrts z!SimSMTPUTF8Server.process_message)NN)rWrXrYrrmrtrrrrrÊs ÿrÊc@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)ÚSMTPUTF8SimTestsNcCs–tƒ|_tj|_tjt_t ¡|_t ¡|_ t t dfdddd|_ |j j  ¡d|_|j |j|j f}tjt|d|_|j ¡|j ¡|j ¡dS)NrrqFTrËrru)rrxrryrzrrr‚rmrnrÊr4rr†r*rˆror‰rŠr‹rŒrrrrr+,s   þ  zSMTPUTF8SimTests.setUpcCs@|jt_|j ¡|j ¡t|jƒ|`|  ¡t |j ŽdSr ryrrrrr,@s   zSMTPUTF8SimTests.tearDowncCsJtjt|jdtjd}| |j¡| ¡|  |j ¡|  |  d¡¡dS)Nr•r–rº) r)r[r4r*rr˜rrr§r}r¾r÷ršrrrÚ$test_test_server_supports_extensionsKsþ  z5SMTPUTF8SimTests.test_test_server_supports_extensionscCs¨d d¡}tjt|jdtjd}| |j¡|j dd|ddgd |  |j j d¡|  |j j dg¡|  |j j|¡| d|j j¡| d|j j¡|  |j jg¡dS) Nõ$¡a test message containing unicode!r8r•r–uJÅ‘hnuSállyrùrør»)r:r)r[r4r*rr˜rrr¶r-rrÍrÎrÏr¦rÐrÑrërrrÚ,test_send_unicode_with_SMTPUTF8_via_sendmailTs þ  ÿz=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmailcCsØd d¡}tjt|jdtjd}| |j¡|  ¡|  |j dddgdd ¡|  |  d ¡d ¡|  |  |¡d ¡|  |jjd¡|  |jjd g¡|  |jj|¡| d|jj¡| d|jj¡|  |jjg¡dS) NrÔr8r•r–uJÅ‘rùrør¼r¡uJános)r:r)r[r4r*rr˜rrr§r-rÀZrcptrsrrÍrÎrÏr¦rÐrÑrërrrÚ1test_send_unicode_with_SMTPUTF8_via_low_level_APIcs& þ þzBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_APIcCsÐtƒ}d|d<d|d<d|d<| d¡t d¡}tjt|jd tj d }|  |j ¡|  |  |¡i¡|  |jjd ¡|  |jjdg¡|  |jj ¡|¡| d |jj¡| d |jj¡|  |jjg¡dS)NrôrÏrÝrÐrÄrÅu1oh là là, know what I mean, know what I mean? u< From: Páolo To: Dinsdale Subject: Nudge nudge, wink, wink á½ 9 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit MIME-Version: 1.0 oh là là, know what I mean, know what I mean? r•r–u fÅ‘o@bar.comrùrø)rZ set_contentÚtextwrapÚdedentr)r[r4r*rr˜rrr-rËrrÍrÎrÏr¿r¦rÐrÑ)rrör.r›rrrÚ2test_send_message_uses_smtputf8_if_addrs_non_asciivs$  þ zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii) rWrXrYrír+r,rÓrÕrÖrÙrrrrrÒ(s  rÒspsudoesnotexistr)Zeolc@seZdZdd„ZdS)Ú!SimSMTPAUTHInitialResponseChannelcCsL| ¡}|d ¡dkr>t|ƒdkr>|dtkr>| d¡dS| d¡dS)NrÚplainrUrz235 Okz571 Bad authentication)r.r0r/ÚEXPECTED_RESPONSEr$)rr4rwrrrr5šs   z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rWrXrYr5rrrrrÚ™srÚc@seZdZeZdS)Ú SimSMTPAUTHInitialResponseServerN)rWrXrYrÚrirrrrrݨsrÝc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚSMTPAUTHInitialResponseSimTestscCs”tƒ|_tj|_tjt_t ¡|_t ¡|_ t t dfddd|_ |j j  ¡d|_|j |j|j f}tjt|d|_|j ¡|j ¡|j ¡dSrx)rrxrryrzrrr‚rmrnrÝr4rr†r*rˆror‰rŠr‹rŒrrrrr+­s   ÿ  z%SMTPAUTHInitialResponseSimTests.setUpcCs@|jt_|j ¡|j ¡t|jƒ|`|  ¡t |j ŽdSr ryrrrrr,Às   z(SMTPAUTHInitialResponseSimTests.tearDowncCs:|j d¡tjt|jdtjd}| dd¡|  ¡dS)Nr‹r•r–ÚpsuÚ doesnotexist) rrvr)r[r4r*rr˜rrršrrrÚ%testAUTH_PLAIN_initial_response_loginËs   ÿ zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_logincCsX|j d¡tjt|jdtjd}d|_d|_ |  d|j ¡\}}|  ¡|  |d¡dS)Nr‹r•r–rßràrÛr)rrvr)r[r4r*rr˜r6rAr˜Z auth_plainrr-)rr›r¨ÚresponserrrÚ$testAUTH_PLAIN_initial_response_authÒs  ÿzDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rWrXrYr+r,rárãrrrrrÞ¬s rÞÚ__main__)Frir9Zemail.mime.textrÇZ email.messagerZemail.base64mimerZ encode_base64Z email.utilsr¢rIrrƒr)r~rMr{rkrrŸr×rrdÚtestrrZ test.supportrrrr r Z unittest.mockr r4ÚplatformrZ SMTPChannelr&r'ZTestCaserZr\ror¸r¹rprîrórrrOr?rHrRÚ ExceptionrrrgrdrwrÊrÒrÜrÚrÝrÞrWÚmainrrrrÚs†      c! þÿ9Eo 1