o
    HXh2                     @   s  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 d dlmZ d dlmZ d dlmZ d dlZe   e!d	e" d dl#Z#d dl$Z$W d   n1 sw   Y  ej%Z%ej&d
krdd Z'e'e$j(_'dd Z)G dd dZ*G dd de*ej+Z,G dd de*ej+Z-dd Z.dZ/dZ0G dd dej+Z1G dd dej+Z2G dd dej+Z3G dd  d ej+Z4G d!d" d"ej+Z5d#d$d%d&Z6d'Z7d(Z8d)d*gd+gd,Z9G d-d. d.e:Z;G d/d0 d0e$j(Z<G d1d2 d2e$j=Z>G d3d4 d4ej+Z?G d5d6 d6e>Z@G d7d8 d8ej+ZAed9d:d;ZBG d<d= d=e<ZCG d>d? d?e>ZDG d@dA dAej+ZEeFdBkrfeG  dS dS )C    N)EmailMessage)body_encode)supportmock_socket)hashlib_helper)socket_helper)threading_helper)Mockignoredarwinc                 C   s   d S N selfr   r   ;/opt/python-3.10.19/usr/lib/python3.10/test/test_smtplib.pyhandle_expt%   s   r   c           
      C   s   |   |   zVz| \}}W n	 ty   Y n:w d}|rE|dkrEtg |gg \}}}|r;||}	||	d  }|d8 }|rE|dks#|  W |  |   d S W |  |   d S |  |   w )Ni  r      )listensetacceptTimeoutErrorselectsendclose)
evtbufservconnaddrnrwesentr   r   r   server*   s.   


r$   c                   @   st   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S )GeneralTestsc                 C   s   t t_d| _d S )N   )r   smtplibsocketportr   r   r   r   setUpB   s   
zGeneralTests.setUpc                 C   s
   t t_ d S r   )r(   r'   r   r   r   r   tearDownF   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   testQuoteDataK   s   zGeneralTests.testQuoteDatac                 C   s$   t d | t| j}|  d S )N   220 Hola mundor   
reply_withclientHOSTr)   r   r   r2   r   r   r   
testBasic1P   s   
zGeneralTests.testBasic1c                 C   6   t d | jt| jdd}| |jd |  d S )Nr/   )z	127.0.0.1iM  )source_address)r   r1   r2   r3   r)   r,   r7   r   r4   r   r   r   testSourceAddressV   s   

zGeneralTests.testSourceAddressc                 C   s*   t d | dt| jf }|  d S )Nr/   z%s:%sr0   r4   r   r   r   
testBasic2^   s   
zGeneralTests.testBasic2c                 C   r6   )Nr/   Ztesthost)local_hostname)r   r1   r2   r3   r)   r,   r:   r   r4   r   r   r   testLocalHostNamed   s   
zGeneralTests.testLocalHostNamec              	   C   sz   t d | t   t d | t  d z| t| j}W t d  nt d  w | |j	
 d |  d S )Nr/      )r   r1   assertIsNonegetdefaulttimeoutsetdefaulttimeoutr,   r2   r3   r)   sock
gettimeoutr   r4   r   r   r   testTimeoutDefaultk   s   

zGeneralTests.testTimeoutDefaultc              	   C   sl   t d | t  td z| jt| jd d}W td  ntd  w | |j	
  |  d S Nr/   r<   timeout)r   r1   r=   r(   r>   r?   r2   r3   r)   r@   rA   r   r4   r   r   r   testTimeoutNonew   s   

zGeneralTests.testTimeoutNonec                 C   sL   t d | t | jt| jdd W d    d S 1 sw   Y  d S )Nr/   r   rD   )r   r1   assertRaises
ValueErrorr2   r3   r)   r   r   r   r   testTimeoutZero   s   
"zGeneralTests.testTimeoutZeroc                 C   s:   t d | jt| jdd}| |j d |  d S rC   )	r   r1   r2   r3   r)   r,   r@   rA   r   r4   r   r   r   testTimeoutValue   s   
zGeneralTests.testTimeoutValuec                 C   |   t d |  }|d t }|t| j W d    n1 s$w   Y  |	  t
dt
j}| | | d S )N   220 Hello worldr   z	^connect:r   r1   r2   Zset_debuglevelr   Zcaptured_stderrconnectr3   r)   r   recompile	MULTILINEassertRegexgetvaluer   r2   stderrr-   r   r   r   test_debuglevel   s   


zGeneralTests.test_debuglevelc                 C   rK   )NrL      z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rM   rT   r   r   r   test_debuglevel_2   s   


zGeneralTests.test_debuglevel_2N)__name__
__module____qualname__r*   r+   r.   r5   r8   r9   r;   rB   rF   rI   rJ   rV   rX   r   r   r   r   r%   @   s    
r%   c                   @   s   e Zd ZejZdS )SMTPGeneralTestsN)rY   rZ   r[   r'   SMTPr2   r   r   r   r   r\      s    
r\   c                       s<   e Zd ZejZeee	dddd Z
 fddZ  ZS )LMTPGeneralTestsAF_UNIXz test requires Unix domain socketc              	   C   sT   d}t d z| || j}W t d  nt d  w | |j  |  d S )N!/some/local/lmtp/delivery/programrL   )	r   r1   r2   r)   r?   r=   r@   rA   r   )r   
