
    <ej                     d   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mZ  ej         d
          Z! ej         d          Z" ej#        d           ej$        Z$ej%        dk    rd Z&e&e"j'        _&        d Z( G d d          Z) G d de)ej*                  Z+ G d de)ej*                  Z,d Z-dZ.dZ/ G d dej*                  Z0 G d dej*                  Z1 G d dej*                  Z2 G d  d!ej*                  Z3 G d" d#ej*                  Z4d$d%d&d'Z5d(Z6d)Z7d*d+gd,gd-Z8 G d. d/e9          Z: G d0 d1e"j'                  Z; G d2 d3e"j<                  Z= G d4 d5ej*                  Z> G d6 d7e=          Z? G d8 d9ej*                  Z@ ed:d;<          ZA G d= d>e;          ZB G d? d@e=          ZC G dA dBej*                  ZDeEdCk    r ejF                     dS dS )D    N)EmailMessage)body_encode)supportmock_socket)hashlib_helper)socket_helper)threading_helper)warnings_helper)MockasyncoresmtpdT)moduledarwinc                     d S N selfs    (/usr/lib/python3.11/test/test_smtplib.pyhandle_exptr   '   s        c                     |                                  |                                  	 |                                \  }}d}|rO|dk    rIt          j        g |gg           \  }}}|r|                    |          }	||	d          }|dz  }|r|dk    I|                                 n# t          $ r Y nw xY w|                                 |                                  d S # |                                 |                                  w xY w)Ni  r      )listensetacceptselectsendcloseTimeoutError)
evtbufservconnaddrnrwesents
             r   serverr+   ,   s   KKMMMGGIII[[]]
d  	a!eemB33GAq! !yy~~$%%jFA  	a!ee 	

     	

					 	

				s*   B) A(C# )
B63C# 5B66C# #*Dc                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )GeneralTestsc                 6    t           t          _        d| _        d S )N   )r   smtplibsocketportr   s    r   setUpzGeneralTests.setUpD   s    $			r   c                 (    t           t          _         d S r   )r1   r0   r   s    r   tearDownzGeneralTests.tearDownH   s    r   c                 ^    d}d}|                      |t          j        |                     d S )Nzabc
.jklfoo
..bluezabc
..jkl
foo
...blue)assertEqualr0   	quotedata)r   teststrexpecteds      r   testQuoteDatazGeneralTests.testQuoteDataM   s3    -37#4W#=#=>>>>>r   c                     t          j        d           |                     t          | j                  }|                                 d S )N   220 Hola mundor   
reply_withclientHOSTr2   r   r   r@   s     r   
testBasic1zGeneralTests.testBasic1R   s:    0111T49--r   c                     t          j        d           |                     t          | j        d          }|                     |j        d           |                                 d S )Nr=   )z	127.0.0.1iM  )source_address)r   r?   r@   rA   r2   r7   rE   r   rB   s     r   testSourceAddresszGeneralTests.testSourceAddressX   sb    0111T49,?  A A.0DEEEr   c                     t          j        d           |                     t          d| j                  }|                                 d S )Nr=   :r>   rB   s     r   
testBasic2zGeneralTests.testBasic2`   sC    0111dii899r   c                     t          j        d           |                     t          | j        d          }|                     |j        d           |                                 d S )Nr=   testhost)local_hostname)r   r?   r@   rA   r2   r7   rL   r   rB   s     r   testLocalHostNamezGeneralTests.testLocalHostNamef   sW    0111T49ZHH.
;;;r   c                    t          j        d           |                     t          j                               t          j        d           |                     t          j                    d           	 |                     t          | j                  }t          j        d            n# t          j        d            w xY w|                     |j	        
                                d           |                                 d S )Nr=      )r   r?   assertIsNonegetdefaulttimeoutsetdefaulttimeoutr7   r@   rA   r2   sock
gettimeoutr   rB   s     r   testTimeoutDefaultzGeneralTests.testTimeoutDefaultm   s    0111+799:::%b)))688"===	0[[ty11F)$////K)$//////112666s   7 B, ,Cc                    t          j        d           |                     t          j                               t          j        d           	 |                     t          | j        d           }t          j        d            n# t          j        d            w xY w|                     |j	        
                                           |                                 d S Nr=   rO   timeout)r   r?   rP   r1   rQ   rR   r@   rA   r2   rS   rT   r   rB   s     r   testTimeoutNonezGeneralTests.testTimeoutNoney   s    0111&244555 $$$	+[[ty$[??F$T****F$T****&+0022333s   "B Bc                     t          j        d           |                     t                    5  |                     t
          | j        d           d d d            d S # 1 swxY w Y   d S )Nr=   r   rX   )r   r?   assertRaises
ValueErrorr@   rA   r2   r   s    r   testTimeoutZerozGeneralTests.testTimeoutZero   s    0111z** 	4 	4KKdiK333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   #AA#&A#c                     t          j        d           |                     t          | j        d          }|                     |j                                        d           |                                 d S rW   )	r   r?   r@   rA   r2   r7   rS   rT   r   rB   s     r   testTimeoutValuezGeneralTests.testTimeoutValue   sb    0111T49b99//112666r   c                    t          j        d           |                                 }|                    d           t	          j                    5 }|                    t          | j                   d d d            n# 1 swxY w Y   |	                                 t          j        dt          j                  }|                     |                                |           d S )N   220 Hello worldr   z	^connect:r   r?   r@   set_debuglevelr   captured_stderrconnectrA   r2   r   recompile	MULTILINEassertRegexgetvaluer   r@   stderrr:   s       r   test_debuglevelzGeneralTests.test_debuglevel   s    1222a   $&& 	,&NN4+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,:lBL99**H55555   !A>>BBc                    t          j        d           |                                 }|                    d           t	          j                    5 }|                    t          | j                   d d d            n# 1 swxY w Y   |	                                 t          j        dt          j                  }|                     |                                |           d S )Nrb      z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rc   rl   s       r   test_debuglevel_2zGeneralTests.test_debuglevel_2   s    1222a   $&& 	,&NN4+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,:D l, ,**H55555ro   N)__name__
__module____qualname__r3   r5   r;   rC   rF   rI   rM   rU   rZ   r^   r`   rn   rr   r   r   r   r-   r-   B   s               
? ? ?
        
 
 
	 	 	4 4 4
  6 6 6	6 	6 	6 	6 	6r   r-   c                       e Zd Zej        ZdS )SMTPGeneralTestsN)rs   rt   ru   r0   SMTPr@   r   r   r   rw   rw      s        \FFFr   rw   c                   t     e Zd Zej        Z ej         ee	d          d          d             Z
 fdZ xZS )LMTPGeneralTestsAF_UNIXz test requires Unix domain socketc                 F   d}t          j        d           	 |                     || j                  }t          j        d            n# t          j        d            w xY w|                     |j                                                   |                                 d S )N!/some/local/lmtp/delivery/programrb   )	r   r?   r@   r2   rR   rP   rS   rT   r   )r   
local_hostr@   s      r   "testUnixDomainSocketTimeoutDefaultz3LMTPGeneralTests.testUnixDomainSocketTimeoutDefault   s    8
1222	0[[TY77F)$////K)$////&+0022333s   A Ac                     t                                                       d}|                     t                    5  |                     |d           d d d            d S # 1 swxY w Y   d S )Nr}   r   rX   )superr^   r\   r]   r@   )r   r~   	__class__s     r   r^   z LMTPGeneralTests.testTimeoutZero   s    !!!8
z** 	/ 	/KK
AK...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   A##A'*A')rs   rt   ru   r0   LMTPr@   unittest
skipUnlesshasattrr1   r   r^   __classcell__r   s   @r   rz   rz      sv        \FX335WXX  YX/ / / / / / / / /r   rz   c                 0   |                                  	 t          t          d          rt          j        }nt          j        }d}t          j        r\|dk    rV |dt          j                   |                                r|                                  n|dz  }t          j        r|dk    Vn# t          $ r Y nw xY w|                                s(t          j        d           |                                  t                                           |                                  d S # |                                s(t          j        d           |                                  t                                           |                                  w xY w)Npolli  r   {Gz?r   g      ?)r   r   r   r   poll2r   
socket_mapis_setr   r    timesleep	close_all)r#   serv_evt
client_evtpoll_funr&   s        r   debugging_serverr      sr   LLNNN66"" 	%~HH}H! 		a!eeHT8.///   "" 

