B
    18™\Ê  ã               @   sN  d dl Z d dlZd dlZd dlmZ d dlmZ d dl	Zd dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZmZmZ d dlmZ ej dkrêdd	„ Z!e!ej"_!d
d„ Z#G dd„ dej$ƒZ%dd„ Z&dZ'dZ(G dd„ dej$ƒZ)G dd„ dej$ƒZ*G dd„ dej$ƒZ+G dd„ dej$ƒZ,G dd„ dej$ƒZ-ddddœZ.d Z/d!Z0d"d#gd$gd%œZ1G d&d'„ d'e2ƒZ3G d(d)„ d)ej"ƒZ4G d*d+„ d+ej5ƒZ6G d,d-„ d-ej$ƒZ7G d.d/„ d/e6ƒZ8G d0d1„ d1ej$ƒZ9ed2d3d4Z:G d5d6„ d6e4ƒZ;G d7d8„ d8e6ƒZ<G d9d:„ d:ej$ƒZ=e>d;krJe ?¡  dS )<é    N)ÚEmailMessage)Úbody_encode)ÚsupportÚmock_socket)ÚHOSTÚHOSTv4ÚHOSTv6)ÚMockÚdarwinc             C   s   d S )N© )Úselfr   r   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_smtplib.pyÚhandle_expt   s    r   c       
      C   sª   |  ¡  |  ¡  z‚y| ¡ \}}W n tjk
r8   Y nXX d}xH|r†|dkr†t g |gg ¡\}}}|r|| |¡}	||	d … }|d8 }q@W | ¡  W d | ¡  |  ¡  X d S )Niô  r   é   )ÚlistenÚsetÚacceptÚsocketÚtimeoutÚselectÚsendÚclose)
ÚevtÚbufÚservÚconnÚaddrÚnÚrÚwÚeÚsentr   r   r   Úserver"   s     
r"   c               @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚGeneralTestsc             C   s   t t_d| _d S )Né   )r   Úsmtplibr   Úport)r   r   r   r   ÚsetUp:   s    zGeneralTests.setUpc             C   s
   t t_ d S )N)r   r%   )r   r   r   r   ÚtearDown>   s    zGeneralTests.tearDownc             C   s   d}d}|   |t |¡¡ d S )Nzabc
.jklfoo
..bluezabc
..jkl
foo
...blue)ÚassertEqualr%   Z	quotedata)r   ZteststrÚexpectedr   r   r   ÚtestQuoteDataC   s    zGeneralTests.testQuoteDatac             C   s$   t  d¡ t t| j¡}| ¡  d S )Ns   220 Hola mundo)r   Ú
reply_withr%   ÚSMTPr   r&   r   )r   Úsmtpr   r   r   Ú
testBasic1H   s    
zGeneralTests.testBasic1c             C   s6   t  d¡ tjt| jdd}|  |jd¡ | ¡  d S )Ns   220 Hola mundo)z	127.0.0.1i¤M  )Úsource_address)	r   r,   r%   r-   r   r&   r)   r0   r   )r   r.   r   r   r   ÚtestSourceAddressN   s
    

zGeneralTests.testSourceAddressc             C   s*   t  d¡ t dt| jf ¡}| ¡  d S )Ns   220 Hola mundoz%s:%s)r   r,   r%   r-   r   r&   r   )r   r.   r   r   r   Ú
testBasic2V   s    
zGeneralTests.testBasic2c             C   s6   t  d¡ tjt| jdd}|  |jd¡ | ¡  d S )Ns   220 Hola mundoZtesthost)Úlocal_hostname)	r   r,   r%   r-   r   r&   r)   r3   r   )r   r.   r   r   r   ÚtestLocalHostName\   s    
zGeneralTests.testLocalHostNamec          	   C   sp   t  d¡ |  t  ¡ ¡ t  d¡ |  t  ¡ d¡ zt t| j	¡}W d t  d ¡ X |  |j
 ¡ d¡ | ¡  d S )Ns   220 Hola mundoé   )r   r,   ÚassertIsNoneÚgetdefaulttimeoutÚsetdefaulttimeoutr)   r%   r-   r   r&   ÚsockÚ
gettimeoutr   )r   r.   r   r   r   ÚtestTimeoutDefaultc   s    

zGeneralTests.testTimeoutDefaultc          	   C   sb   t  d¡ |  t ¡ ¡ t d¡ ztjt| j	d d}W d t d ¡ X |  |j
 ¡ ¡ | ¡  d S )Ns   220 Hola mundor5   )r   )r   r,   r6   r   r7   r8   r%   r-   r   r&   r9   r:   r   )r   r.   r   r   r   ÚtestTimeoutNoneo   s    

zGeneralTests.testTimeoutNonec             C   s:   t  d¡ tjt| jdd}|  |j ¡ d¡ | 	¡  d S )Ns   220 Hola mundor5   )r   )
r   r,   r%   r-   r   r&   r)   r9   r:   r   )r   r.   r   r   r   ÚtestTimeoutValuez   s    
zGeneralTests.testTimeoutValuec          	   C   sh   t  d¡ t ¡ }| d¡ t ¡ }| t| j	¡ W d Q R X | 
¡  t dtj¡}|  | ¡ |¡ d S )Ns   220 Hello worldr   z	^connect:)r   r,   r%   r-   Úset_debuglevelr   Úcaptured_stderrÚconnectr   r&   r   ÚreÚcompileÚ	MULTILINEÚassertRegexÚgetvalue)r   r.   Ústderrr*   r   r   r   Útest_debuglevel€   s    


zGeneralTests.test_debuglevelc          	   C   sh   t  d¡ t ¡ }| d¡ t ¡ }| t| j	¡ W d Q R X | 
¡  t dtj¡}|  | ¡ |¡ d S )Ns   220 Hello worldé   z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: )r   r,   r%   r-   r>   r   r?   r@   r   r&   r   rA   rB   rC   rD   rE   )r   r.   rF   r*   r   r   r   Útest_debuglevel_2Š   s    


zGeneralTests.test_debuglevel_2N)Ú__name__Ú
__module__Ú__qualname__r'   r(   r+   r/   r1   r2   r4   r;   r<   r=   rG   rI   r   r   r   r   r#   8   s   
r#   c          	   C   s°   |  ¡  zvyZttdƒrtj}ntj}d}x8tjr`|dkr`|dtjƒ | ¡ rV|  ¡  P |d8 }q*W W n t	j
k
rz   Y nX W d | ¡ sšt d¡ |  ¡  t ¡  |  ¡  X d S )NÚpolliè  r   g{®Gáz„?r   g      à?)r   Úhasattrr   ÚasyncoreZpoll2rM   Ú
socket_mapÚis_setr   r   r   ÚtimeÚsleepÚ	close_all)r   Úserv_evtÚ
client_evtZpoll_funr   r   r   r   Údebugging_server—   s&    