local_hostr2   r   r   r   "testUnixDomainSocketTimeoutDefault   s   
z3LMTPGeneralTests.testUnixDomainSocketTimeoutDefaultc                    sL   t    d}| t | j|dd W d    d S 1 sw   Y  d S )Nr`   r   rD   )superrI   rG   rH   r2   )r   ra   	__class__r   r   rI      s
   
"z LMTPGeneralTests.testTimeoutZero)rY   rZ   r[   r'   ZLMTPr2   unittestZ
skipUnlesshasattrr(   rb   rI   __classcell__r   r   rd   r   r^      s
    

r^   c              	   C   s   |   zSz1ttdrtj}ntj}d}tjr5|dkr5|dtj | r*|   n|d8 }tjr5|dksW n	 t	y?   Y nw W | sNt
d |   t  |   d S | set
d |   t  |   w )Npolli  r   {Gz?r   g      ?)r   rg   r   asyncoreZpoll2ri   Z
socket_mapis_setr   r   timesleepZ	close_all)r   serv_evt
client_evtZpoll_funr   r   r   r   debugging_server   s8   



rq   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d0d1 Zd2d3 Zd4d5 ZdS )6DebuggingServerTestsNc                 C   s   t  | _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   ZnowhereTdecode_datarW   targetargs) r   threading_setup
thread_keyr(   getfqdnreal_getfqdnr   sysstdout
old_stdoutioStringIOoutput	threadingEventro   rp   smtpdDEBUGSTREAMold_DEBUGSTREAMZDebuggingServerr3   r   getsocknamehostr)   Threadrq   threadstartwaitclearr   Z	serv_argsr   r   r   r*      s&   






zDebuggingServerTests.setUpc                 C   s^   | j t_| j  | j  t| j	 | j
t_tj  | jt_| `	|   tj| j  d S r   )r}   r(   r|   rp   r   ro   r   r   join_threadr   r   r~   r   r   r   r   r   
doCleanupsthreading_cleanupr{   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)r   rS   rO   subrQ   DOTALL)r   test_outputr   r   r   get_output_without_xpeer  s   
z-DebuggingServerTests.get_output_without_xpeerc                 C   "   t jt| jdtjd}|  d S N	localhostr:   rE   r'   r]   r3   r)   r   LOOPBACK_TIMEOUTquitr   smtpr   r   r   	testBasic     zDebuggingServerTests.testBasicc              
   C   s   t  }z.tj| j| jdtj| j|fd}| |j	 | 
|j| j|f | 
|jd |  W d S  tyL } z|jtjkrG| d|   d }~ww )Nr   )r:   rE   r7   zcouldn't bind to source port %d)r   Zfind_unused_portr'   r]   r   r)   r   r   
addCleanupr   r,   r7   r:   r   OSErrorerrnoZ
EADDRINUSEZskipTest)r   Zsrc_portr   r"   r   r   r   r8      s    z&DebuggingServerTests.testSourceAddressc                 C   B   t jt| jdtjd}| |j d}| |	 | |
  d S Nr   r      s   OK)r'   r]   r3   r)   r   r   r   r   r,   noopr   r   r   r-   r   r   r   testNOOP0     zDebuggingServerTests.testNOOPc                 C   r   r   )r'   r]   r3   r)   r   r   r   r   r,   Zrsetr   r   r   r   r   testRSET8  r   zDebuggingServerTests.testRSETc                 C   r   )Nr   r   )r   s   
SIZE 33554432
HELP)r'   r]   r3   r)   r   r   r   r   r,   ehlor   r   r   r   r   testELHO@  s   zDebuggingServerTests.testELHOc                 C   sL   t jt| jdtjd}| |j d}|d | 	|
 | |  d S )Nr   r   )i  s   EXPN not implementedZEXPN)r'   r]   r3   r)   r   r   r   r   putcmdr,   Zgetreplyr   r   r   r   r   testEXPNNotImplementedI  s   
z+DebuggingServerTests.testEXPNNotImplementedc                 C   st   t jt| jdtjd}| |j | t	}|
d W d    n1 s&w   Y  | dt|j |  d S )Nr   r   zhelo
X-INJECTEDprohibited newline characters)r'   r]   r3   r)   r   r   r   r   rG   rH   r   assertInstr	exceptionr   )r   r   excr   r   r   &test_issue43124_putcmd_escapes_newlineS  s   z;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinec                 C   sV   t jt| jdtjd}| |j d}| |	d| | |
d| |  d S )Nr   r   )   s>   Cannot VRFY user, but will accept message and attempt deliverynobody@nowhere.com)r'   r]   r3   r)   r   r   r   r   r,   vrfyZverifyr   r   r   r   r   testVRFY]  s   zDebuggingServerTests.testVRFYc                 C   sJ   t jt| jdtjd}| |j |  d}| 	| | |
  d S )Nr   r   )i  s   Duplicate HELO/EHLO)r'   r]   r3   r)   r   r   r   r   Zhelor,   r   r   r   r   r   testSecondHELOg  s   z#DebuggingServerTests.testSecondHELOc                 C   s>   t jt| jdtjd}| |j | |	 d |
  d S )Nr   r   s@   Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r'   r]   r3   r)   r   r   r   r   r,   helpr   r   r   r   r   testHELPr  s   zDebuggingServerTests.testHELPc                 C      d}t jt| jdtjd}| |j |dd| t	