FA ! 		a!ee       "" 	JsOOOJJLLL   "" 	JsOOOJJLLLs+   BB/ .D* /
B<9D* ;B<<D* *A+Fz&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )DebuggingServerTestsNc                 j   t          j                    | _        t          j        | _        t          j        t          _        t          j        | _	        t          j                    | _        | j        t          _        t          j                    | _        t          j                    | _        t"          j        | _        t          j                    t"          _        t"                              t*          dfdd          | _        | j        j                                        d d         \  | _        | _        | j        | j        | j        f}t          j        t6          |          | _        | j                                         | j                                         | j                                         d S )Nr   nowhereTdecode_datarq   targetargs) r	   threading_setup
thread_keyr1   getfqdnreal_getfqdnr   sysstdout
old_stdoutioStringIOoutput	threadingEventr   r   r   DEBUGSTREAMold_DEBUGSTREAMDebuggingServerrA   r#   getsocknamehostr2   Threadr   threadstartwaitclearr   	serv_argss     r   r3   zDebuggingServerTests.setUp   s;   *:<<"N$,*kmm[
!))#/++$0KMM))4)_6: * < <	  $y/;;==bqbA	49Yt?	&.>YOOO 	r   c                    | j         t          _        | j                                         | j                                         t          j        | j	                   | j
        t          _        t          j                                         | j        t          _        | `	|                                  t          j        | j          d S r   )r   r1   r   r   r   r   r   r	   join_threadr   r   r   r   r   r   r   r   
doCleanupsthreading_cleanupr   r   s    r   r5   zDebuggingServerTests.tearDown  s    *$T[111_
!!! 0K*DO<<<<r   c                     | j                                         }t          j        dd|t          j        t          j        z            S )Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)flags)r   rk   rg   subri   DOTALL)r   test_outputs     r   get_output_without_xpeerz-DebuggingServerTests.get_output_without_xpeer  sE    k**,,v2G!bi)?A A A 	Ar   c                     t          j        t          | j        dt          j                  }|                                 d S N	localhostrL   rY   r0   rx   rA   r2   r   LOOPBACK_TIMEOUTquitr   smtps     r   	testBasiczDebuggingServerTests.testBasic  7    |D$)K$+$<> > >		r   c                    t          j                    }	 t          j        | j        | j        dt          j        | j        |f          }|                     |j	                   | 
                    |j        | j        |f           | 
                    |j        d           |                                 d S # t          $ r3}|j        t          j        k    r|                     d|z              d }~ww xY w)Nr   )rL   rY   rE   zcouldn't bind to source port %d)r   find_unused_portr0   rx   r   r2   r   r   
addCleanupr   r7   rE   rL   r   OSErrorerrno
EADDRINUSEskipTest)r   src_portr   r)   s       r   rF   z&DebuggingServerTests.testSourceAddress"  s     133	<	49[(/(@04	8/DF F FD OODJ'''T049h2GHHHT0+>>>IIKKKKK 	 	 	w%***?(JKKK	s   BB6 6
C3 .C..C3c                    t          j        t          | j        dt          j                  }|                     |j                   d}|                     |	                                |           |
                                 d S Nr   r      s   OK)r0   rx   rA   r2   r   r   r   r   r7   noopr   r   r   r:   s      r   testNOOPzDebuggingServerTests.testNOOP2  n    |D$)K$+$<> > >
###h///		r   c                    t          j        t          | j        dt          j                  }|                     |j                   d}|                     |	                                |           |
                                 d S r   )r0   rx   rA   r2   r   r   r   r   r7   rsetr   r   s      r   testRSETzDebuggingServerTests.testRSET:  r   r   c                    t          j        t          | j        dt          j                  }|                     |j                   d}|                     |	                                |           |
                                 d S )Nr   r   )r   s   
SIZE 33554432
HELP)r0   rx   rA   r2   r   r   r   r   r7   ehlor   r   s      r   testELHOzDebuggingServerTests.testELHOB  sn    |D$)K$+$<> > >
###2h///		r   c                 8   t          j        t          | j        dt          j                  }|                     |j                   d}|                    d           | 	                    |
                                |           |                                 d S )Nr   r   )i  s   EXPN not implementedEXPN)r0   rx   rA   r2   r   r   r   r   putcmdr7   getreplyr   r   s      r   testEXPNNotImplementedz+DebuggingServerTests.testEXPNNotImplementedK  s    |D$)K$+$<> > >
###1F(333		r   c                    t          j        t          | j        dt          j                  }|                     |j                   |                     t                    5 }|
                    d           d d d            n# 1 swxY w Y   |                     dt          |j                             |                                 d S )Nr   r   zhelo
X-INJECTEDprohibited newline characters)r0   rx   rA   r2   r   r   r   r   r\   r]   r   assertInstr	exceptionr   )r   r   excs      r   &test_issue43124_putcmd_escapes_newlinez;DebuggingServerTests.test_issue43124_putcmd_escapes_newlineU  s    |D$)K$+$<> > >
###z** 	,cKK*+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,5s3=7I7IJJJ		s   !BB
Bc                 b   t          j        t          | j        dt          j                  }|                     |j                   d}|                     |	                    d          |           |                     |
                    d          |           |                                 d S )Nr   r   )   s>   Cannot VRFY user, but will accept message and attempt deliverynobody@nowhere.com)r0   rx   rA   r2   r   r   r   r   r7   vrfyverifyr   r   s      r   testVRFYzDebuggingServerTests.testVRFY_  s    |D$)K$+$<> > >
###2#788(CCC%9::HEEE		r   c                 6   t          j        t          | j        dt          j                  }|                     |j                   |                                 d}| 	                    |                                |           |
                                 d S )Nr   r   )i  s   Duplicate HELO/EHLO)r0   rx   rA   r2   r   r   r   r   helor7   r   r   s      r   testSecondHELOz#DebuggingServerTests.testSecondHELOi  s}     |D$)K$+$<> > >
###		0h///		r   c                 
   t          j        t          | j        dt          j                  }|                     |j                   |                     |	                                d           |
                                 d S )Nr   r   s@   Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r0   rx   rA   r2   r   r   r   r   r7   helpr   r   s     r   testHELPzDebuggingServerTests.testHELPt  sv    |D$)K$+$<> > >
### 'G 	H 	H 	H		r   c                 *   d}t          j        t          | j        dt          j                  }|                     |j                   |                    dd|           t          j
        d           |                                 | j                                         | j                                         | j                                         t$          |dt&          }|                     | j                                        |           d S )NA test messager   r   JohnSallyr   
r0   rx   rA   r2   r   r   r   r   sendmailr   r   r   r   r   r   r   r   flush	MSG_BEGINMSG_ENDr7   rk   r   mr   mexpects       r   testSendzDebuggingServerTests.testSend|  s    |D$)K$+$<> > >
###fgq))) 	
4		 )	111gg6--//99999r   c                 P   d}t          j        t          | j        dt          j                  }|                     |j                   |                    dd|           t          j
        d           |                                 | j                                         | j                                         | j                                         t$          |                    d          dt(          }|                     | j                                        |           d S )	Ns   A test messager   r   r   r   r   asciir   )r0   rx   rA   r2   r   r   r   r   r  r   r   r   r   r   r   r   r   r  r  decoder  r7   rk   r  s       r   testSendBinaryz#DebuggingServerTests.testSendBinary  s    |D$)K$+$<> > >
###fgq)))
4		 )	188G+<+<+<+<ggF--//99999r   c                 *   d}t          j        t          | j        dt          j                  }|                     |j                   |                    dd|           t          j
        d           |                                 | j                                         | j                                         | j                                         t$          |dt&          }|                     | j                                        |           d S )Nz.A test
.mes.sage.r   r   r   r   r   r   r  r  s       r   testSendNeedingDotQuotez,DebuggingServerTests.testSendNeedingDotQuote  s    !|D$)K$+$<> > >
###fgq)))
4		 )	111gg6--//99999r   c                 0   d}t          j        t          | j        dt          j                  }|                     |j                   |                     t                    5 }|
                    dd|           d d d            n# 1 swxY w Y   |                     dt          |j                             t          j        d           |                                 t"          j                                        }|                     d|           d S )	Nwazzuuup
linetwozhi
X-INJECTEDr   	hi@me.com
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDr   z
X-INJECTED)r0   rx   rA   r2   r   r   r   r   r\   r]   r  r   r   r   r   r   r   r   r   rk   assertNotIn)r   r  r   r   debugouts        r   $test_issue43124_escape_localhostnamez9DebuggingServerTests.test_issue43124_escape_localhostname  s3     |D$)<L$+$<> > >
###z** 	8cMM+|Q777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8A	
 	
 	

 	
4		$--//x00000s   #BBBc                    d}t          j        t          | j        dt          j                  }|                     |j                   |                    dd|           | 	                    t                    5 }|                    dddg           d d d            n# 1 swxY w Y   t          |j                  }|                     d|           |                     d	|           t          j        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-2r   zX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r0   rx   rA   r2   r   r   r   r   r  r\   r]   mailr   r   r   r   r   r   r   r   rk   r  )r   r  r   r   msgr  s         r   test_issue43124_escape_optionsz3DebuggingServerTests.test_issue43124_escape_options  s     |$)K,. . . 	
###k<333z** 	ZcIIk$<>W#XYYY	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z#-  5s;;;H#NNN
4		$--//X...h///22222222s   :BB#&B#c                    d}t          j        t          | j        dt          j                  }|                     |j                   |                    dd|           t          j
        d           |                                 | j                                         | j                                         | j                                         t$          |dt&          }|                     | j                                        |           t,          j                                        }t1          j        dt0          j                  }|                     ||           d S )	Nr   r   r   z<>r   r   r   z^sender: <>$)r0   rx   rA   r2   r   r   r   r   r  r   r   r   r   r   r   r   r   r  r  r  r7   rk   r   r   rg   rh   ri   rj   )r   r  r   r  r  senders         r   testSendNullSenderz'DebuggingServerTests.testSendNullSender  s)   |D$)K$+$<> > >
###dGQ'''
4		 )	111gg6--//999$--//NBL996*****r   c                    t           j        j                            d          }t	          j        t          | j        dt          j	                  }| 
                    |j                   |                    |dd           t          j        d           |                                 | j                                         | j                                         | j                                         |                                 }|d= t.          |                                d	t2          }|                     ||           d S )
Nr   r   r   r   r   	from_addrto_addrsr   X-Peerr   )emailmimetextMIMETextr0   rx   rA   r2   r   r   r   r   send_messager   r   r   r   r   r   r   r   r  r   r  	as_stringr  r7   )r   r  r   r   r  s        r   testSendMessagez$DebuggingServerTests.testSendMessage  s   JO$$%566|D$)K$+$<> > >
###!v@@@
4		
 3355hK )	1;;====''Bg.....r   c                 4   t           j        j                            d          }d|d<   d|d<   d|d<   d|d	<   t	          j        t          | j        d
t          j	                  }| 
                    |j                   |                    |           t          j        d           |                                 |                     |d	         d           | j                                         | j                                         | j                                         |                                 }|d= |d	= t0          |                                dt4          }|                     ||           t6          j                                        }t=          j        dt<          j                   }| !                    ||           dD ]J}t=          j        d"                    |          t<          j                   }| !                    ||           Kd S )Nr   foo@bar.comFromr   ToSally, FredCC?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>Bccr   r   r   r"  r   ^sender: foo@bar.com$)r   r   Fredzroot@localhostzwarped@silly.walks.com^recips: .*'{}'.*$)#r#  r$  r%  r&  r0   rx   rA   r2   r   r   r   r   r'  r   r   r   r7   r   r   r   r   r   r  r   r  r(  r  r   r   rk   rg   rh   ri   rj   format	r   r  r   r   r  r  r  r%   to_addrs	            r   testSendMessageWithAddressesz1DebuggingServerTests.testSendMessageWithAddresses  s   JO$$%566!&	$$T%|D$)K$+$<> > >
###!
4		5 $? 	@ 	@ 	@ 	3355hKeH )	1;;====''Bg...$--//3R\BB6***/ 	0 	0Dj!6!=!=d!C!C!#/ /GXw////		0 	0r   c                    t           j        j                            d          }d|d<   d|d<   t	          j        t          | j        dt          j	                  }| 
                    |j                   |                    |           t          j        d           |                                 | j                                         | j                                         | j                                         |                                 }|d	= t.          |                                d
t2          }|                     ||           t6          j                                        }t=          j        dt<          j                   }| !                    ||           dD ]J}t=          j        d"                    |          t<          j                   }| !                    ||           Kd S )Nr   r+  r,  John, Dinsdaler-  r   r   r   r"  r   r2  r   Dinsdaler4  #r#  r$  r%  r&  r0   rx   rA   r2   r   r   r   r   r'  r   r   r   r   r   r   r   r   r  r   r  r(  r  r7   r   r   rk   rg   rh   ri   rj   r5  r6  s	            r    testSendMessageWithSomeAddressesz5DebuggingServerTests.testSendMessageWithSomeAddresses*  s   JO$$%566!&	"$|D$)K$+$<> > >
###!
4		3355hK )	1;;====''Bg...$--//3R\BB6***( 	0 	0Dj!6!=!=d!C!C!#/ /GXw////	0 	0r   c                 R   t           j        j                            d          }d|d<   d|d<   t	          j        t          | j        dt          j	                  }| 
                    |j                   |                    |dd	
           t          j        d           |                                 | j                                         | j                                         | j                                         |                                 }|d= t.          |                                dt2          }|                     ||           t6          j                                        }t=          j        dt<          j                   }| !                    ||           dD ]J}t=          j        d"                    |          t<          j                   }| #                    ||           Kt=          j        dt<          j                   }	| !                    ||	           d S )Nr   r+  r,  r:  r-  r   r   zjoe@example.comzfoo@example.netr  r   r"  r   z^sender: joe@example.com$r;  r4  z^recips: .*'foo@example.net'.*$)$r#  r$  r%  r&  r0   rx   rA   r2   r   r   r   r   r'  r   r   r   r   r   r   r   r   r  r   r  r(  r  r7   r   r   rk   rg   rh   ri   rj   r5  assertNotRegex)
r   r  r   r   r  r  r  r%   r7  recips
             r   %testSendMessageWithSpecifiedAddressesz:DebuggingServerTests.testSendMessageWithSpecifiedAddressesG  s   JO$$%566!&	"$|D$)K$+$<> > >
###!'8CTUUU
4		3355hK )	1;;====''Bg...$--//7FF6***( 	3 	3Dj!6!=!=d!C!C!#/ /G'2222
=r|LL5)))))r   c                    t           j        j                            d          }d|d<   d|d<   d|d<   t	          j        t          | j        dt          j	        	          }| 
                    |j                   |                    |           t          j        d
           |                                 | j                                         | j                                         | j                                         |                                 }|d= t.          |                                dt2          }|                     ||           t6          j                                        }t=          j        dt<          j                   }| !                    ||           dD ]J}t=          j        d"                    |          t<          j                   }| !                    ||           Kd S )Nr   zBernard, Biancar,  z#the_rescuers@Rescue-Aid-Society.comSenderr:  r-  r   r   r   r"  r   z-^sender: the_rescuers@Rescue-Aid-Society.com$r;  r4  r=  r6  s	            r   testSendMessageWithMultipleFromz4DebuggingServerTests.testSendMessageWithMultipleFromf  s   JO$$%566%&	;("$|D$)K$+$<> > >
###!
4		3355hK )	1;;====''Bg...$--//KR\ZZ6***( 	0 	0Dj!6!=!=d!C!C!#/ /GXw////	0 	0r   c                 *   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	                  }| 
                    |j                   |                    |           t          j        d           |                                 | j                                         | j                                         | j                                         |d	= |d= |                                 }|d= t.          |                                dt2          }|                     ||           t6          j                                        }t=          j        dt<          j                   }| !                    ||           dD ]J}t=          j        d"                    |          t<          j                   }| !                    ||           Kd S )Nr   r+  r,  r   r-  r.  r/  r0  r1  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   r   r"  r   z^sender: holy@grail.net$)zmy_mom@great.cooker.comJeffrM  r4  r=  r6  s	            r   testSendMessageResentz*DebuggingServerTests.testSendMessageResent  s   JO$$%566!&	$$T%;-+-A+,,|D$)K$+$<> > >
###!
4		eHlO3355hK )	1;;====''Bg...$--//6EE6***K 	0 	0Dj!6!=!=d!C!C!#/ /GXw////	0 	0r   c                    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	                  }| 
                    |j                   |                     t                    5  |                    |           d d d            n# 1 swxY w Y   |                                 d S )Nr   r+  r,  r   r-  r.  r/  r0  r1  rG  rH  rI  rJ  rK  rL  rM  rN  zThu, 2 Jan 1970 17:42:00 +0000r   r   )r#  r$  r%  r&  r0   rx   rA   r2   r   r   r   r   r\   r]   r'  r   r  r   s      r   #testSendMessageMultipleResentRaisesz8DebuggingServerTests.testSendMessageMultipleResentRaises  sG   JO$$%566!&	$$T%;-+-A+,,;-)+C-|D$)K$+$<> > >
###z** 	! 	!a   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!

s   <CC"%C")rs   rt   ru   maxDiffr3   r5   r   r   rF   r   r   r   r   r   r   r   r   r	  r  r  r  r  r  r)  r8  r>  rB  rE  rP  rS  r   r   r   r   r      s       G  6= = = A A A
                 	 	 	  : : :&: : : : : :"1 1 1(3 3 32+ + +&/ / /,"0 "0 "0H0 0 0:* * *>0 0 0<#0 #0 #0J    r   r   c                        e Zd Zd Zd Zd ZdS )NonConnectingTestsc                     t          j                    }|                     t           j        |j                   |                     t           j        |j        d           d S )Nztest msg)r0   rx   r\   SMTPServerDisconnectedr   r   r   s     r   testNotConnectedz#NonConnectingTests.testNotConnected  sX    
 |~~'8$)DDD'8)Z	1 	1 	1 	1 	1r   c                     |                      t          t          j        dd           |                      t          t          j        d           d S )Nr   boguszlocalhost:bogus)r\   r   r0   rx   r   s    r   testNonnumericPortz%NonConnectingTests.testNonnumericPort  sP    '7<%w	0 	0 	0'7<+	- 	- 	- 	- 	-r   c                     t          j                    5 }|                     |j                   d d d            d S # 1 swxY w Y   d S r   )r0   rx   rP   rS   r   s     r   testSockAttributeExistsz*NonConnectingTests.testSockAttributeExists  s     \^^ 	)tdi(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   <A A N)rs   rt   ru   rY  r\  r^  r   r   r   rV  rV    sA        1 1 1- - -) ) ) ) )r   rV  c                        e Zd Zd Zd Zd ZdS )DefaultArgumentsTestsc                    t                      | _        d| j        d<   t          j                    | _        t          d          | j        _        t                      t                      c| j        _        | j        _        d S )N   Páolo <főo@bar.com>r,  )   OK)return_value)	r   r  r0   rx   r   r   r   has_extnr  r   s    r   r3   zDefaultArgumentsTests.setUp  s^    >>2LNN	;777	15.	DI...r   c                 b   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  r7   r  call_args_list)r   expected_mail_optionss     r   r)  z%DefaultArgumentsTests.testSendMessage  s     =	tx(((	tx(((+:1=a@C.	0 	0 	0+:1=a@C.	0 	0 	0 	0 	0r   c                     dg}d}| j                             | j        d d |           |                     |dg           |                     | j         j        j        d         d         d         |           d S )NSTARTTLS)ro  rh  ri  r   rj  rk  )r   mail_optionsrm  s      r   testSendMessageWithMailOptionsz4DefaultArgumentsTests.testSendMessageWithMailOptions  s    "| I	txt\BBB
|444+:1=a@C.	0 	0 	0 	0 	0r   N)rs   rt   ru   r3   r)  rq  r   r   r   r`  r`    sD        @ @ @0 0 00 0 0 0 0r   r`  c                        e Zd Zd Zd Zd ZdS )BadHELOServerTestsc                     t           t          _        t          j        d           t          j        | _        t          j                    | _	        | j	        t          _        d| _
        d S )Ns   199 no hello for you!r/   )r   r0   r1   r?   r   r   r   r   r   r   r2   r   s    r   r3   zBadHELOServerTests.setUp  sE    $7888*kmm[
			r   c                 J    t           t          _         | j        t          _        d S r   )r1   r0   r   r   r   r   s    r   r5   zBadHELOServerTests.tearDown  s    _