rW   z&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
c               @   sÈ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZdS )0ÚDebuggingServerTestsNc             C   sÄ   t j| _tjt _tj| _t ¡ | _	| j	t_t
 ¡ | _t
 ¡ | _tj| _t ¡ t_tjtdfddd| _| jj  ¡ d d… \| _| _| j| j| jf}t
jt|d| _| j ¡  | j ¡  | j ¡  d S )Nr   )ÚnowhereéÿÿÿÿT)Údecode_datarH   )ÚtargetÚargs)r   ÚgetfqdnÚreal_getfqdnr   ÚsysÚstdoutÚ
old_stdoutÚioÚStringIOÚoutputÚ	threadingÚEventrU   rV   ÚsmtpdÚDEBUGSTREAMÚold_DEBUGSTREAMZDebuggingServerr   r   ÚgetsocknameÚhostr&   ÚThreadrW   ÚthreadÚstartÚwaitÚclear)r   Ú	serv_argsr   r   r   r'   Ã   s"    






zDebuggingServerTests.setUpc             C   sD   | j t_| j ¡  | j ¡  | j ¡  | j	t
_tj ¡  | jt_d S )N)r_   r   r^   rV   r   rU   rp   rn   Újoinrb   r`   ra   rh   ri   r   rj   )r   r   r   r   r(   Ý   s    



zDebuggingServerTests.tearDownc             C   s$   | j  ¡ }tjdd|tjtjB dS )Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)Úflags)re   rE   rA   ÚsubrC   ÚDOTALL)r   Útest_outputr   r   r   Úget_output_without_xpeerê   s    
z-DebuggingServerTests.get_output_without_xpeerc             C   s    t jt| jddd}| ¡  d S )NÚ	localhosté   )r3   r   )r%   r-   r   r&   Úquit)r   r.   r   r   r   Ú	testBasicï   s    zDebuggingServerTests.testBasicc          
   C   s˜   t  ¡ }yLtj| j| jdd| j|fd}|  |j| j|f¡ |  |jd¡ | 	¡  W n> t
k
r’ } z |jtjkr€|  d| ¡ ‚ W d d }~X Y nX d S )Nry   rz   )r3   r   r0   zcouldn't bind to source port %d)r   Úfind_unused_portr%   r-   rl   r&   r)   r0   r3   r{   ÚOSErrorÚerrnoZ
EADDRINUSEÚskipTest)r   Zsrc_portr.   r    r   r   r   r1   ô   s    z&DebuggingServerTests.testSourceAddressc             C   s4   t jt| jddd}d}|  | ¡ |¡ | ¡  d S )Nry   rz   )r3   r   )éú   s   OK)r%   r-   r   r&   r)   Únoopr{   )r   r.   r*   r   r   r   ÚtestNOOP  s    zDebuggingServerTests.testNOOPc             C   s4   t jt| jddd}d}|  | ¡ |¡ | ¡  d S )Nry   rz   )r3   r   )r   s   OK)r%   r-   r   r&   r)   Zrsetr{   )r   r.   r*   r   r   r   ÚtestRSET  s    zDebuggingServerTests.testRSETc             C   s4   t jt| jddd}d}|  | ¡ |¡ | ¡  d S )Nry   rz   )r3   r   )r   s   
SIZE 33554432
HELP)r%   r-   r   r&   r)   Úehlor{   )r   r.   r*   r   r   r   ÚtestELHO  s    zDebuggingServerTests.testELHOc             C   s>   t jt| jddd}d}| d¡ |  | ¡ |¡ | ¡  d S )Nry   rz   )r3   r   )iö  s   EXPN not implementedZEXPN)r%   r-   r   r&   Zputcmdr)   Zgetreplyr{   )r   r.   r*   r   r   r   ÚtestEXPNNotImplemented  s
    
z+DebuggingServerTests.testEXPNNotImplementedc             C   sH   t jt| jddd}d}|  | d¡|¡ |  | d¡|¡ | ¡  d S )Nry   rz   )r3   r   )éü   s>   Cannot VRFY user, but will accept message and attempt deliveryznobody@nowhere.com)r%   r-   r   r&   r)   ÚvrfyZverifyr{   )r   r.   r*   r   r   r   ÚtestVRFY  s
    zDebuggingServerTests.testVRFYc             C   s<   t jt| jddd}| ¡  d}|  | ¡ |¡ | ¡  d S )Nry   rz   )r3   r   )i÷  s   Duplicate HELO/EHLO)r%   r-   r   r&   Zhelor)   r{   )r   r.   r*   r   r   r   ÚtestSecondHELO%  s
    z#DebuggingServerTests.testSecondHELOc             C   s0   t jt| jddd}|  | ¡ d¡ | ¡  d S )Nry   rz   )r3   r   s@   Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r%   r-   r   r&   r)   Úhelpr{   )r   r.   r   r   r   ÚtestHELP.  s    zDebuggingServerTests.testHELPc             C   sz   d}t jt| jddd}| dd|¡ t d¡ | ¡  | j 	¡  | j
 ¡  | j ¡  dt|tf }|  | j ¡ |¡ d S )	NzA test messagery   rz   )r3   r   ÚJohnÚSallyg{®Gáz„?z%s%s
%s)r%   r-   r   r&   ÚsendmailrR   rS   r{   rV   r   rU   rp   re   ÚflushÚ	MSG_BEGINÚMSG_ENDr)   rE   )r   Úmr.   Úmexpectr   r   r   ÚtestSend4  s    



zDebuggingServerTests.testSendc             C   s€   d}t jt| jddd}| dd|¡ t d¡ | ¡  | j 	¡  | j
 ¡  | j ¡  dt| d	¡tf }|  | j ¡ |¡ d S )
Ns   A test messagery   rz   )r3   r   rŽ   r   g{®Gáz„?z%s%s
%sÚascii)r%   r-   r   r&   r   rR   rS   r{   rV   r   rU   rp   re   r‘   r’   Údecoder“   r)   rE   )r   r”   r.   r•   r   r   r   ÚtestSendBinaryE  s    



z#DebuggingServerTests.testSendBinaryc             C   sz   d}t jt| jddd}| dd|¡ t d¡ | ¡  | j 	¡  | j
 ¡  | j ¡  dt|tf }|  | j ¡ |¡ d S )	Nz.A test
.mes.sage.ry   rz   )r3   r   rŽ   r   g{®Gáz„?z%s%s
%s)r%   r-   r   r&   r   rR   rS   r{   rV   r   rU   rp   re   r‘   r’   r“   r)   rE   )r   r”   r.   r•   r   r   r   ÚtestSendNeedingDotQuoteS  s    



z,DebuggingServerTests.testSendNeedingDotQuotec             C   sž   d}t jt| jddd}| dd|¡ t d¡ | ¡  | j 	¡  | j
 ¡  | j ¡  dt|tf }|  | j ¡ |¡ tj ¡ }t d	tj¡}|  ||¡ d S )
NzA test messagery   rz   )r3   r   z<>r   g{®Gáz„?z%s%s
%sz^sender: <>$)r%   r-   r   r&   r   rR   rS   r{   rV   r   rU   rp   re   r‘   r’   r“   r)   rE   rh   ri   rA   rB   rC   rD   )r   r”   r.   r•   ÚdebugoutÚsenderr   r   r   ÚtestSendNullSenderb  s    




z'DebuggingServerTests.testSendNullSenderc             C   s’   t jj d¡}tjt| jddd}|j|ddd t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d	= d
t| ¡ tf }|  ||¡ d S )NzA test messagery   rz   )r3   r   rŽ   r   )Ú	from_addrÚto_addrsg{®Gáz„?zX-Peerz%s%s
%s)ÚemailÚmimeÚtextÚMIMETextr%   r-   r   r&   Úsend_messagerR   rS   r{   rV   r   rU   rp   re   r‘   rx   r’   Ú	as_stringr“   r)   )r   r”   r.   rw   r•   r   r   r   ÚtestSendMessages  s    



z$DebuggingServerTests.testSendMessagec       	      C   s  t jj d¡}d|d< d|d< d|d< d|d	< tjt| jd
dd}| |¡ t	 
d¡ | ¡  |  |d	 d¡ | j ¡  | j ¡  | j ¡  |  ¡ }|d= |d	= dt| ¡ tf }|  ||¡ tj ¡ }t dtj¡}|  ||¡ x,dD ]$}t d |¡tj¡}|  ||¡ qèW d S )NzA test messagezfoo@bar.comÚFromrŽ   ÚTozSally, FredÚCCz?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>ÚBccry   rz   )r3   r   g{®Gáz„?zX-Peerz%s%s
%sz^sender: foo@bar.com$)rŽ   r   ZFredzroot@localhostzwarped@silly.walks.comz^recips: .*'{}'.*$)r    r¡   r¢   r£   r%   r-   r   r&   r¤   rR   rS   r{   r)   rV   r   rU   rp   re   r‘   rx   r’   r¥   r“   rh   ri   rE   rA   rB   rC   rD   Úformat)	r   r”   r.   rw   r•   r›   rœ   r   Úto_addrr   r   r   ÚtestSendMessageWithAddresses‡  s2    






z1DebuggingServerTests.testSendMessageWithAddressesc       	      C   sî   t jj d¡}d|d< d|d< tjt| jddd}| |¡ t	 
d	¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d
= dt| ¡ tf }|  ||¡ tj ¡ }t dtj¡}|  ||¡ x,dD ]$}t d |¡tj¡}|  ||¡ qÂW d S )NzA test messagezfoo@bar.comr§   zJohn, Dinsdaler¨   ry   rz   )r3   r   g{®Gáz„?zX-Peerz%s%s
%sz^sender: foo@bar.com$)rŽ   ÚDinsdalez^recips: .*'{}'.*$)r    r¡   r¢   r£   r%   r-   r   r&   r¤   rR   rS   r{   rV   r   rU   rp   re   r‘   rx   r’   r¥   r“   r)   rh   ri   rE   rA   rB   rC   rD   r«   )	r   r”   r.   rw   r•   r›   rœ   r   r¬   r   r   r   Ú testSendMessageWithSomeAddresses©  s*    






z5DebuggingServerTests.testSendMessageWithSomeAddressesc       
      C   s  t jj d¡}d|d< d|d< tjt| jddd}|j|d	d
d t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d= dt| ¡ tf }|  ||¡ tj ¡ }t dtj¡}|  ||¡ x,dD ]$}t d |¡tj¡}|  ||¡ qÈW t dtj¡}	|  ||	¡ d S )NzA test messagezfoo@bar.comr§   zJohn, Dinsdaler¨   ry   rz   )r3   r   zjoe@example.comzfoo@example.net)rž   rŸ   g{®Gáz„?zX-Peerz%s%s
%sz^sender: joe@example.com$)rŽ   r®   z^recips: .*'{}'.*$z^recips: .*'foo@example.net'.*$) r    r¡   r¢   r£   r%   r-   r   r&   r¤   rR   rS   r{   rV   r   rU   rp   re   r‘   rx   r’   r¥   r“   r)   rh   ri   rE   rA   rB   rC   rD   r«   ÚassertNotRegex)
r   r”   r.   rw   r•   r›   rœ   r   r¬   Zrecipr   r   r   Ú%testSendMessageWithSpecifiedAddressesÄ  s.    





z:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc       	      C   sö   t jj d¡}d|d< d|d< d|d< tjt| jdd	d
}| |¡ t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  |  ¡ }|d= dt| ¡ tf }|  ||¡ tj ¡ }t dtj¡}|  ||¡ x,dD ]$}t d |¡tj¡}|  ||¡ qÊW d S )NzA test messagezBernard, Biancar§   z#the_rescuers@Rescue-Aid-Society.comZSenderzJohn, Dinsdaler¨   ry   rz   )r3   r   g{®Gáz„?zX-Peerz%s%s
%sz-^sender: the_rescuers@Rescue-Aid-Society.com$)rŽ   r®   z^recips: .*'{}'.*$)r    r¡   r¢   r£   r%   r-   r   r&   r¤   rR   rS   r{   rV   r   rU   rp   re   r‘   rx   r’   r¥   r“   r)   rh   ri   rE   rA   rB   rC   rD   r«   )	r   r”   r.   rw   r•   r›   rœ   r   r¬   r   r   r   ÚtestSendMessageWithMultipleFromá  s,    






z4DebuggingServerTests.testSendMessageWithMultipleFromc       	      C   s*  t jj d¡}d|d< d|d< d|d< d|d	< d
|d< d|d< d|d< d|d< tjt| jddd}| |¡ t	 
d¡ | ¡  | j ¡  | j ¡  | j ¡  |d	= |d= |  ¡ }|d= dt| ¡ tf }|  ||¡ tj ¡ }t dtj¡}|  ||¡ x,dD ]$}t d |¡tj¡}|  ||¡ qþW d S )NzA test messagezfoo@bar.comr§   rŽ   r¨   zSally, Fredr©   z?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>rª   zThu, 1 Jan 1970 17:42:00 +0000zResent-Datezholy@grail.netzResent-Fromz&Martha <my_mom@great.cooker.com>, Jeffz	Resent-Tozdoe@losthope.netz
Resent-Bccry   rz   )r3   r   g{®Gáz„?zX-Peerz%s%s
%sz^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffzdoe@losthope.netz^recips: .*'{}'.*$)r    r¡   r¢   r£   r%   r-   r   r&   r¤   rR   rS   r{   rV   r   rU   rp   re   r‘   rx   r’   r¥   r“   r)   rh   ri   rE   rA   rB   rC   rD   r«   )	r   r”   r.   rw   r•   r›   rœ   r   r¬   r   r   r   ÚtestSendMessageResentý  s:    






z*DebuggingServerTests.testSendMessageResentc          	   C   s¦   t jj d¡}d|d< d|d< d|d< d|d	< d
|d< d|d< d|d< d|d< d|d< d|d< d|d< tjt| jddd}|  t	¡ | 
|¡ W d Q R X | ¡  d S )NzA test messagezfoo@bar.comr§   rŽ   r¨   zSally, Fredr©   z?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>rª   zThu, 1 Jan 1970 17:42:00 +0000zResent-Datezholy@grail.netzResent-Fromz&Martha <my_mom@great.cooker.com>, Jeffz	Resent-Tozdoe@losthope.netz
Resent-BcczThu, 2 Jan 1970 17:42:00 +0000ry   rz   )r3   r   )r    r¡   r¢   r£   r%   r-   r   r&   ÚassertRaisesÚ
ValueErrorr¤   r   )r   r”   r.   r   r   r   Ú#testSendMessageMultipleResentRaises   s     z8DebuggingServerTests.testSendMessageMultipleResentRaises)rJ   rK   rL   ÚmaxDiffr'   r(   rx   r|   r1   rƒ   r„   r†   r‡   rŠ   r‹   r   r–   r™   rš   r   r¦   r­   r¯   r±   r²   r³   r¶   r   r   r   r   rX   ¿   s0   	"#rX   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚNonConnectingTestsc             C   s.   t  ¡ }|  t j|j¡ |  t j|jd¡ d S )Nztest msg)r%   r-   r´   ÚSMTPServerDisconnectedr…   r   )r   r.   r   r   r   ÚtestNotConnected4  s    z#NonConnectingTests.testNotConnectedc             C   s&   |   ttjdd¡ |   ttjd¡ d S )Nry   Zboguszlocalhost:bogus)r´   r~   r%   r-   )r   r   r   r   ÚtestNonnumericPort>  s    

z%NonConnectingTests.testNonnumericPortN)rJ   rK   rL   rº   r»   r   r   r   r   r¸   2  s   
r¸   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultArgumentsTestsc             C   sD   t ƒ | _d| jd< t ¡ | _tdd| j_tƒ tƒ  | j_| j_d S )Nu   PÃ¡olo <fÅ‘o@bar.com>r§   )éÈ   ÚOK)Zreturn_value)	r   Úmsgr%   r-   r.   r	   r…   Úhas_extnr   )r   r   r   r   r'   H  s
    

zDefaultArgumentsTests.setUpc             C   s`   d}| j  | j¡ | j  | j¡ |  | j jjd d d |¡ |  | j jjd d d |¡ d S )N)ÚSMTPUTF8zBODY=8BITMIMEr   rz   r   )r.   r¤   r¿   r)   r   Úcall_args_list)r   Úexpected_mail_optionsr   r   r   r¦   O  s    z%DefaultArgumentsTests.testSendMessagec             C   sN   dg}d}| j  | jd d |¡ |  |dg¡ |  | j jjd d d |¡ d S )NÚSTARTTLS)rÄ   rÁ   zBODY=8BITMIMEr   rz   )r.   r¤   r¿   r)   r   rÂ   )r   Úmail_optionsrÃ   r   r   r   ÚtestSendMessageWithMailOptionsX  s    z4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rJ   rK   rL   r'   r¦   rÆ   r   r   r   r   r¼   F  s   	r¼   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚBadHELOServerTestsc             C   s4   t t_t  d¡ tj| _t ¡ | _	| j	t_d| _
d S )Ns   199 no hello for you!r$   )r   r%   r   r,   r`   ra   rb   rc   rd   re   r&   )r   r   r   r   r'   d  s    

zBadHELOServerTests.setUpc             C   s   t t_ | jt_d S )N)r   r%   rb   r`   ra   )r   r   r   r   r(   l  s    zBadHELOServerTests.tearDownc             C   s   |   tjtjt| jdd¡ d S )Nry   rz   )r´   r%   ZSMTPConnectErrorr-   r   r&   )r   r   r   r   ÚtestFailingHELOp  s    z"BadHELOServerTests.testFailingHELON)rJ   rK   rL   r'   r(   rÈ   r   r   r   r   rÇ   b  s   rÇ   c               @   s:   e Zd Zddej d  d Zdd„ Zdd„ Zd	d
„ ZdS )ÚTooLongLineTestss   250 OKó   .rH   ó   
c             C   sš   t j| _t ¡ | _| jt _t ¡ | _t	 	t	j
t	j¡| _| j d¡ t | j¡| _| j| j| jf}tjt|d}| ¡  |  |j¡ | j ¡  | j ¡  d S )Né   )r\   r]   )r`   ra   rb   rc   rd   re   rf   rg   r   r   ÚAF_INETÚSOCK_STREAMr9   Ú
settimeoutr   Ú	bind_portr&   Úrespdatarm   r"   ro   Ú
addCleanuprs   rp   rq   )r   Zservargsrn   r   r   r   r'   x  s    


zTooLongLineTests.setUpc             C   s   | j  ¡  | jt_d S )N)r   rp   rb   r`   ra   )r   r   r   r   r(   ˆ  s    
zTooLongLineTests.tearDownc             C   s   |   tjtjt| jdd¡ d S )Nry   rz   )r´   r%   ÚSMTPResponseExceptionr-   r   r&   )r   r   r   r   ÚtestLineTooLongŒ  s    z TooLongLineTests.testLineTooLongN)	rJ   rK   rL   r%   Ú_MAXLINErÑ   r'   r(   rÔ   r   r   r   r   rÉ   u  s   rÉ   zJohn AzSally BzRuth C)zMr.A@somewhere.comzMs.B@xn--fo-fka.comzMrs.C@somewhereesle.com)zMr.A@somewhere.comZsomepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=zMr.A@somewhere.comzMrs.C@somewhereesle.comzMs.B@xn--fo-fka.com)zlist-1zlist-2c               @   s   e Zd ZdS )ÚResponseExceptionN)rJ   rK   rL   r   r   r   r   rÖ   ž  s    rÖ   c                   sÞ   e Zd ZdZdZdZdZdZdZdZ	dZ
dZ‡ fdd„Z‡ fdd„Zdd	„ Zd
d„ Zdd„ Zd&dd„Zd'dd„Zd(dd„Zdd„ Zdd„ Zdd„ Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fd d!„Z‡ fd"d#„Zd$d%„ Z‡  ZS ))ÚSimSMTPChannelNr   éc   c                s,   d  dd„ |D ƒ¡| _tt| ƒj||Ž d S )NÚ c             S   s   g | ]}d   |¡‘qS )z	250-{0}
)r«   )Ú.0Úxr   r   r   ú
<listcomp>­  s    z+SimSMTPChannel.__init__.<locals>.<listcomp>)rs   Ú_extrafeaturesÚsuperr×   Ú__init__)r   Zextra_featuresr]   Úkw)Ú	__class__r   r   rß   «  s    zSimSMTPChannel.__init__c          
      s’   | j | jkr„| j | j¡}tdt|ƒtjd g | _y|  	|¡ W n@ t