d |  | j  | j  | j  dt|tf }| | j | d S )NA test messager   r   JohnSallyrj   %s%s
%sr'   r]   r3   r)   r   r   r   r   sendmailrm   rn   r   rp   r   ro   r   r   flush	MSG_BEGINMSG_ENDr,   rS   r   mr   mexpectr   r   r   testSendz  s   



zDebuggingServerTests.testSendc                 C   s   d}t jt| jdtjd}| |j |dd| t	
d |  | j  | j  | j  dt|dtf }| | j | d S )	Ns   A test messager   r   r   r   rj   r   ascii)r'   r]   r3   r)   r   r   r   r   r   rm   rn   r   rp   r   ro   r   r   r   r   decoder   r,   rS   r   r   r   r   testSendBinary  s   



z#DebuggingServerTests.testSendBinaryc                 C   r   )Nz.A test
.mes.sage.r   r   r   r   rj   r   r   r   r   r   r   testSendNeedingDotQuote  s   



z,DebuggingServerTests.testSendNeedingDotQuotec                 C   s   d}t jt| jdtjd}| |j | t	}|
dd| W d    n1 s*w   Y  | dt|j td |  tj }| d| d S )	Nwazzuuup
linetwozhi
X-INJECTEDr   	hi@me.com
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDrj   z
X-INJECTED)r'   r]   r3   r)   r   r   r   r   rG   rH   r   r   r   r   rm   rn   r   r   r   rS   assertNotIn)r   r   r   r   debugoutr   r   r   $test_issue43124_escape_localhostname  s    

z9DebuggingServerTests.test_issue43124_escape_localhostnamec                 C   s   d}t jt| jdtjd}| |j |dd| | 	t
}|dddg W d    n1 s2w   Y  t|j}| d| | d	| td
 |  tj }| d| | d| | d| | d| d S )Nr   r   r   r   r   zX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2r   z.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2rj   zX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r'   r]   r3   r)   r   r   r   r   r   rG   rH   mailr   r   r   rm   rn   r   r   r   rS   r   )r   r   r   r   msgr   r   r   r   test_issue43124_escape_options  s(   


z3DebuggingServerTests.test_issue43124_escape_optionsc                 C   s   d}t jt| jdtjd}| |j |dd| t	
d |  | j  | j  | j  dt|tf }| | j | tj }tdtj}| || d S )	Nr   r   r   z<>r   rj   r   z^sender: <>$)r'   r]   r3   r)   r   r   r   r   r   rm   rn   r   rp   r   ro   r   r   r   r   r   r,   rS   r   r   rO   rP   rQ   rR   )r   r   r   r   r   senderr   r   r   testSendNullSender  s    




z'DebuggingServerTests.testSendNullSenderc                 C   s   t jjd}tjt| jdtj	d}| 
|j |j|ddd td |  | j  | j  | j  |  }|d= d	t| tf }| || d S )
Nr   r   r   r   r   Z	from_addrZto_addrsrj   X-Peerr   )emailmimetextMIMETextr'   r]   r3   r)   r   r   r   r   send_messagerm   rn   r   rp   r   ro   r   r   r   r   r   	as_stringr   r,   )r   r   r   r   r   r   r   r   testSendMessage  s   



z$DebuggingServerTests.testSendMessagec           	      C   s  t jjd}d|d< d|d< d|d< d|d	< tjt| jd
tj	d}| 
|j || td |  | |d	 d | j  | j  | j  |  }|d= |d	= dt| tf }| || tj }tdtj }| !|| dD ]}td"|tj }| !|| qzd S )Nr   foo@bar.comFromr   ToSally, FredCC?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>Bccr   r   rj   r   r   ^sender: foo@bar.com$)r   r   ZFredzroot@localhostzwarped@silly.walks.com^recips: .*'{}'.*$)#r   r   r   r   r'   r]   r3   r)   r   r   r   r   r   rm   rn   r   r,   rp   r   ro   r   r   r   r   r   r   r   r   r   rS   rO   rP   rQ   rR   format	r   r   r   r   r   r   r   r   to_addrr   r   r   testSendMessageWithAddresses  s<   





z1DebuggingServerTests.testSendMessageWithAddressesc           	      C   s   t jjd}d|d< d|d< tjt| jdtj	d}| 
|j || td |  | j  | j  | j  |  }|d	= d
t| tf }| || tj }tdtj }| !|| dD ]}td"|tj }| !|| qgd S )Nr   r   r   John, Dinsdaler   r   r   rj   r   r   r   r   Dinsdaler   #r   r   r   r   r'   r]   r3   r)   r   r   r   r   r   rm   rn   r   rp   r   ro   r   r   r   r   r   r   r   r,   r   r   rS   rO   rP   rQ   rR   r   r   r   r   r    testSendMessageWithSomeAddresses(  s4   