r   c                 v    |                      t          j        t          j        t          | j        dd           d S Nr   rj  )r\   r0   SMTPConnectErrorrx   rA   r2   r   s    r   testFailingHELOz"BadHELOServerTests.testFailingHELO  s8    '2GL $)[!	= 	= 	= 	= 	=r   N)rs   rt   ru   r3   r5   ry  r   r   r   rs  rs    sA          % % %= = = = =r   rs  c                   F    e Zd Zddej        z  dz  z   dz   Zd Zd Zd ZdS )	TooLongLineTestss   250 OK   .rq      
c                    t          j                    | _        t          j        | _        t          j                    | _        | j        t          _        t          j
                    | _        t          j        t          j        t          j                  | _        | j                            d           t#          j        | j                  | _        | j        | j        | j        f}t          j        t,          |          | _        | j                                         | j                                         | j                                         d S )N   r   )r	   r   r   r   r   r   r   r   r   r   r   r!   r1   AF_INETSOCK_STREAMrS   
settimeoutr   	bind_portr2   respdatar   r+   r   r   r   r   )r   servargss     r   r3   zTooLongLineTests.setUp
  s    *:<<*kmm[
?$$M&.&2DEE		R   !+DI66	HdmTY7&f8DDDr   c                     | j                                          | j        t          _        t          j        | j                   | `|                                  t          j	        | j
          d S r   )r!   r   r   r   r   r	   r   r   r   r   r   r   s    r   r5   zTooLongLineTests.tearDown  sX    _
$T[111K*DO<<<<r   c                 v    |                      t          j        t          j        t          | j        dd           d S rw  )r\   r0   SMTPResponseExceptionrx   rA   r2   r   s    r   testLineTooLongz TooLongLineTests.testLineTooLong"  s8    '7	;	; 	; 	; 	; 	;r   N)	rs   rt   ru   r0   _MAXLINEr  r3   r5   r  r   r   r   r{  r{    s]        D7#33a785@H   = = =; ; ; ; ;r   r{  zJohn AzSally BzRuth C)Mr.A@somewhere.comMs.B@xn--fo-fka.comMrs.C@somewhereesle.com)r  somepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=r  r  r  )zlist-1zlist-2c                       e Zd ZdS )ResponseExceptionN)rs   rt   ru   r   r   r   r  r  4  s          r   r  c                        e Zd ZdZdZdZdZdZdZdZ	dZ
dZ fdZ fdZd Zd Zd Zdd	Zdd
ZddZddZd Zd Zd Z fdZ fdZ fdZ fdZ fdZd Z xZS )SimSMTPChannelNr   c   c                     d                     d |D                       | _         t          t          |           j        |i | d S )N c                 8    g | ]}d                      |          S )z	250-{0}
)r5  ).0xs     r   
<listcomp>z+SimSMTPChannel.__init__.<locals>.<listcomp>C  s&    ???!m""1%%???r   )join_extrafeaturesr   r  __init__)r   extra_featuresr   kwr   s       r   r  zSimSMTPChannel.__init__A  sT     gg??~???A A,nd##,d9b99999r   c                    | j         | j        k    r| j                            | j                  }t          dt          |          t          j                   g | _        	 | 	                    |           nG# t          $ r:}| j        | _         |                     |j        d|j                   Y d }~nd }~ww xY wd S t                                                       d S )NzData:)file )
smtp_stateAUTH_emptystringr  received_linesprintreprr   r   auth_objectr  COMMANDpush	smtp_code
smtp_errorr   found_terminator)r   liner)   r   s      r   r  zSimSMTPChannel.found_terminatorG  s    ?di''$))$*=>>D'4::E,=>>>>"$DA  &&&&$ A A A"&,		Q[[[!,,?@@@@@@@@A F  """""s   "A8 8
B<0B77B<c                    | j         s|                     d           d S | j        r	d| j        vr|                     d           d S | j        |                     d           d S |                                }t          |          dvr|                     d           d S d|d                                                             d	d
          z  }	 t          | |          | _
        n9# t          $ r, |                     d                    |                     Y d S w xY w| 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   rq   z/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr   -_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rq   r   )seen_greetingr  extended_smtpr  authenticated_usersplitlenlowerreplacegetattrr  AttributeErrorr5  r  r  )r   argr   auth_object_names       r   	smtp_AUTHzSimSMTPChannel.smtp_AUTHU  s   ! 	II2333F! 	V43F%F%FII@AAAF".IIEG G GFyy{{t99F""IIGHHHF%Q(?(?S(I(II	&t-=>>D 	 	 	II 77=v>N7O7OQ Q QFF	 )CIINNa=====s   C( (2DDc                     |r|| _         |                     d           n|                     d           | j        | _        d S )Nz235 Authentication Succeededz&535 Authentication credentials invalid)r  r  r  r  )r   uservalids      r   _authenticatedzSimSMTPChannel._authenticatedn  sI     	@&*D#II45555II>???,r   c                 v    t          j        |                    d                                        d          S )Nr  utf-8)base64decodebytesencoder  )r   strings     r   _decode_base64zSimSMTPChannel._decode_base64v  s-    !&--"8"899@@IIIr   c                 d   ||                      d           d S |                     |          }	 |                    d          ^ }}}nA# t          $ r4}|                      d                    ||                     Y d }~d S d }~ww xY w|                     ||t          d         k               d S )Nz334  =535 Splitting response {!r} into user and password failed: {}r   )r  r  r  r]   r5  r  sim_auth)r   r  logpassr  r  passwordr)   s          r   _auth_plainzSimSMTPChannel._auth_plainy  s    ;IIf))#..G%,]]4%8%8"D((   		 ((.w(:(:< < < h(1+&=>>>>>s   A
 

B)BBc                 <   ||                      d           d S t          | d          s1|                     |          | _        |                      d           d S |                     |          }|                     | j        |t
          d         k               | `d S )Nz334 VXNlcm5hbWU6_auth_login_userz334 UGFzc3dvcmQ6r   )r  r   r  r  r  r  )r   r  r  s      r   _auth_loginzSimSMTPChannel._auth_login  s    ;II()))))122 	&$($7$7$<$<D!II()))))**3//H 5x8A;7NOOO%%%r   c                 0    |                      d           d S )Nz334 QnVHZ1liVWdHeQ==)r  r   r  s     r   _auth_buggyzSimSMTPChannel._auth_buggy  s     			()))))r   c                 \   |/|                      d                    t                               d S |                     |          }	 |                                \  }}nA# t
          $ r4}|                      d                    ||                     Y d }~dS d }~ww xY wt          j        t          d         	                    d          |                     t                    	                    d          d          
                                }|                     |||k               d S )Nz334 {}r  Fr   r  md5)r  r5  sim_cram_md5_challenger  r  r]   hmacHMACr  r  	hexdigestr  )r   r  r  r  hashed_passr)   valid_hashed_passs          r   _auth_cram_md5zSimSMTPChannel._auth_cram_md5  s+   ;IIhoo&<==>>>>>))#..G$+MMOO!kk   		 ''-vgq'9'9; ; ;uuuuu !%	""7++##$:;;BB7KK! ! !y{{  k5F&FGGGGGs   A   