k
r‚ } z"| j| _ |  d|j|jf ¡ d S d }~X Y nX tƒ  ¡  d S )NzData:)Úfilez%s %s)Ú
smtp_stateÚAUTHZ_emptystringrs   Zreceived_linesÚprintÚreprrh   ri   Úauth_objectrÖ   ÚCOMMANDÚpushÚ	smtp_codeÚ
smtp_errorrÞ   Úfound_terminator)r   Úliner    )rá   r   r   rì   ±  s    zSimSMTPChannel.found_terminatorc             C   sä   | j s|  d¡ d S | jr$d| jkr2|  d¡ d S | jd k	rJ|  d¡ d S | ¡ }t|ƒdkrl|  d¡ d S d|d  ¡  d	d
¡ }yt	| |ƒ| _
W n$ tk
r¸   |  d |¡¡ d S X | j| _|  
t|ƒdkrÚ|d nd ¡ d S )Nz503 Error: send EHLO firsträ   z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)r   rH   z/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr   ú-Ú_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rH   r   )Úseen_greetingré   Úextended_smtprÝ   Úauthenticated_userÚsplitÚlenÚlowerÚreplaceÚgetattrrç   ÚAttributeErrorr«   rä   rã   )r   Úargr]   Zauth_object_namer   r   r   Ú	smtp_AUTH¿  s.    