z5DebuggingServerTests.testSendMessageWithSomeAddressesc           
      C   s  t jjd}d|d< d|d< tjt| jdtj	d}| 
|j |j|dd	d
 td |  | j  | j  | j  |  }|d= dt| tf }| || tj }tdtj }| !|| dD ]}td"|tj }| #|| qjtdtj }	| !||	 d S )Nr   r   r   r   r   r   r   zjoe@example.comzfoo@example.netr   rj   r   r   z^sender: joe@example.com$r   r   z^recips: .*'foo@example.net'.*$)$r   r   r   r   r'   r]   r3   r)   r   r   r   r   r   rm   rn   r   rp   r   ro   r   r   r   r   r   r   r   r,   r   r   rS   rO   rP   rQ   rR   r   ZassertNotRegex)
r   r   r   r   r   r   r   r   r   Zrecipr   r   r   %testSendMessageWithSpecifiedAddressesE  s6   




z:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc           	      C   s   t jjd}d|d< d|d< d|d< tjt| jdtj	d	}| 
|j || td
 |  | j  | j  | j  |  }|d= dt| tf }| || tj }tdtj }| !|| dD ]}td"|tj }| !|| qkd S )Nr   zBernard, Biancar   z#the_rescuers@Rescue-Aid-Society.comZSenderr   r   r   r   rj   r   r   z-^sender: the_rescuers@Rescue-Aid-Society.com$r   r   r   r   r   r   r   testSendMessageWithMultipleFromd  s6   





z4DebuggingServerTests.testSendMessageWithMultipleFromc           	      C   s4  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tj	d}| 
|j || td |  | j  | j  | j  |d	= |d= |  }|d= dt| tf }| || tj }tdtj }| !|| dD ]}td"|tj }| !|| qd S )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 <my_mom@great.cooker.com>, Jeff	Resent-Todoe@losthope.net
Resent-Bccr   r   rj   r   r   z^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffr  r   r   r   r   r   r   testSendMessageResent  sD   





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tj	d}| 
|j | t || W d    n1 sYw   Y  |  d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  zThu, 2 Jan 1970 17:42:00 +0000r   r   )r   r   r   r   r'   r]   r3   r)   r   r   r   r   rG   rH   r   r   r   r   r   r   r   #testSendMessageMultipleResentRaises  s(   z8DebuggingServerTests.testSendMessageMultipleResentRaises)rY   rZ   r[   maxDiffr*   r+   r   r   r8   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   rr      s8    	


$%rr   c                   @   $   e Zd Zd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]   rG   SMTPServerDisconnectedr   r   r   r   r   r   testNotConnected  s
   z#NonConnectingTests.testNotConnectedc                 C   s&   |  ttjdd |  ttjd d S )Nr   Zboguszlocalhost:bogus)rG   r   r'   r]   r   r   r   r   testNonnumericPort  s   

z%NonConnectingTests.testNonnumericPortc                 C   s:   t  }| |j W d    d S 1 sw   Y  d S r   )r'   r]   r=   r@   r   r   r   r   testSockAttributeExists  s   
"z*NonConnectingTests.testSockAttributeExistsN)rY   rZ   r[   r
  r  r  r   r   r   r   r    s    
r  c                   @   r  )DefaultArgumentsTestsc                 C   sD   t  | _d| jd< t | _tdd| j_t t | j_| j_d S )N   Páolo <főo@bar.com>r   )   ZOK)Zreturn_value)	r   r   r'   r]   r   r	   r   has_extnr   r   r   r   r   r*     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)SMTPUTF8BODY=8BITMIMEr      r   r   r   r   r,   r   Zcall_args_list)r   expected_mail_optionsr   r   r   r     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  r  r   r  r  )r   mail_optionsr  r   r   r   testSendMessageWithMailOptions  s   z4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rY   rZ   r[   r*   r   r  r   r   r   r   r    s    	r  c                   @   r  )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(   r1   r~   r   r   r   r   r   r)   r   r   r   r   r*     s   


zBadHELOServerTests.setUpc                 C   s   t t_ | jt_d S r   )r(   r'   r   r~   r   r   r   r   r   r+     s   zBadHELOServerTests.tearDownc                 C      |  tjtjt| jdd d S Nr   r  )rG   r'   ZSMTPConnectErrorr]   r3   r)   r   r   r   r   testFailingHELO      
z"BadHELOServerTests.testFailingHELON)rY   rZ   r[   r*   r+   r  r   r   r   r   r    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   .rW      
c                 C   s   t  | _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   rw   )r   rz   r{   r~   r   r   r   r   r   r   r   r   r(   AF_INETSOCK_STREAMr@   
settimeoutr   Z	bind_portr)   respdatar   r$   r   r   r   r   )r   Zservargsr   r   r   r*     s   