B*)BBc                 j    d}|| j         z   dz   }|                     |           || _        d| _        d S )NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)r  r  r  r  )r   r  resps      r   	smtp_EHLOzSimSMTPChannel.smtp_EHLO  sB    $
 d))J6		$ !r   c                     |t           v r:|                     dt           |         dt          j        |                     d S |                     d|z             d S )N250 r  z550 No such user: %s)	sim_usersr  r0   	quoteaddrr  s     r   	smtp_VRFYzSimSMTPChannel.smtp_VRFY  s`    )IIIYs^^^W5Fs5K5K5KLMMMMMII,s233333r   c                    |                                 }|t          v rt          |         }t          |          D ]|\  }}t          j        |          }|t          |          dz
  k     r'|                     dt          |         d|           V|                     dt          |         d|           }d S |                     d           d S )Nr   z250-r  r  z550 No access for you!)r  	sim_lists	enumerater0   r  r  r  r  )r   r  	list_name	user_listr&   
user_emailquoted_addrs          r   	smtp_EXPNzSimSMTPChannel.smtp_EXPN  s    IIKK		!!!),I!*9!5!5 R R:%/
;;s9~~)))IIIYz-B-B-BKKPQQQQIIIYz-B-B-BKKPQQQQR R II./////r   c                     | j         *t          t          |                               |           d S |                     | j                    |                                  d S r   )quit_responser   r  	smtp_QUITr  close_when_doner   r  r   s     r   r  zSimSMTPChannel.smtp_QUIT  s]    %.$''11#66666IId()))  """""r   c                     | j         #t                                          |           d S |                     | j                    | j        r|                                  d S d S r   )mail_responser   	smtp_MAILr  
disconnectr  r  s     r   r  zSimSMTPChannel.smtp_MAIL  sk    %GGc"""""IId())) '$$&&&&&' 'r   c                     | j         #t                                          |           d S | xj        dz  c_        |                     | j         | j        dz
                      d S Nr   )rcpt_responser   	smtp_RCPT
rcpt_countr  r  s     r   r  zSimSMTPChannel.smtp_RCPT  s`    %GGc"""F1		$$T_Q%6788888r   c                 j    | xj         dz  c_         t                                          |           d S r  )
rset_countr   	smtp_RSETr  s     r   r  zSimSMTPChannel.smtp_RSET  s1    1#r   c                     | j         #t                                          |           d S |                     | j                    d S r   )data_responser   	smtp_DATAr  r  s     r   r  zSimSMTPChannel.smtp_DATA  sE    %GGc"""""IId()))))r   c                       r   r   r   s    r   handle_errorzSimSMTPChannel.handle_error      r   r   )rs   rt   ru   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  r  r   r   s   @r   r  r  5  s       MMMMJJJD: : : : :# # # # #> > >2' ' 'J J J? ? ? ?& & & &* * * *
H H H H$	" 	" 	"4 4 40 0 0# # # # #' ' ' ' '9 9 9 9 9    * * * * *      r   r  c                   0    e Zd ZeZd Zd Zd Zd Zd Z	dS )SimSMTPServerc                 V    g | _         i | _        t          j        j        | g|R i | d S r   )_extra_features
_addressesr   
SMTPServerr  r   r   r  s      r   r  zSimSMTPServer.__init__  s;    !!$444444444r   c                 X    |                      | j        | ||| j                  | _        d S )Nr   )channel_classr	  _decode_data_SMTPchannelr   r$   r%   s      r   handle_acceptedzSimSMTPServer.handle_accepted  s7     .. $d) / + +r   c                 .    || j         d<   || j         d<   d S )Nfromtos)r
  )r   peermailfromrcpttosdatas        r   process_messagezSimSMTPServer.process_message  s     "*!(r   c                 :    | j                             |           d S r   )r	  append)r   features     r   add_featurezSimSMTPServer.add_feature  s    ##G,,,,,r   c                       r   r   r   s    r   r  zSimSMTPServer.handle_error  r  r   N)