zSimSMTPChannel.smtp_AUTHc             C   s,   |r|| _ |  d¡ n
|  d¡ | j| _d S )Nz235 Authentication Succeededz&535 Authentication credentials invalid)rò   ré   rè   rã   )r   ÚuserZvalidr   r   r   Ú_authenticatedØ  s
    
zSimSMTPChannel._authenticatedc             C   s   t  | d¡¡ d¡S )Nr—   zutf-8)Úbase64ÚdecodebytesÚencoder˜   )r   Ústringr   r   r   Ú_decode_base64à  s    zSimSMTPChannel._decode_base64c          
   C   s‚   |d kr|   d¡ nj|  |¡}y| d¡^ }}}W n4 tk
rh } z|   d ||¡¡ d S d }~X Y nX |  ||td k¡ d S )Nz334 ú z=535 Splitting response {!r} into user and password failed: {}r   )ré   r  ró   rµ   r«   rü   Úsim_auth)r   rù   Úlogpassrï   rû   Úpasswordr    r   r   r   Ú_auth_plainã  s    

zSimSMTPChannel._auth_plainc             C   s^   |d kr|   d¡ nFt| dƒs6|  |¡| _|   d¡ n$|  |¡}|  | j|td k¡ | `d S )Nz334 VXNlcm5hbWU6Ú_auth_login_userz334 UGFzc3dvcmQ6r   )ré   rN   r  r  rü   r  )r   rù   r  r   r   r   Ú_auth_loginð  s    

zSimSMTPChannel._auth_loginc          
   C   s¦   |d kr|   d t¡¡ nˆ|  |¡}y| ¡ \}}W n4 tk
rh } z|   d ||¡¡ dS d }~X Y nX t td  	d¡|  t¡ 	d¡d¡ 
¡ }|  |||k¡ d S )Nz334 {}z=535 Splitting response {!r} into user and password failed: {}Fr   r—   Úmd5)ré   r«   Úsim_cram_md5_challenger  ró   rµ   ÚhmacZHMACr  rÿ   Ú	hexdigestrü   )r   rù   r  rû   Zhashed_passr    Zvalid_hashed_passr   r   r   Ú_auth_cram_md5ý  s    


zSimSMTPChannel._auth_cram_md5c             C   s,   d}|| j  d }|  |¡ || _d| _d S )NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)rÝ   ré   rð   rñ   )r   rù   Úrespr   r   r   Ú	smtp_EHLO  s
    
zSimSMTPChannel.smtp_EHLOc             C   s8   |t kr&|  dt | t |¡f ¡ n|  d| ¡ d S )Nz	250 %s %sz550 No such user: %s)Ú	sim_usersré   r%   Ú	quoteaddr)r   rù   r   r   r   Ú	smtp_VRFY  s    zSimSMTPChannel.smtp_VRFYc             C   s†   |  ¡ }|tkrxt| }xht|ƒD ]P\}}t |¡}|t|ƒd k r\|  dt| |f ¡ q"|  dt| |f ¡ q"W n
|  d¡ d S )Nr   z	250-%s %sz	250 %s %sz550 No access for you!)rõ   Ú	sim_listsÚ	enumerater%   r  rô   ré   r  )r   rù   Z	list_nameZ	user_listr   Z
user_emailZquoted_addrr   r   r   Ú	smtp_EXPN!  s    
zSimSMTPChannel.smtp_EXPNc                s4   | j d krtt| ƒ |¡ n|  | j ¡ |  ¡  d S )N)Úquit_responserÞ   r×   Ú	smtp_QUITré   Úclose_when_done)r   rù   )rá   r   r   r  .  s    
zSimSMTPChannel.smtp_QUITc                s6   | j d krtƒ  |¡ n|  | j ¡ | jr2|  ¡  d S )N)Úmail_responserÞ   Ú	smtp_MAILré   Ú
disconnectr  )r   rù   )rá   r   r   r  5  s
    
zSimSMTPChannel.smtp_MAILc                sB   | j d krtƒ  |¡ d S |  jd7  _|  | j | jd  ¡ d S )Nr   )Úrcpt_responserÞ   Ú	smtp_RCPTÚ
rcpt_countré   )r   rù   )rá   r   r   r  =  s
    
zSimSMTPChannel.smtp_RCPTc                s   |  j d7  _ tƒ  |¡ d S )Nr   )Ú
rset_countrÞ   Ú	smtp_RSET)r   rù   )rá   r   r   r   D  s    zSimSMTPChannel.smtp_RSETc                s(   | j d krtƒ  |¡ n|  | j ¡ d S )N)Údata_responserÞ   Ú	smtp_DATAré   )r   rù   )rá   r   r   r"  H  s    
zSimSMTPChannel.smtp_DATAc              C   s   ‚ d S )Nr   )r   r   r   r   Úhandle_errorN  s    zSimSMTPChannel.handle_error)N)N)N)rJ   rK   rL   r  r  r  r!  r  r  r  rä   rò   rß   rì   rú   rü   r  r  r  r  r  r  r  r  r  r  r   r"  r#  Ú__classcell__r   r   )rá   r   r×   Ÿ  s4   


r×   c               @   s8   e Zd ZeZdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Z	dS )ÚSimSMTPServerc             O   s$   g | _ i | _tjj| f|ž|Ž d S )N)Ú_extra_featuresÚ
_addressesrh   Ú
SMTPServerrß   )r   r]   rà   r   r   r   rß   V  s    zSimSMTPServer.__init__c             C   s   | j | j| ||| jd| _d S )N)r[   )Úchannel_classr&  Ú_decode_dataÚ_SMTPchannel)r   r   r   r   r   r   Úhandle_accepted[  s    
zSimSMTPServer.handle_acceptedc             C   s   || j d< || j d< d S )NÚfromÚtos)r'  )r   ÚpeerÚmailfromÚrcpttosÚdatar   r   r   Úprocess_message`  s    
zSimSMTPServer.process_messagec             C   s   | j  |¡ d S )N)r&  Úappend)r   Zfeaturer   r   r   Úadd_featured  s    zSimSMTPServer.add_featurec              C   s   ‚ d S )Nr   )r   r   r   r   r#  g  s    zSimSMTPServer.handle_errorN)
rJ   rK   rL   r×   r)  rß   r,  r3  r5  r#  r   r   r   r   r%  R  s   r%  c               @   s¼   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-S ).ÚSMTPSimTestsc             C   sŒ   t j| _tjt _t ¡ | _t ¡ | _tt	dfddd| _
| j
j  ¡ d | _| j
| j| jf}tjt|d| _| j ¡  | j ¡  | j ¡  d S )Nr   )rY   rZ   T)r[   r   )r\   r]   )r   r^   r_   r   rf   rg   rU   rV   r%  r   r   rk   r&   rm   rW   rn   ro   rp   rq   )r   rr   r   r   r   r'   o  s    