zTooLongLineTests.setUpc                 C   s:   | j   | jt_t| j | `|   tj	| j
  d S r   )r   r   r   r~   r   r   r   r   r   r   r{   r   r   r   r   r+     s   
zTooLongLineTests.tearDownc                 C   r  r  )rG   r'   SMTPResponseExceptionr]   r3   r)   r   r   r   r   testLineTooLong   r  z TooLongLineTests.testLineTooLongN)	rY   rZ   r[   r'   Z_MAXLINEr%  r*   r+   r'  r   r   r   r   r    s
    r  zJohn AzSally BzRuth C)Mr.A@somewhere.comMs.B@xn--fo-fka.comMrs.C@somewhereesle.com)r(  Zsomepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=r(  r*  r)  )zlist-1zlist-2c                   @   s   e Zd ZdS )ResponseExceptionN)rY   rZ   r[   r   r   r   r   r+  2  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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                    s0   d dd |D | _tt| j|i | d S )N c                 S   s   g | ]}d  |qS )z	250-{0}
)r   ).0xr   r   r   
<listcomp>A  s    z+SimSMTPChannel.__init__.<locals>.<listcomp>)join_extrafeaturesrc   r,  __init__)r   Zextra_featuresry   kwrd   r   r   r4  ?  s   zSimSMTPChannel.__init__c              
      s   | j | jkrE| j| j}tdt|tjd g | _z| 	| W d S  t
yD } z| j| _ | d|j|jf  W Y d }~d S d }~ww t   d S )NzData:)file%s %s)
smtp_stateAUTHZ_emptystringr2  Zreceived_linesprintreprr   r   auth_objectr+  COMMANDpush	smtp_code
smtp_errorrc   found_terminator)r   liner"   rd   r   r   rA  E  s    zSimSMTPChannel.found_terminatorc                 C   s   | j s
| d d S | jrd| jvr| d d S | jd ur%| d d S | }t|dvr6| d d S d|d  d	d
 }zt	| || _
W n ty\   | d| Y d S w | j| _| 
t|dkrp|d  d S d  d S )Nz503 Error: send EHLO firstr9  z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)r   rW   z/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr   -_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rW   r   )seen_greetingr>  extended_smtpr3  authenticated_usersplitlenlowerreplacegetattrr<  AttributeErrorr   r9  r8  )r   argry   Zauth_object_namer   r   r   	smtp_AUTHS  s4   



(zSimSMTPChannel.smtp_AUTHc                 C   s,   |r|| _ | d n| d | j| _d S )Nz235 Authentication Succeededz&535 Authentication credentials invalid)rG  r>  r=  r8  )r   userZvalidr   r   r   _authenticatedl  s
   
zSimSMTPChannel._authenticatedc                 C   s   t |ddS )Nr   utf-8)base64Zdecodebytesencoder   )r   stringr   r   r   _decode_base64t  s   zSimSMTPChannel._decode_base64c              
   C   s   |d u r|  d d S | |}z|d^ }}}W n ty7 } z|  d|| W Y d }~d S d }~ww | ||td k d S )Nz334  =535 Splitting response {!r} into user and password failed: {}r   )r>  rV  rH  rH   r   rQ  sim_auth)r   rN  logpassrD  rP  passwordr"   r   r   r   _auth_plainw  s   
zSimSMTPChannel._auth_plainc                 C   sb   |d u r|  d d S t| ds| || _|  d d S | |}| | j|td k | `d S )Nz334 VXNlcm5hbWU6_auth_login_userz334 UGFzc3dvcmQ6r   )r>  rg   rV  r]  rQ  rY  )r   rN  r[  r   r   r   _auth_login  s   

zSimSMTPChannel._auth_loginc                 C   s   |  d d S )Nz334 QnVHZ1liVWdHeQ==)r>  r   rN  r   r   r   _auth_buggy  s   zSimSMTPChannel._auth_buggyc              
   C   s   |d u r|  dt d S | |}z| \}}W n ty7 } z|  d|| W Y d }~dS d }~ww ttd 	d| t	dd
 }| |||k d S )Nz334 {}rX  Fr   r   md5)r>  r   sim_cram_md5_challengerV  rH  rH   hmacZHMACrY  rT  	hexdigestrQ  )r   rN  rZ  rP  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)r3  r>  rE  rF  )r   rN  respr   r   r   	smtp_EHLO  s
   

zSimSMTPChannel.smtp_EHLOc                 C   s:   |t v r| dt | t|f  d S | d|  d S )N	250 %s %sz550 No such user: %s)	sim_usersr>  r'   	quoteaddrr_  r   r   r   	smtp_VRFY  s    zSimSMTPChannel.smtp_VRFYc                 C   s   |  }|tv r;t| }t|D ](\}}t|}|t|d k r-| dt| |f  q| dt| |f  qd S | d d S )Nr   z	250-%s %srh  z550 No access for you!)rJ  	sim_lists	enumerater'   rj  rI  r>  ri  )r   rN  Z	list_nameZ	user_listr   Z
user_emailZquoted_addrr   r   r   	smtp_EXPN  s   
zSimSMTPChannel.smtp_EXPNc                    s6   | j d u rtt| | d S | | j  |   d S r   )quit_responserc   r,  	smtp_QUITr>  close_when_doner_  rd   r   r   rp    s   
zSimSMTPChannel.smtp_QUITc                    s<   | j d u rt | d S | | j  | jr|   d S d S r   )mail_responserc   	smtp_MAILr>  
disconnectrq  r_  rd   r   r   rs    s   
zSimSMTPChannel.smtp_MAILc                    sB   | j d u rt | d S |  jd7  _| | j | jd   d S Nr   )rcpt_responserc   	smtp_RCPT
rcpt_countr>  r_  rd   r   r   rw    s
   