rs   rt   ru   r  r  r  r  r  r  r  r   r   r   r  r    sd        "M5 5 5
+ + +
) ) )- - -    r   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z ej        dd          d             Z ej        dd          d             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )SMTPSimTestsc                 p   t          j                    | _        t          j        | _        t          j        t          _        t          j                    | _	        t          j                    | _
        t          t          dfdd          | _        | j        j                                        d         | _        | j        | j	        | j
        f}t          j        t"          |          | _        | j                                         | j	                                         | j	                                         d S Nr   r   Tr   r   r   )r	   r   r   r1   r   r   r   r   r   r   r   r  rA   r#   r   r2   r   r   r   r   r   r   r   s     r   r3   zSMTPSimTests.setUp
  s    *:<<"N$,!))#/++!4)_$OOO	I$002215	Yt?	&.>YOOO 	r   c                    | j         t          _        | j                                         | j                                         t          j        | j	                   | `	| 
                                 t          j        | j          d S r   r   r1   r   r   r   r   r   r	   r   r   r   r   r   r   s    r   r5   zSMTPSimTests.tearDown  r    *$T[111K*DO<<<<r   c                     t          j        t          | j        dt          j                  }|                                 d S r   r   r   s     r   r   zSMTPSimTests.testBasic'  r   r   c                    t          j        t          | j        dt          j                  }|                     |j        i            dddddd}|                                 |                     |j        |           |D ]*}| 	                    |
                    |                     +|                     |
                    d                     |                                 d S )Nr   r   r  20000000)expnsizestarttls	deliverbyr   zunsupported-feature)r0   rx   rA   r2   r   r   r7   esmtp_featuresr   