zSMTPSimTests.setUpc             C   s*   | j t_| j ¡  | j ¡  | j ¡  d S )N)	r_   r   r^   rV   r   rU   rp   rn   rs   )r   r   r   r   r(   €  s    

zSMTPSimTests.tearDownc             C   s    t jt| jddd}| ¡  d S )Nry   rÌ   )r3   r   )r%   r-   r   r&   r{   )r   r.   r   r   r   r|   ˆ  s    zSMTPSimTests.testBasicc             C   s‚   t jt| jddd}|  |ji ¡ ddddddœ}| ¡  |  |j|¡ x|D ]}|  | |¡¡ qNW |  	| d¡¡ | 
¡  d S )Nry   rÌ   )r3   r   rÙ   Z20000000)ÚexpnÚsizeÚstarttlsZ	deliverbyrŒ   zunsupported-feature)r%   r-   r   r&   r)   Úesmtp_featuresr…   Ú
assertTruerÀ   ÚassertFalser{   )r   r.   Zexpected_featuresÚkr   r   r   ÚtestEHLO  s    
zSMTPSimTests.testEHLOc             C   sŒ   t jt| jddd}xBt ¡ D ]6\}}dtd|t  |¡f dƒf}|  | 	|¡|¡ qW d}dd	|  
d¡f}|  | 	|¡|¡ | ¡  d S )
Nry   rÌ   )r3   r   r   z%s %sr—   znobody@nowhere.comi&  zNo such user: %s)r%   r-   r   r&   r  ÚitemsÚbytesr  r)   r‰   rÿ   r{   )r   r.   Z	addr_specÚnameÚexpected_knownÚuÚexpected_unknownr   r   r   rŠ   ¢  s    zSMTPSimTests.testVRFYc       	   	   C   s¤   t jt| jddd}xht ¡ D ]\\}}g }x(|D ] }| dt| t  |¡f ¡ q0W dt	d 
|¡dƒf}|  | |¡|¡ qW d}d	}|  | |¡|¡ | ¡  d S )
Nry   rÌ   )r3   r   z%s %sr   Ú
r—   zPSU-Members-List)i&  s   No access for you!)r%   r-   r   r&   r  r?  r4  r  r  r@  rs   r)   r7  r{   )	r   r.   ZlistnameÚmembersZusersr”   rB  rC  rD  r   r   r   ÚtestEXPN°  s    
 zSMTPSimTests.testEXPNc             C   sL   | j  d¡ tjt| jddd}| td td ¡}|  |d¡ | 	¡  d S )Nz