zSimSMTPChannel.smtp_RCPTc                    s   |  j d7  _ t | d S ru  )
rset_countrc   	smtp_RSETr_  rd   r   r   rz    s   zSimSMTPChannel.smtp_RSETc                    s*   | j d u rt | d S | | j  d S r   )data_responserc   	smtp_DATAr>  r_  rd   r   r   r|    s   
zSimSMTPChannel.smtp_DATAc                  C       r   r   r   r   r   r   handle_error     zSimSMTPChannel.handle_errorr   )rY   rZ   r[   ro  rr  rv  r{  rx  ry  rt  r9  rG  r4  rA  rO  rQ  rV  r\  r^  r`  re  rg  rk  rn  rp  rs  rw  rz  r|  r~  rh   r   r   rd   r   r,  3  s8    



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| g|R i | d S r   )_extra_features
_addressesr   
SMTPServerr4  r   ry   r5  r   r   r   r4    s   zSimSMTPServer.__init__c                 C   s   | j | j| ||| jd| _d S )Nru   )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 r   )r  append)r   Zfeaturer   r   r   add_feature  s   zSimSMTPServer.add_featurec                  C   r}  r   r   r   r   r   r   r~     r  zSimSMTPServer.handle_errorN)
rY   rZ   r[   r,  r  r4  r  r  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ejddddd Zejddd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d0d1 Zd2d3 Zd4d5 Zd6S )7SMTPSimTestsc                 C      t  | _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   rs   Tru   r   rw   )r   rz   r{   r(   r|   r}   r   r   r   ro   rp   r  r3   r   r   r)   r   rq   r   r   r   r   r   r   r   r   r*     s   




zSMTPSimTests.setUpc                 C   D   | j t_| j  | j  t| j	 | `	| 
  tj| j  d S r   r}   r(   r|   rp   r   ro   r   r   r   r   r   r   r{   r   r   r   r   r+        

zSMTPSimTests.tearDownc                 C   r   r   r   r   r   r   r   r   %  r   zSMTPSimTests.testBasicc                 C   s   t jt| jdtjd}| |ji  dddddd}|  | |j| |D ]
}| 	|
| q'| |
d |  d S )Nr   r   r.  Z20000000)expnsizeZstarttlsZ	deliverbyr   zunsupported-feature)r'   r]   r3   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tjd}t D ]\}}dtd|t 	|f df}| 
||| qd}dd| df}| 
||| |  d S )	Nr   r   r   r7  r   r   &  zNo such user: %s)r'   r]   r3   r)   r   r   ri  itemsbytesrj  r,   r   rT  r   )r   r   Z	addr_specnameexpected_knownuexpected_unknownr   r   r   r   A  s   zSMTPSimTests.testVRFYc           	   	   C   s   t jt| jdtjd}t D ],\}}g }|D ]}|dt	| t 
|f  qdtd|df}| ||| qd}d}| ||| |  d S )	Nr   r   r7  r   
r   zPSU-Members-List)r  s   No access for you!)r'   r]   r3   r)   r   r   rl  r  r  ri  rj  r  r2  r,   r  r   )	r   r   ZlistnamemembersZusersr   r  r  r  r   r   r   testEXPNP  s   zSMTPSimTests.testEXPNc                 C   N   | j d tjt| jdtjd}|t	d t	d }| 
|d |  d S )N
AUTH PLAINr   r   r   r      s   Authentication Succeededr   r  r'   r]   r3   r)   r   r   loginrY  r,   r   r   r   rf  r   r   r   testAUTH_PLAIN`     zSMTPSimTests.testAUTH_PLAINc                 C   r  )N
AUTH LOGINr   r   r   r   r  r  r  r   r   r   testAUTH_LOGINh  r  zSMTPSimTests.testAUTH_LOGINc                 C   |   | j d tjt| jdtjd#}t\|_	|_
|d |jd|jdd}| |d W d    d S 1 s7w   Y  d S )	Nr  r   r   test_auth_loginLOGINTZinitial_response_okr  r   r  r'   r]   r3   r)   r   r   rY  rP  r[  r   authZ
auth_loginr,   r  r   r   r   "testAUTH_LOGIN_initial_response_okp     
"z/SMTPSimTests.testAUTH_LOGIN_initial_response_okc                 C   r  )	Nr  r   r   r  r  Fr  r  r  r  r   r   r   %testAUTH_LOGIN_initial_response_notoky  r  z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokc                    s    j d d fdd	}tjt jdtjd}z:t\|_	|_
|d d} tj|}|jd|d	d
 W d    n1 s@w   Y  W |  d S W |  d S |  w )Nz
AUTH BUGGYc                    s     d|  dS )Ns
   BuGgYbUgGyrW  )r,   )Z	challenger   r   r   