assertTruerf  assertFalser   )r   r   expected_featuresks       r   testEHLOzSMTPSimTests.testEHLO-  s    |D$)K$+$<> > > 	,b111 %'%/)+*,%'	  			,.?@@@" 	. 	.AOODMM!,,----'<==>>>		r   c           	         t          j        t          | j        dt          j                  }t                                          D ]W\  }}dt          |dt          j	        |          d          f}| 
                    |                    |          |           Xd}dd|z                      d          f}| 
                    |                    |          |           |                                 d S )	Nr   r   r   r  r  r   &  zNo such user: %s)r0   rx   rA   r2   r   r   r  itemsbytesr  r7   r   r  r   )r   r   	addr_specnameexpected_knownuexpected_unknowns          r   r   zSMTPSimTests.testVRFYC  s    |D$)K$+$<> > >  )00 	C 	COIt!5*.$$0A)0L0L0L*N)0$2 $2 3N TYYy11>BBBB "4q"8!@!@!I!IJ1'7888		r   c           	      6   t          j        t          | j        dt          j                  }t                                          D ]\  }}g }|D ]9}|                    t          |         dt          j
        |                     :dt          d                    |          d          f}|                     |                    |          |           d}d}|                     |                    |          |           |                                 d S )	Nr   r   r  r   r   r  zPSU-Members-List)r5  s   No access for you!)r0   rx   rA   r2   r   r   r  r6  r  r  r  r7  r  r7   r*  r   )	r   r   listnamemembersusersr  r:  r;  r<  s	            r   testEXPNzSMTPSimTests.testEXPNR  s   |D$)K$+$<> > > "+!2!2 	B 	BHgE M M	!g6G6J6J6JKLLLL!55)9)97#C#CDNTYYx00.AAAA71'7888		r   c                 >   | j                             d           t          j        t          | j        dt          j                  }|                    t          d         t          d                   }| 
                    |d           |                                 d S )N
AUTH PLAINr   r   r   r      s   Authentication Succeededr#   r  r0   rx   rA   r2   r   r   loginr  r7   r   r   r   r  s      r   testAUTH_PLAINzSMTPSimTests.testAUTH_PLAINb      	l+++|D$)K$+$<> > >zz(1+x{33ABBB

r   c                 >   | j                             d           t          j        t          | j        dt          j                  }|                    t          d         t          d                   }| 
                    |d           |                                 d S )N
AUTH LOGINr   r   r   r   rD  rF  rH  s      r   testAUTH_LOGINzSMTPSimTests.testAUTH_LOGINj  rJ  r   c                 |   | j                             d           t          j        t          | j        dt          j                  5 }t          \  |_	        |_
        |                    d           |                    d|j        d          }|                     |d           d d d            d S # 1 swxY w Y   d S )	NrL  r   r   test_auth_loginLOGINTinitial_response_okrD  r#   r  r0   rx   rA   r2   r   r   r  r  r  r   auth
auth_loginr7   rH  s      r   "testAUTH_LOGIN_initial_response_okz/SMTPSimTests.testAUTH_LOGIN_initial_response_okr  s   	l+++\$	+")":< < < 	G?C'/$DIt}II'(((99Wdo49PPDT#EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G   AB11B58B5c                 |   | j                             d           t          j        t          | j        dt          j                  5 }t          \  |_	        |_
        |                    d           |                    d|j        d          }|                     |d           d d d            d S # 1 swxY w Y   d S )	NrL  r   r   rO  rP  FrQ  rD  rS  rH  s      r   %testAUTH_LOGIN_initial_response_notokz2SMTPSimTests.testAUTH_LOGIN_initial_response_notok{  s   	l+++\$	+")":< < < 	G?C'/$DIt}II'(((99Wdo59QQDT#EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	GrW  c                      j                             d           d
 fd	}t          j        t           j        dt          j                  }	 t          \  |_	        |_
        |                    d           d}                     t          j        |          5 }|                    d|d	           d d d            n# 1 swxY w Y   |                                 d S # |                                 w xY w)Nz
AUTH BUGGYc                 4                         d|            dS )Ns
   BuGgYbUgGyr  )r7   )	challenger   s    r   
auth_buggyz/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggy  s    ]I6664r   r   r   test_auth_buggyz&^Server AUTH mechanism infinite loop.*BUGGYFrQ  r   )r#   r  r0   rx   rA   r2   r   r   r  r  r  r   assertRaisesRegexSMTPExceptionrT  r   )r   r]  r   expectcms   `    r   testAUTH_BUGGYzSMTPSimTests.testAUTH_BUGGY  sA   	l+++	 	 	 	 	 	 |$)K,
 
 
	'/$DIt}II'(((>F''(=vFF J"		':5	IIIJ J J J J J J J J J J J J J J JJLLLLLDJJLLLLs1   AC  B?3C  ?CC  CC   C6r  T)opensslc                 >   | j                             d           t          j        t          | j        dt          j                  }|                    t          d         t          d                   }| 
                    |d           |                                 d S )NzAUTH CRAM-MD5r   r   r   r   rD  rF  rH  s      r   testAUTH_CRAM_MD5zSMTPSimTests.testAUTH_CRAM_MD5  s    	o...|D$)K$+$<> > >zz(1+x{33ABBB

r   c                 >   | j                             d           t          j        t          | j        dt          j                  }|                    t          d         t          d                   }| 
                    |d           |                                 d S )NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r   r   r   r   rD  rF  rH  s      r   testAUTH_multiplezSMTPSimTests.testAUTH_multiple  s     		?@@@|D$)K$+$<> > >zz(1+x{33ABBB

r   c           	         ddh}	 t          j                     |                    d           n# t          $ r Y nw xY w|D ]/}| j                            d                    |                     0|D ]}|                     |          5  t          j	        t          | j        dt          j                  }|                    d           t          d	         t          d
         c|_        |_        d|                                                    dd          z   }|                    |t+          ||                    }|                     |d           |                                 d d d            n# 1 swxY w Y   d S )NPLAINrP  zCRAM-MD5zAUTH {})	mechanismr   r   foor   r   auth_r  r  rD  )hashlibr  addr]   r#   r  r5  subTestr0   rx   rA   r2   r   r   r   r  r  r  r  r  rT  r  r7   r   )r   	supportedrl  r   methodr  s         r   test_auth_functionzSMTPSimTests.test_auth_function  s   g&		&KMMM MM*%%%%  	 	 	D	 # 	? 	?II!!)"2"29"="=>>>>" 
	 
	I	22 	 	|D$)3>,3,DF F F 		%   +3A;(	4= 9??#4#4#<#<S##F#FFyyGD&,A,ABB  'IJJJ

	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
	 
	s   / 
<<C E88E<	?E<	c                 H   t          j        t          | j        dt          j                  }|                                \  }}|                     |d           |                     d|j	                   |
                                 |                     d|j	                   |                    t          | j                   |                     d|j	                   |                                 |                     d|j	                   |
                                 d S )Nr   r   r   r+  )r0   rx   rA   r2   r   r   r   r7   r   r.  r   r  rf   ehlo_or_helo_if_neededr   r   codemessages       r   test_quit_resets_greetingz&SMTPSimTests.test_quit_resets_greeting  s    |D$)+6$+$<> > > 		gs###fd1222		!4555T49%%%!4555##%%%fd1222		r   c                    t          j        t          | j                  5 }|                                \  }}|                     |d           d d d            n# 1 swxY w Y   |                     t           j        |j        d           t          j        t          | j                  5 }|	                                 d d d            n# 1 swxY w Y   |                     t           j        |j        d           d S )Nr   s   foo)