AUTH PLAINry   rÌ   )r3   r   r   r   )éë   s   Authentication Succeeded)
r   r5  r%   r-   r   r&   Úloginr  r)   r   )r   r.   r  r   r   r   ÚtestAUTH_PLAIN¿  s
    zSMTPSimTests.testAUTH_PLAINc             C   sL   | j  d¡ tjt| jddd}| td td ¡}|  |d¡ | 	¡  d S )Nz
AUTH LOGINry   rÌ   )r3   r   r   r   )rH  s   Authentication Succeeded)
r   r5  r%   r-   r   r&   rI  r  r)   r   )r   r.   r  r   r   r   ÚtestAUTH_LOGINÆ  s
    zSMTPSimTests.testAUTH_LOGINc             C   sL   | j  d¡ tjt| jddd}| td td ¡}|  |d¡ | 	¡  d S )NzAUTH CRAM-MD5ry   rÌ   )r3   r   r   r   )rH  s   Authentication Succeeded)
r   r5  r%   r-   r   r&   rI  r  r)   r   )r   r.   r  r   r   r   ÚtestAUTH_CRAM_MD5Í  s
    zSMTPSimTests.testAUTH_CRAM_MD5c             C   sL   | j  d¡ tjt| jddd}| td td ¡}|  |d¡ | 	¡  d S )NzAUTH BOGUS PLAIN LOGIN CRAM-MD5ry   rÌ   )r3   r   r   r   )rH  s   Authentication Succeeded)
r   r5  r%   r-   r   r&   rI  r  r)   r   )r   r.   r  r   r   r   ÚtestAUTH_multipleÔ  s
    zSMTPSimTests.testAUTH_multiplec          
   C   sÂ   dddh}x|D ]}| j  d |¡¡ qW x’|D ]Š}| j|dt tjt| jddd}| d	¡ t	d
 t	d  |_
|_d| ¡  dd¡ }| |t||ƒ¡}|  |d¡ | ¡  W d Q R X q0W d S )NzCRAM-MD5ZPLAINZLOGINzAUTH {})Ú	mechanismry   rÌ   )r3   r   Zfoor   r   Zauth_rî   rï   )rH  s   Authentication Succeeded)r   r5  r«   ÚsubTestr%   r-   r   r&   r…   r  rû   r  rõ   rö   Úauthr÷   r)   r   )r   Z	supportedrN  r.   Úmethodr  r   r   r   Útest_auth_functionÜ  s    





zSMTPSimTests.test_auth_functionc             C   sŽ   t jt| jddd}| ¡ \}}|  |d¡ |  d|j¡ | ¡  |  	d|j¡ | 
t| j¡ |  	d|j¡ | ¡  |  d|j¡ | ¡  d S )Nry   rÌ   )r3   r   r   r8  )r%   r-   r   r&   r…   r)   ÚassertInr:  r{   ÚassertNotInr@   Zehlo_or_helo_if_needed)r   r.   ÚcodeÚmessager   r   r   Útest_quit_resets_greetingë  s    
z&SMTPSimTests.test_quit_resets_greetingc          	   C   s|   t  t| j¡}| ¡ \}}|  |d¡ W d Q R X |  t j|jd¡ t  t| j¡}| 	¡  W d Q R X |  t j|jd¡ d S )Nr   s   foo)
r%   r-   r   r&   r‚   r)   r´   r¹   r   r   )r   r.   rU  rV  r   r   r   Útest_with_statementú  s    z SMTPSimTests.test_with_statementc          
   C   sh   |   tj¡2}t t| j¡}| ¡  d| jj_	W d Q R X W d Q R X |  