auth_buggy  s   z/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggyr   r   Ztest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr  r   )r   r  r'   r]   r3   r)   r   r   rY  rP  r[  r   ZassertRaisesRegexZSMTPExceptionr  r   )r   r  r   expectcmr   r   r   testAUTH_BUGGY  s    
zSMTPSimTests.testAUTH_BUGGYra  T)Zopensslc                 C   r  )NzAUTH CRAM-MD5r   r   r   r   r  r  r  r   r   r   testAUTH_CRAM_MD5  s   zSMTPSimTests.testAUTH_CRAM_MD5c                 C   r  )NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r   r   r   r   r  r  r  r   r   r   testAUTH_multiple  s   zSMTPSimTests.testAUTH_multiplec              	   C   s   ddh}zt   W n	 ty   Y nw |d |D ]}| jd| q|D ]P}| j|d@ tj	t
| jdtjd}|d td	 td
 |_|_d| dd }||t||}| |d |  W d    n1 stw   Y  q)d S )NZPLAINr  zCRAM-MD5zAUTH {})	mechanismr   r   Zfoor   r   Zauth_rC  rD  r  )hashlibra  rH   addr   r  r   ZsubTestr'   r]   r3   r)   r   r   r   rY  rP  r[  rJ  rK  r  rL  r,   r   )r   Z	supportedr  r   methodrf  r   r   r   test_auth_function  s0   



zSMTPSimTests.test_auth_functionc                 C   s   t jt| jdtjd}| \}}| |d | d|j	 |
  | d|j	 |t| j | d|j	 |  | d|j	 |
  d S )Nr   r   r   r  )r'   r]   r3   r)   r   r   r   r,   r   r  r   r   rN   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    n1 sw   Y  | t j|jd t t| j}|	  W d    n1 sBw   Y  | t j|jd d S )Nr   s   foo)
r'   r]   r3   r)   r   r,   rG   r	  r   r   r  r   r   r   test_with_statement  s   
z SMTPSimTests.test_with_statementc              	   C   s   |  tj(}tt| j}|  d| jj_	W d    n1 s"w   Y  W d    n1 s1w   Y  | 
|jjd | 
|jjd d S )Nz421 QUIT FAILED  s   QUIT FAILED)rG   r'   r&  r]   r3   r)   r   r   r  ro  r,   r   r?  r@  )r   errorr   r   r   r    test_with_statement_QUIT_failure  s   z-SMTPSimTests.test_with_statement_QUIT_failurec                 C   s|   t jt| jdtjd}|  d| jj_	d| jj_
| t j |ddd W d    n1 s1w   Y  | |j d S )Nr   r   z451 Requested action abortedTr   r   test message)r'   r]   r3   r)   r   r   r   r   r  rr  rt  rG   SMTPSenderRefusedr   r=   r@   r   r   r   r   test__rest_from_mail_cmd  s   

z%SMTPSimTests.test__rest_from_mail_cmdc                 C   s   t jt| jdtjd}|  d| jj_	| 
t j |ddd W d    n1 s,w   Y  | |j | | jjjd d S )Nr   r   z421 closing connectionr   r   r  r   )r'   r]   r3   r)   r   r   r   r   r  rr  rG   r  r   r=   r@   r,   ry  r   r   r   r   test_421_from_mail_cmd  s   
z#SMTPSimTests.test_421_from_mail_cmdc                 C   s   t jt| jdtjd}|  ddg| jj_	| 
t j}|dg dd W d    n1 s0w   Y  | |j | | jjjd | |jjd d	d
i d S )Nr   r   z250 accepted421 closingr   )r   FrankZGeorger  r   r  )r  s   closing)r'   r]   r3   r)   r   r   r   r   r  rv  rG   ZSMTPRecipientsRefusedr   r=   r@   r,   ry  assertDictEqualr   ry   )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tjd}|	  | 
tj |ddgd W d    n1 s4w   Y  | |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 d S t   d S )Nr  )r8  ZDATAr>  rc   rA  r   rd   r   r   rA    s   zNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rY   rZ   r[   rA  rh   r   r   rd   r   MySimSMTPChannel  s    r  r   r   zJohn@foo.orgzSally@foo.orgr  r   )r,  r   r  r'   r]   r3   r)   r   r   r   rG   ZSMTPDataErrorr   r=   r@   r,   r  rx  )r   r  r   r   r   r   test_421_from_data_cmd  s   z#SMTPSimTests.test_421_from_data_cmdc                 C   s   t jt| jdtj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 )Nr   r   smtputf8r   r   r.  r  r  r  options)r'   r]   r3   r)   r   r   r   r   r   r  
does_esmtpr  r  rG   SMTPNotSupportedErrorr   r   r   r   r   r   4test_smtputf8_NotSupportedError_if_no_server_support  s"   
zASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportc                 C   sJ   t jt| jdtjd}| |j | t	|j
ddd | t	|jd d S )Nr   r   ZAliceu   Böbr.  u   Älice)r'   r]   r3   r)   r   r   r   r   rG   UnicodeEncodeErrorr   r   r   r   r   r   "test_send_unicode_without_SMTPUTF8#  s   z/SMTPSimTests.test_send_unicode_without_SMTPUTF8c                 C   s|   t  }d|d< d|d< d|d< tjt| jdtjd}| |j | 	tj
 || W d    d S 1 s7w   Y  d S )	Nr  r   r   r      Nudge nudge, wink, wink ὠ9Subjectr   r   )r   r'   r]   r3   r)   r   r   r   r   rG   r  r   )r   r   r   r   r   r   9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8+  s   "zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8c                 C   s   t jt| jdtjd}| |j t }t	j