r0   rx   rA   r2   r   r7   r\   rX  r   r   rw  s       r   test_with_statementz SMTPSimTests.test_with_statement  sD   \$	** 	(d IIKKMD'T3'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	'8$)VLLL\$	** 	dJJLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	'8$)VLLLLLs#   .AA!A*CCCc                    |                      t          j                  5 }t          j        t          | j                  5 }|                                 d| j        j        _	        d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | 
                    |j        j        d           | 
                    |j        j        d           d S )Nz421 QUIT FAILED  s   QUIT FAILED)r\   r0   r  rx   rA   r2   r   r#   r  r  r7   r   r  r  )r   errorr   s      r    test_with_statement_QUIT_failurez-SMTPSimTests.test_with_statement_QUIT_failure  sI   w<== 	IdDI.. I$		7H	&4I I I I I I I I I I I I I I I	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	2C8883^DDDDDs5    B	 &A2&B	2A6	6B	9A6	:B		BBc                    t          j        t          | j        dt          j                  }|                                 d| j        j        _	        d| j        j        _
        |                     t           j                  5  |                    ddd           d d d            n# 1 swxY w Y   |                     |j                   d S )Nr   r   z451 Requested action abortedTr   r   test message)r0   rx   rA   r2   r   r   r   r#   r  r  r  r\   SMTPSenderRefusedr  rP   rS   r   s     r   test__rest_from_mail_cmdz%SMTPSimTests.test__rest_from_mail_cmd  s    |D$)K$+$<> > >		/M	,,0	)w899 	; 	;MM&'>:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;$)$$$$$s   B&&B*-B*c                    t          j        t          | j        dt          j                  }|                                 d| j        j        _	        | 
                    t           j                  5  |                    ddd           d d d            n# 1 swxY w Y   |                     |j                   |                     | j        j        j        d           d S )Nr   r   z421 closing connectionr   r   r  r   )r0   rx   rA   r2   r   r   r   r#   r  r  r\   r  r  rP   rS   r7   r  r   s     r   test_421_from_mail_cmdz#SMTPSimTests.test_421_from_mail_cmd  s    |D$)K$+$<> > >		/G	,w899 	; 	;MM&'>:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;$)$$$/:A>>>>>s   1BBBc                    t          j        t          | j        dt          j                  }|                                 ddg| j        j        _	        | 
                    t           j                  5 }|                    dg dd           d d d            n# 1 swxY w Y   |                     |j                   |                     | j        j        j        d           |                     |j        j        d         d	d
i           d S )Nr   r   z250 accepted421 closingr   )r   FrankGeorger  r   r  )r~  s   closing)r0   rx   rA   r2   r   r   r   r#   r  r  r\   SMTPRecipientsRefusedr  rP   rS   r7   r  assertDictEqualr   r   )r   r   r'   s      r   test_421_from_rcpt_cmdz#SMTPSimTests.test_421_from_rcpt_cmd  s;   |D$)K$+$<> > >		0>/N	,w<== 	PMM&">">">OOO	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P$)$$$/:A>>>Q[-a07<M2NOOOOOs   3BB Bc                     G d dt                     }|| j        _        t          j        t
          | j        dt          j                  }|	                                 | 
                    t          j                  5  |                    ddgd           d d d            n# 1 swxY w Y   |                     |j                   |                     | j        j        j        d           d S )	Nc                        e Zd Z fdZ xZS )=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelc                     | j         | j        k    r|                     d           d S t                                                       d S )Nr  )r  DATAr  r   r  )r   r   s    r   r  zNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator  sF    ?di//IIm,,,,,GG,,.....r   )rs   rt   ru   r  r   r   s   @r   MySimSMTPChannelr    s8        / / / / / / / / /r   r  r   r   zJohn@foo.orgzSally@foo.orgr  r   )r  r#   r  r0   rx   rA   r2   r   r   r   r\   SMTPDataErrorr  rP   rS   r7   r  r  )r   r  r   s      r   test_421_from_data_cmdz#SMTPSimTests.test_421_from_data_cmd  s9   	/ 	/ 	/ 	/ 	/~ 	/ 	/ 	/ #3	|D$)K$+$<> > >		w455 	M 	MMM.?*;^LLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M$)$$$/:A>>>>>s   ?B$$B(+B(c           	         t          j        t          | j        dt          j                  }|                     |j                   |                                 | 	                    |j
                   |                     |                    d                     |                     t           j        |j        dddddg	           |                     t           j        |j        dddg
           d S )Nr   r   smtputf8r   r   r  ri  rh  rp  options)r0   rx   rA   r2   r   r   r   r   r   r/  
does_esmtpr0  rf  r\   SMTPNotSupportedErrorr  r  r   s     r   4test_smtputf8_NotSupportedError_if_no_server_supportzASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_support  s    |$)K,. . . 	
###		(((z22333)MGR
.K 	 	M 	M 	M 	)Iv'D 	 	F 	F 	F 	F 	Fr   c                    t          j        t          | j        dt          j                  }|                     |j                   |                     t          |j
        ddd           |                     t          |j        d           d S )Nr   r   Aliceu   Böbr  u   Älice)r0   rx   rA   r2   r   r   r   r   r\   UnicodeEncodeErrorr  r  r   s     r   "test_send_unicode_without_SMTPUTF8z/SMTPSimTests.test_send_unicode_without_SMTPUTF8%  s}    |$)K,. . . 	
###,dmWfbQQQ,diBBBBBr   c                 f   t                      }d|d<   d|d<   d|d<   t          j        t          | j        dt
          j                  }|                     |j                   | 	                    t          j
                  5  |                    |           d d d            d S # 1 swxY w Y   d S )	Nrb  r,  r<  r-     Nudge nudge, wink, wink ὠ9Subjectr   r   )r   r0   rx   rA   r2   r   r   r   r   r\   r  r'  )r   r  r   s      r   9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8-  s     nn-FD	:I|$)K,. . . 	
###w<== 	# 	#c"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   B&&B*-B*c                 "   t          j        t          | j        dt          j                  }|                     |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  )r0   rx   rA   r2   r   r   r   r   r   r#  utils
formataddrr  r'  r7   r#   r
  )r   r   ry  s      r   1test_name_field_not_included_in_envelop_addressesz>SMTPSimTests.test_name_field_not_included_in_envelop_addresses;  s    |$)K,. . . 	
###..+001TUU../LMMT..w77<<<-f57LMMM-e47I6JKKKKKr   N)rs   rt   ru   r3   r5   r   r3  r   rA  rI  rM  rV  rY  rd  r   requires_hashdigestrg  ri  rt  rz  r|  r  r  r  r  r  r  r  r  r  r   r   r   r!  r!    s         $	= 	= 	=    ,         G G GG G G  ( (^'t<<<  =< (^'t<<<  =<  ,  M M ME E E% % %? ? ?	P 	P 	P? ? ? F F F C C C# # #L L L L Lr   r!  c                   &    e Zd Zd Zd Z	 	 ddZdS )SimSMTPUTF8Serverc                 L    ddg| _         t          j        j        | g|R i | d S )Nrh  8BITMIME)r	  r   r  r  r  s      r   r  zSimSMTPUTF8Server.__init__M  s;     !+J7!$444444444r   c                 d    |                      | j        | ||| j        | j                  | _        d S )Nr   enable_SMTPUTF8)r  r	  r  r  r  r  s      r   r  z!SimSMTPUTF8Server.handle_acceptedT  s=     .. $d) 0 / 
 