|jjd¡ |  
|jjd¡ d S )Nz421 QUIT FAILEDi¥  s   QUIT FAILED)r´   r%   rÓ   r-   r   r&   r‚   r   r+  r  r)   Ú	exceptionrê   rë   )r   Úerrorr.   r   r   r   Ú test_with_statement_QUIT_failure  s    z-SMTPSimTests.test_with_statement_QUIT_failurec          	   C   sf   t jt| jddd}| ¡  d| jj_d| jj_|  	t j
¡ | ddd¡ W d Q R X |  |j¡ d S )	Nry   rÌ   )r3   r   z451 Requested action abortedTrŽ   r   ztest message)r%   r-   r   r&   r‚   r   r+  r  r  r´   ÚSMTPSenderRefusedr   r6   r9   )r   r.   r   r   r   Útest__rest_from_mail_cmd  s    

z%SMTPSimTests.test__rest_from_mail_cmdc          	   C   sn   t jt| jddd}| ¡  d| jj_|  t j	¡ | 
ddd¡ W d Q R X |  |j¡ |  | jjjd¡ d S )	Nry   rÌ   )r3   r   z421 closing connectionrŽ   r   ztest messager   )r%   r-   r   r&   r‚   r   r+  r  r´   r\  r   r6   r9   r)   r  )r   r.   r   r   r   Útest_421_from_mail_cmd  s    
z#SMTPSimTests.test_421_from_mail_cmdc          	   C   s   t jt| jddd}| ¡  ddg| jj_|  t j	¡}| 
dddd	gd
¡ W d Q R X |  |j¡ |  | jjjd¡ |  |jjd ddi¡ d S )Nry   rÌ   )r3   r   z250 acceptedz421 closingrŽ   r   ZFrankZGeorgeztest messager   )i¥  s   closing)r%   r-   r   r&   r‚   r   r+  r  r´   ZSMTPRecipientsRefusedr   r6   r9   r)   r  ÚassertDictEqualrY  r]   )r   r.   r   r   r   r   Útest_421_from_rcpt_cmd"  s    z#SMTPSimTests.test_421_from_rcpt_cmdc          	   C   s~   G dd„ dt ƒ}|| j_tjt| jddd}| ¡  |  tj	¡ | 
ddgd¡ W d Q R X |  |j¡ |  | jjjd	¡ d S )
Nc                   s   e Zd Z‡ fdd„Z‡  ZS )z=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelc                s&   | j | jkr|  d¡ n
tƒ  ¡  d S )Nz421 closing)rã   ZDATAré   rÞ   rì   )r   )rá   r   r   rì   .  s    zNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rJ   rK   rL   rì   r$  r   r   )rá   r   ÚMySimSMTPChannel-  s   ra  ry   rÌ   )r3   r   zJohn@foo.orgzSally@foo.orgztest messager   )r×   r   r)  r%   r-   r   r&   r‚   r´   ZSMTPDataErrorr   r6   r9   r)   r+  r  )r   ra  r.   r   r   r   Útest_421_from_data_cmd,  s    z#SMTPSimTests.test_421_from_data_cmdc             C   s€   t jt| jddd}|  |j¡ | ¡  |  |j¡ |  	| 
d¡¡ | jt j|jddddd	gd
 | jt j|jddd	gd d S )Nry   rz   )r3   r   Úsmtputf8rŽ   r   rÙ   zBODY=8BITMIMErÁ   )rÅ   )Úoptions)r%   r-   r   r&   rÒ   r   r…   r;  Ú
does_esmtpr<  rÀ   r´   ÚSMTPNotSupportedErrorr   Úmail)r   r.   r   r   r   Ú4test_smtputf8_NotSupportedError_if_no_server_support;  s    zASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportc             C   sH   t jt| jddd}|  |j¡ |  t|jddd¡ |  t|j	d¡ d S )Nry   rz   )r3   r   ZAliceu   BÃ¶brÙ   u   Ã„lice)
r%   r-   r   r&   rÒ   r   r´   ÚUnicodeEncodeErrorr   rg  )r   r.   r   r   r   Ú"test_send_unicode_without_SMTPUTF8J  s
    z/SMTPSimTests.test_send_unicode_without_SMTPUTF8c          	   C   sd   t ƒ }d|d< d|d< d|d< tjt| jddd	}|  |j¡ |  tj¡ | 	|¡ W d Q R X d S )
Nu   PÃ¡olo <fÅ‘o@bar.com>r§   r®   r¨   u   Nudge nudge, wink, wink á½ 9ÚSubjectry   rz   )r3   r   )
r   r%   r-   r   r&   rÒ   r   r´   rf  r¤   )r   r¿   r.   r   r   r   Ú9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8Q  s    zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8c             C   s†   t jt| jddd}|  |j¡ tƒ }tj 	d¡|d< tj 	d¡|d< |  
| |¡i ¡ |  | jjd d	¡ |  | jjd
 dg¡ d S )Nry   rz   )r3   r   )u   MichaÃ«lzmichael@example.comr§   )u   RenÃ©zrene@example.comr¨   r-  zmichael@example.comr.  zrene@example.com)r%   r-   r   r&   rÒ   r   r   r    ÚutilsZ