d|d< t	j
d|d< | ||i  | | jjd d | | jjd	 d
g d S )Nr   r   )u   Michaëlmichael@example.comr   )u   Renérene@example.comr   r  r  r  r  )r'   r]   r3   r)   r   r   r   r   r   r   ZutilsZ
formataddrr  r   r,   r   r  )r   r   r  r   r   r   1test_name_field_not_included_in_envelop_addresses9  s   z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rY   rZ   r[   r*   r+   r   r  r   r  r  r  r  r  r  r   Zrequires_hashdigestr  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s8    		

		
r  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| g|R i | d S )Nr  Z8BITMIME)r  r   r  r4  r  r   r   r   r4  K  s   
zSimSMTPUTF8Server.__init__c                 C   s"   | j | j| ||| j| jd| _d S )Nrv   enable_SMTPUTF8)r  r  r  r  r  r  r   r   r   r  R  s
   
z!SimSMTPUTF8Server.handle_acceptedNc                 C   s(   || _ || _|| _|| _|| _|| _d S r   )Z	last_peerlast_mailfromlast_rcpttoslast_messagelast_mail_optionslast_rcpt_options)r   r  r  r  r  r  Zrcpt_optionsr   r   r   r  Y  s   
z!SimSMTPUTF8Server.process_message)NN)rY   rZ   r[   r4  r  r  r   r   r   r   r  I  s    r  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  | _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   rs   FTr  r   rw   )r   rz   r{   r(   r|   r}   r   r   r   ro   rp   r  r3   r   r   r)   r   rq   r   r   r   r   r   r   r   r   r*   g  s   





zSMTPUTF8SimTests.setUpc                 C   r  r   r  r   r   r   r   r+   {  r  zSMTPUTF8SimTests.tearDownc                 C   sJ   t jt| jdtjd}| |j |  | 	|j
 | 	|d d S )Nr   r   r  )r'   r]   r3   r)   r   r   r   r   r   r  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tj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 )
N$   ¡a test message containing unicode!rR  r   r   u   Jőhnu   Sállyr  r  r  )rT  r'   r]   r3   r)   r   r   r   r   r   r,   r   r  r  r  r   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tj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 )Nr  rR  r   r   u   Jőr  r  r  r   u   János)rT  r'   r]   r3   r)   r   r   r   r   r   r,   r   Zrcptr  r   r  r  r  r   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	tj	d
}| 
|j | ||i  | | jjd | | jjdg | | jj | | d| jj | d| jj | | jjg  d S )Nr  r   r   r   r  r  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?
            r   r   u   főo@bar.comr  r  )r   Zset_contenttextwrapdedentr'   r]   r3   r)   r   r   r   r   r,   r   r   r  r  r  r   r   r  r  )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)
rY   rZ   r[   r  r*   r+   r  r  r  r  r   r   r   r   r  c  s    	r  s    psu doesnotexistr.  )Z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   plainrW   r   z235 Okz571 Bad authentication)rH  rJ  rI  EXPECTED_RESPONSEr>  )r   rN  ry   r   r   r   rO    s   
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rY   rZ   r[   rO  r   r   r   r   r    s    r  c                   @   s   e Zd ZeZdS ) SimSMTPAUTHInitialResponseServerN)rY   rZ   r[   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   r  r  )r   rz   r{   r(   r|   r}   r   r   r   ro   rp   r  r3   r   r   r)   r   rq   r   r   r   r   r   r   r   r   r*     s   





z%SMTPAUTHInitialResponseSimTests.setUpc                 C   r  r   r  r   r   r   r   r+     r  z(SMTPAUTHInitialResponseSimTests.tearDownc                 C   s:   | j d tjt| jdtjd}|dd |	  d S )Nr  r   r   psudoesnotexist)
r   r  r'   r]   r3   r)   r   r   r  r   r   r   r   r   %testAUTH_PLAIN_initial_response_login  s   zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_loginc                 C   sX   | j d tjt| jdtjd}d|_d|_	|
d|j\}}|  | |d d S )Nr  r   r   r  r   r  r  )r   r  r'   r]   r3   r)   r   r   rP  r[  r  Z
auth_plainr   r,   )r   r   r  responser   r   r   $testAUTH_PLAIN_initial_response_auth  s   zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rY   rZ   r[   r*   r+   r  r  r   r   r   r   r    s
    r  __main__)HrS  Zemail.mime.textr   Zemail.messager   Zemail.base64mimer   Zencode_base64Zemail.utilsr  rc  r(   r'   r   rO   r~   rm   r   r   r  r   rf   testr   r   Ztest.supportr   r   r   Zunittest.mockr	   warningscatch_warningssimplefilterDeprecationWarningrk   r   r3   platformr   ZSMTPChannelr$   r%   ZTestCaser\   r^   rq   r   r   rr   r  r  r  r  ri  rY  rb  rl  	Exceptionr+  r,  r  r  r  r  r  r  r  r  r  rY   mainr   r   r   r   <module>   s    


c   X  9  Eo
1