r   Nc                 Z    || _         || _        || _        || _        || _        || _        d S r   )	last_peerlast_mailfromlast_rcpttoslast_messagelast_mail_optionslast_rcpt_options)r   r  r  r  r  rp  rcpt_optionss          r   r  z!SimSMTPUTF8Server.process_message[  s7    %# !-!-r   )NN)rs   rt   ru   r  r  r  r   r   r   r  r  K  sP        5 5 5
 
 
 KOJN. . . . . .r   r  c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )SMTPUTF8SimTestsNc                 r   t          j                    | _        t          j        | _        t          j        t          _        t          j                    | _	        t          j                    | _
        t          t          dfddd          | _        | j        j                                        d         | _        | j        | j	        | j
        f}t          j        t"          |          | _        | j                                         | j	                                         | j	                                         d S )Nr   r   FTr  r   r   )r	   r   r   r1   r   r   r   r   r   r   r   r  rA   r#   r   r2   r   r   r   r   r   r   r   s     r   r3   zSMTPUTF8SimTests.setUpi  s    *:<<"N$,!))#/++%tQi276:< < <	 I$002215	Yt?	&.>YOOO 	r   c                    | j         t          _        | j                                         | j                                         t          j        | j	                   | `	| 
                                 t          j        | j          d S r   r%  r   s    r   r5   zSMTPUTF8SimTests.tearDown}  r&  r   c                 >   t          j        t          | j        dt          j                  }|                     |j                   |                                 | 	                    |j
                   | 	                    |                    d                     d S )Nr   r   r  )r0   rx   rA   r2   r   r   r   r   r   r/  r  rf  r   s     r   $test_test_server_supports_extensionsz5SMTPUTF8SimTests.test_test_server_supports_extensions  s    |$)K,. . . 	
###		(((j1122222r   c                 t   d                     d          }t          j        t          | j        dt
          j                  }|                     |j                   |	                    dd|ddg	           | 
                    | 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!r  r   r   u   Jőhnu   Sállyri  rh  r  )r  r0   rx   rA   r2   r   r   r   r   r  r7   r#   r  r  r  r   r  r  rR  s      r   ,test_send_unicode_with_SMTPUTF8_via_sendmailz=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmail  s"   299'BB|$)K,. . . 	
###gx$3Z#@ 	 	B 	B 	B0':::/(<<</333oty'BCCCj$)"=>>>4b99999r   c                 d   d                     d          }t          j        t          | j        dt
          j                  }|                     |j                   |	                                 | 
                    |                    dddg          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  r  r   r   u   Jőri  rh  r  r   u   János)r  r0   rx   rA   r2   r   r   r   r   r   r7   r  rcptr  r#   r  r  r  r   r  r  rR  s      r   1test_send_unicode_with_SMTPUTF8_via_low_level_APIzBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_API  sz   299'BB|$)K,. . . 	
###		IIeoz%BICC	 	 	 	8,,l;;;1|4440%888/(<<</333oty'BCCCj$)"=>>>4b99999r   c                    t                      }d|d<   d|d<   d|d<   |                    d           t          j        d          }t	          j        t          | j        d	t          j	        
          }| 
                    |j                   |                     |                    |          i            |                     | j        j        d           |                     | j        j        dg           |                     | j        j                                        |           |                     d| j        j                   |                     d| j        j                   |                     | j        j        g            d S )Nrb  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.comri  rh  )r   set_contenttextwrapdedentr0   rx   rA   r2   r   r   r   r   r7   r'  r#   r  r  r  r  r   r  r  )r   r  r:   r   s       r   2test_send_message_uses_smtputf8_if_addrs_non_asciizCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii  sf   nn-FD	:I 	MNNN ? 	$ 	 	 |$)K,. . . 	
###**3//4440.AAA/*>>>/6688(CCCoty'BCCCj$)"=>>>4b99999r   )
rs   rt   ru   rT  r3   r5   r  r  r  r  r   r   r   r  r  e  ss        G  (	= 	= 	=3 3 3: : :: : :&: : : : :r   r  s    psu doesnotexistr  )eolc                       e Zd Zd ZdS )!SimSMTPAUTHInitialResponseChannelc                 
   |                                 }|d                                         dk    r;t          |          dk    r(|d         t          k    r|                     d           d S |                     d           d S )Nr   plainrq   r   z235 Okz571 Bad authentication)r  r  r  EXPECTED_RESPONSEr  )r   r  r   s      r   r  z+SimSMTPAUTHInitialResponseChannel.smtp_AUTH  sy     yy{{7==??g%%4yyA~~ 7///IIh'''F		*+++++r   N)rs   rt   ru   r  r   r   r   r  r    s#        , , , , ,r   r  c                       e Zd ZeZdS ) SimSMTPAUTHInitialResponseServerN)rs   rt   ru   r  r  r   r   r   r  r    s        5MMMr   r  c                   &    e Zd Zd Zd Zd Zd ZdS )SMTPAUTHInitialResponseSimTestsc                 p   t          j                    | _        t          j        | _        t          j        t          _        t          j                    | _	        t          j                    | _
        t          t          dfdd          | _        | j        j                                        d         | _        | j        | j	        | j
        f}t          j        t"          |          | _        | j                                         | j	                                         | j	                                         d S r#  )r	   r   r   r1   r   r   r   r   r   r   r   r  rA   r#   r   r2   r   r   r   r   r   r   r   s     r   r3   z%SMTPAUTHInitialResponseSimTests.setUp  s    *:<<"N$,!))#/++41ID: : :	 I$002215	Yt?	&.>YOOO 	r   c                    | j         t          _        | j                                         | j                                         t          j        | j	                   | `	| 
                                 t          j        | j          d S r   r%  r   s    r   r5   z(SMTPAUTHInitialResponseSimTests.tearDown  r&  r   c                     | j                             d           t          j        t          | j        dt          j                  }|                    dd           |	                                 d S )NrC  r   r   psudoesnotexist)
r#   r  r0   rx   rA   r2   r   r   rG  r   r   s     r   %testAUTH_PLAIN_initial_response_loginzESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_login  sa    	l+++|D$)K$+$<> > >

5.)))

r   c                 >   | j                             d           t          j        t          | j        dt          j                  }d|_        d|_	        |
                    d|j                  \  }}|                                 |                     |d           d S )NrC  r   r   r  r  r  rE  )r#   r  r0   rx   rA   r2   r   r   r  r  rT  
auth_plainr   r7   )r   r   rx  responses       r   $testAUTH_PLAIN_initial_response_authzDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_auth  s    	l+++|D$)K$+$<> > >	&7DO<<h

s#####r   N)rs   rt   ru   r3   r5   r  r  r   r   r   r  r    sP          &	= 	= 	=  $ $ $ $ $r   r  __main__)Gr  email.mime.textr#  email.messager   email.base64mimer   encode_base64email.utilsro  r  r1   r0   r   rg   r   r   r   r   r  r   r   testr   r   test.supportr   r   r	   r
   unittest.mockr   import_deprecatedr   r   requires_working_socketrA   platformr   SMTPChannelr+   r-   TestCaserw   rz   r   r  r  r   rV  r`  rs  r{  r  r  r  r  	Exceptionr  r  r  r  r!  r  r  r  r  r  r  rs   mainr   r   r   <module>r     sc        & & & & & & 9 9 9 9 9 9         				 				 



          % % % % % % % % ' ' ' ' ' ' & & & & & & ) ) ) ) ) ) ( ( ( ( ( (       -?,Z88))'22   t , , , ,<8  $/E!  ,`6 `6 `6 `6 `6 `6 `6 `6F    |X%6   
/ / / / /|X%6 / / /,  > 6	
3S S S S S8, S S Sj) ) ) ) )* ) ) )60 0 0 0 0H- 0 0 08= = = = =* = = =&; ; ; ; ;x( ; ; ;@ #+#,'/ 	
 2; +,EF,. 	
 ) ( ( ( (	 ( ( (u u u u uU& u u up    E$   6@L @L @L @L @L8$ @L @L @LF
. . . . . . . .4l: l: l: l: l:x( l: l: l:^ "M"8bAAA , , , , , , , ,6 6 6 6 6} 6 6 6.$ .$ .$ .$ .$h&7 .$ .$ .$b zHMOOOOO r   