formataddrr_  r¤   r)   r   r'  )r   r.   rV  r   r   r   Ú1test_name_field_not_included_in_envelop_addresses^  s    z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rJ   rK   rL   r'   r(   r|   r>  rŠ   rG  rJ  rK  rL  rM  rR  rW  rX  r[  r]  r^  r`  rb  rh  rj  rl  rn  r   r   r   r   r6  m  s,   	
	
r6  c               @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	ÚSimSMTPUTF8Serverc             O   s"   ddg| _ tjj| f|ž|Ž d S )NrÁ   Z8BITMIME)r&  rh   r(  rß   )r   r]   rà   r   r   r   rß   p  s    
zSimSMTPUTF8Server.__init__c             C   s"   | j | j| ||| j| jd| _d S )N)r[   Úenable_SMTPUTF8)r)  r&  r*  rp  r+  )r   r   r   r   r   r   r,  w  s    
z!SimSMTPUTF8Server.handle_acceptedNc             C   s(   || _ || _|| _|| _|| _|| _d S )N)Z	last_peerÚlast_mailfromÚlast_rcpttosÚlast_messageÚlast_mail_optionsÚlast_rcpt_options)r   r/  r0  r1  r2  rÅ   Zrcpt_optionsr   r   r   r3  ~  s    z!SimSMTPUTF8Server.process_message)NN)rJ   rK   rL   rß   r,  r3  r   r   r   r   ro  n  s    ro  c               @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚSMTPUTF8SimTestsNc             C   sŽ   t j| _tjt _t ¡ | _t ¡ | _tt	dfdddd| _
| j
j  ¡ d | _| j
| j| jf}tjt|d| _| j ¡  | j ¡  | j ¡  d S )Nr   )rY   rZ   FT)r[   rp  r   )r\   r]   )r   r^   r_   r   rf   rg   rU   rV   ro  r   r   rk   r&   rm   rW   rn   ro   rp   rq   )r   rr   r   r   r   r'   Œ  s    





zSMTPUTF8SimTests.setUpc             C   s*   | j t_| j ¡  | j ¡  | j ¡  d S )N)	r_   r   r^   rV   r   rU   rp   rn   rs   )r   r   r   r   r(   Ÿ  s    

zSMTPUTF8SimTests.tearDownc             C   sH   t jt| jddd}|  |j¡ | ¡  |  |j¡ |  | 	d¡¡ d S )Nry   rz   )r3   r   rc  )
r%   r-   r   r&   rÒ   r   r…   r;  re  rÀ   )r   r.   r   r   r   Ú$test_test_server_supports_extensions§  s    z5SMTPUTF8SimTests.test_test_server_supports_extensionsc             C   s¦   d  d¡}tjt| jddd}|  |j¡ |jdd|dd	gd
 |  | j	j
d¡ |  | j	jdg¡ |  | j	j|¡ |  d| j	j¡ |  d	| j	j¡ |  | j	jg ¡ d S )Nu$   Â¡a test message containing unicode!zutf-8ry   rz   )r3   r   u   JÅ‘hnu   SÃ¡llyzBODY=8BITMIMErÁ   )rÅ   )rÿ   r%   r-   r   r&   rÒ   r   r   r)   r   rq  rr  rs  rS  rt  ru  )r   r”   r.   r   r   r   Ú,test_send_unicode_with_SMTPUTF8_via_sendmail¯  s    

z=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmailc             C   sÖ   d  d¡}tjt| jddd}|  |j¡ | ¡  |  |j	dddgd	d
¡ |  | 
d¡d
¡ |  | |¡d
¡ |  | jjd¡ |  | jjdg¡ |  | jj|¡ |  d| jj¡ |  d| jj¡ |  | jjg ¡ d S )Nu$   Â¡a test message containing unicode!zutf-8ry   rz   )r3   r   u   JÅ‘zBODY=8BITMIMErÁ   )rd  )r   s   OKu   JÃ¡nos)rÿ   r%   r-   r   r&   rÒ   r   r…   r)   rg  Zrcptr2  r   rq  rr  rs  rS  rt  ru  )r   r”   r.   r   r   r   Ú1test_send_unicode_with_SMTPUTF8_via_low_level_API½  s     
zBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_APIc             C   sÎ   t ƒ }d|d< d|d< d|d< | d¡ t d¡}tjt| jd	d
d}|  |j	¡ |  
| |¡i ¡ |  
| jjd¡ |  
| jjdg¡ |  
| jj ¡ |¡ |  d| jj¡ |  d| jj¡ |  
| jjg ¡ d S )Nu   PÃ¡olo <fÅ‘o@bar.com>r§   r®   r¨   u   Nudge nudge, wink, wink á½ 9rk  u1   oh lÃ  lÃ , know what I mean, know what I mean?

u<              From: PÃ¡olo <fÅ‘o@bar.com>
            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?
            ry   rz   )r3   r   u   fÅ‘o@bar.comzBODY=8BITMIMErÁ   )r   Úset_contentÚtextwrapÚdedentr%   r-   r   r&   rÒ   r   r)   r¤   r   rq  rr  rs  r˜   rS  rt  ru  )r   r¿   r*   r.   r   r   r   Ú2test_send_message_uses_smtputf8_if_addrs_non_asciiÏ  s"    
	zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii)
rJ   rK   rL   r·   r'   r(   rw  rx  ry  r}  r   r   r   r   rv  ˆ  s   rv  s    psu doesnotexistrÙ   )Úeolc               @   s   e Zd Zdd„ ZdS )Ú!SimSMTPAUTHInitialResponseChannelc             C   sL   |  ¡ }|d  ¡ dkr>t|ƒdkr>|d tkr>|  d¡ d S |  d¡ d S )Nr   ÚplainrH   r   z235 Okz571 Bad authentication)ró   rõ   rô   ÚEXPECTED_RESPONSEré   )r   rù   r]   r   r   r   rú   ò  s    
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rJ   rK   rL   rú   r   r   r   r   r  ñ  s   r  c               @   s   e Zd ZeZdS )Ú SimSMTPAUTHInitialResponseServerN)rJ   rK   rL   r  r)  r   r   r   r   r‚     s   r‚  c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSMTPAUTHInitialResponseSimTestsc             C   sŒ   t j| _tjt _t ¡ | _t ¡ | _tt	dfddd| _
| j
j  ¡ d | _| j
| j| jf}tjt|d| _| j ¡  | j ¡  | j ¡  d S )Nr   )rY   rZ   T)r[   r   )r\   r]   )r   r^   r_   r   rf   rg   rU   rV   r‚  r   r   rk   r&   rm   rW   rn   ro   rp   rq   )r   rr   r   r   r   r'     s    



z%SMTPAUTHInitialResponseSimTests.setUpc             C   s*   | j t_| j ¡  | j ¡  | j ¡  d S )N)	r_   r   r^   rV   r   rU   rp   rn   rs   )r   r   r   r   r(     s    

z(SMTPAUTHInitialResponseSimTests.tearDownc             C   s8   | j  d¡ tjt| jddd}| dd¡ | ¡  d S )Nz
AUTH PLAINry   rÌ   )r3   r   ÚpsuÚdoesnotexist)r   r5  r%   r-   r   r&   rI  r   )r   r.   r   r   r   Ú%testAUTH_PLAIN_initial_response_login  s
    

zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_loginc             C   sV   | j  d¡ tjt| jddd}d|_d|_| d|j	¡\}}| 
¡  |  |d¡ d S )	Nz
AUTH PLAINry   rÌ   )r3   r   r„  r…  r€  rH  )r   r5  r%   r-   r   r&   rû   r  rP  Z
auth_plainr   r)   )r   r.   rU  Úresponser   r   r   Ú$testAUTH_PLAIN_initial_response_auth&  s    

zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rJ   rK   rL   r'   r(   r†  rˆ  r   r   r   r   rƒ    s   rƒ  Ú__main__)@rO   rý   Zemail.mime.textr    Úemail.messager   Úemail.base64mimer   Úencode_base64Úemail.utilsr  r   rh   r%   rc   rA   r`   rR   r   r   r{  rf   ÚunittestÚtestr   r   Ztest.supportr   r   r   Zunittest.mockr	   Úplatformr   ZSMTPChannelr"   ÚTestCaser#   rW   r’   r“   rX   r¸   r¼   rÇ   rÉ   r  r  r
  r  Ú	ExceptionrÖ   r×   r(  r%  r6  ro  rv  r  r  r‚  rƒ  rJ   Úmainr   r   r   r   Ú<module>   st   
_  u
 4  g-
