
    daf                     Z   d dl Z d dlZd dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZ 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jB                  d       ejD                  Z"ejF                  dk(  rd Z$e$ejJ                  _$        d Z& G d d      Z' G d de'ejP                        Z) G d de'ejP                        Z*d Z+dZ,dZ- G d dejP                        Z. G d dejP                        Z/ G d dejP                        Z0 G d d ejP                        Z1 G d! d"ejP                        Z2d#d$d%d&Z3d'Z4d(Z5d)d*gd+gd,Z6 G d- d.e7      Z8 G d/ d0ejJ                        Z9 G d1 d2ejt                        Z; G d3 d4ejP                        Z< G d5 d6e;      Z= G d7 d8ejP                        Z> ed9d:;      Z? G d< d=e9      Z@ G d> d?e;      ZA G d@ dAejP                        ZBeCdBk(  r ej                          yy)C    N)EmailMessage)body_encode)supportmock_socket)hashlib_helper)socket_helper)threading_helper)asyncore)smtpd)MockT)moduledarwinc                      y N selfs    ,/root/Python-3.12.4/Lib/test/test_smtplib.pyhandle_exptr   $   s        c                    |j                          | j                          	 |j                         \  }}d}|rF|dkD  rAt        j                  g |gg       \  }}}|r|j	                  |      }	||	d  }|dz  }|r|dkD  rA|j                          |j                          | j                          y # t        $ r Y ,w xY w# |j                          | j                          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    KKMGGI[[]
d a!emmB3GAq!yy~$%jFA a!e 	



	   	

	s/   B0 A	B? ?B? 0	B<9B? ;B<<B? ?"C!c                   Z    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y)GeneralTestsc                 0    t         t        _        d| _        y )N   )r   smtplibsocketportr   s    r   setUpzGeneralTests.setUpA   s    $	r   c                 "    t         t        _         y r   )r0   r/   r   s    r   tearDownzGeneralTests.tearDownE   s	    r   c                 V    d}d}| j                  |t        j                  |             y )Nzabc
.jklfoo
..bluezabc
..jkl
foo
...blue)assertEqualr/   	quotedata)r   teststrexpecteds      r   testQuoteDatazGeneralTests.testQuoteDataJ   s'    -37#4#4W#=>r   c                     t        j                  d       | j                  t        | j                        }|j                          y )N   220 Hola mundor   
reply_withclientHOSTr1   r   r   r?   s     r   
testBasic1zGeneralTests.testBasic1O   s.    01T499-r   c                     t        j                  d       | j                  t        | j                  d      }| j                  |j                  d       |j                          y )Nr<   )z	127.0.0.1iM  )source_address)r   r>   r?   r@   r1   r6   rD   r   rA   s     r   testSourceAddresszGeneralTests.testSourceAddressU   sP    01T499,?  A..0DEr   c                     t        j                  d       | j                  t        d| j                        }|j                          y )Nr<   :r=   rA   s     r   
testBasic2zGeneralTests.testBasic2]   s1    01dii89r   c                     t        j                  d       | j                  t        | j                  d      }| j                  |j                  d       |j                          y )Nr<   testhost)local_hostname)r   r>   r?   r@   r1   r6   rK   r   rA   s     r   testLocalHostNamezGeneralTests.testLocalHostNamec   sH    01T499ZH..
;r   c                    t        j                  d       | j                  t        j                                t        j                  d       | j                  t        j                         d       	 | j                  t        | j                        }t        j                  d        | j                  |j                  j                         d       |j                          y # t        j                  d        w xY w)Nr<      )r   r>   assertIsNonegetdefaulttimeoutsetdefaulttimeoutr6   r?   r@   r1   sock
gettimeoutr   rA   s     r   testTimeoutDefaultzGeneralTests.testTimeoutDefaultj   s    01+779:%%b)668"=	0[[tyy1F))$///126 ))$/s   3 C# #C:c                    t        j                  d       | j                  t        j                                t        j
                  d       	 | j                  t        | j                  d       }t        j
                  d        | j                  |j                  j                                |j                          y # t        j
                  d        w xY wNr<   rN   timeout)r   r>   rO   r0   rP   rQ   r?   r@   r1   rR   rS   r   rA   s     r   testTimeoutNonezGeneralTests.testTimeoutNonev   s    01&2245  $	+[[tyy$[?F$$T*&++0023 $$T*s   "C   Cc                     t        j                  d       | j                  t              5  | j	                  t
        | j                  d       d d d        y # 1 sw Y   y xY w)Nr<   r   rW   )r   r>   assertRaises
ValueErrorr?   r@   r1   r   s    r   testTimeoutZerozGeneralTests.testTimeoutZero   sJ    01z* 	4KKdiiK3	4 	4 	4s   #AA c                     t        j                  d       | j                  t        | j                  d      }| j                  |j                  j                         d       |j                          y rV   )	r   r>   r?   r@   r1   r6   rR   rS   r   rA   s     r   testTimeoutValuezGeneralTests.testTimeoutValue   sO    01T499b9//126r   c                    t        j                  d       | j                         }|j                  d       t	        j
                         5 }|j                  t        | j                         d d d        |j                          t        j                  dt        j                        }| j                  j                         |       y # 1 sw Y   ^xY w)N   220 Hello worldr   z	^connect:r   r>   r?   set_debuglevelr   captured_stderrconnectr@   r1   r   recompile	MULTILINEassertRegexgetvaluer   r?   stderrr9   s       r   test_debuglevelzGeneralTests.test_debuglevel   s    12a $$& 	,&NN4+	,::lBLL9*H5		, 	,   !C		Cc                    t        j                  d       | j                         }|j                  d       t	        j
                         5 }|j                  t        | j                         d d d        |j                          t        j                  dt        j                        }| j                  j                         |       y # 1 sw Y   ^xY w)Nra      z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rb   rk   s       r   test_debuglevel_2zGeneralTests.test_debuglevel_2   s    12a $$& 	,&NN4+	,::D ll,*H5	, 	,rn   N)__name__
__module____qualname__r2   r4   r:   rB   rE   rH   rL   rT   rY   r]   r_   rm   rq   r   r   r   r,   r,   ?   sC     
?

	4
6	6r   r,   c                   $    e Zd Zej                  Zy)SMTPGeneralTestsN)rr   rs   rt   r/   SMTPr?   r   r   r   rv   rv      s    \\Fr   rv   c                   v     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                 <   d}t        j                  d       	 | j                  || j                        }t        j                  d        | j                  |j                  j                                |j                          y # t        j                  d        w xY w)N!/some/local/lmtp/delivery/programra   )	r   r>   r?   r1   rQ   rO   rR   rS   r   )r   
local_hostr?   s      r   "testUnixDomainSocketTimeoutDefaultz3LMTPGeneralTests.testUnixDomainSocketTimeoutDefault   ss    8
12	0[[TYY7F))$/&++0023 ))$/s   B Bc                     t         |           d}| j                  t              5  | j	                  |d       d d d        y # 1 sw Y   y xY w)Nr|   r   rW   )superr]   r[   r\   r?   )r   r}   	__class__s     r   r]   z LMTPGeneralTests.testTimeoutZero   sF    !8
z* 	/KK
AK.	/ 	/ 	/s   AA)rr   rs   rt   r/   LMTPr?   unittest
skipUnlesshasattrr0   r~   r]   __classcell__r   s   @r   ry   ry      s@    \\FX35WX Y/ /r   ry   c                    |j                          	 t        t        d      rt        j                  }nt        j
                  }d}t        j                  rX|dkD  rS |dt        j                         |j                         r| j                          n|dz  }t        j                  r|dkD  rS|j                         s%t        j                  d       | j                          t        j                          |j                          y # t        $ r Y ew xY w# |j                         s%t        j                  d       | j                          t        j                          |j                          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      s   LLN66"~~H}}H!!a!eT8../   "

FA !!a!e   "JJsOJJL     "JJsOJJLs%   BD 	DD DD AE1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y)DebuggingServerTestsNc                    t        j                         | _        t        j                  | _        t        j                  t        _        t        j                  | _	        t        j                         | _        | j                  t        _        t        j                         | _        t        j                         | _        t"        j$                  | _        t        j                         t"        _        t#        j(                  t*        dfdd      | _        | j,                  j                  j/                         d d \  | _        | _        | j,                  | j                  | j                   f}t        j4                  t6        |      | _        | j8                  j;                          | j                  j=                          | j                  j?                          y )Nr   nowhereTdecode_datarp   targetargs) r	   threading_setup
thread_keyr0   getfqdnreal_getfqdnr   sysstdout
old_stdoutioStringIOoutput	threadingEventr   r   r   DEBUGSTREAMold_DEBUGSTREAMDebuggingServerr@   r"   getsocknamehostr1   Threadr   threadstartwaitclearr   	serv_argss     r   r2   zDebuggingServerTests.setUp   s,   *::<"NN$,,**kkm[[
!)#//+$00KKM))4)_6:<	  $yy//;;=bqA	49YYt?	&&.>YO 	r   c                    | j                   t        _        | j                  j	                          | j
                  j                          t        j                  | j                         | j                  t        _        t        j                  j                          | j                   t        _        | `	| j#                          t        j$                  | j&                    y r   )r   r0   r   r   r   r   r   r	   join_threadr   r   r   r   r   r   r   r   
doCleanupsthreading_cleanupr   r   s    r   r4   zDebuggingServerTests.tearDown  s    **$$T[[1__
! 00K**DOO<r   c                     | j                   j                         }t        j                  dd|t        j                  t        j
                  z        S )Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)flags)r   rj   rf   subrh   DOTALL)r   test_outputs     r   get_output_without_xpeerz-DebuggingServerTests.get_output_without_xpeer  s>    kk**,vv2G!bii)?A 	Ar   c                     t        j                  t        | j                  dt        j
                        }|j                          y N	localhostrK   rX   r/   rw   r@   r1   r   LOOPBACK_TIMEOUTquitr   smtps     r   	testBasiczDebuggingServerTests.testBasic  ,    ||D$))K$+$<$<>		r   c                 "   t        j                         }	 t        j                  | j                  | j
                  dt        j                  | j                  |f      }| j                  |j                         | j                  |j                  | j                  |f       | j                  |j                  d       |j                          y # t        $ r7}|j                  t        j                   k(  r| j#                  d|z          d }~ww xY w)Nr   )rK   rX   rD   zcouldn't bind to source port %d)r   find_unused_portr/   rw   r   r1   r   r   
addCleanupr   r6   rD   rK   r   OSErrorerrno
EADDRINUSEskipTest)r   src_portr   r(   s       r   rE   z&DebuggingServerTests.testSourceAddress  s     113	<<		499[(/(@(@04		8/DFD OODJJ'T00499h2GHT00+>IIK 	ww%***?(JK	s   B7C 	D2D		Dc                    t        j                  t        | j                  dt        j
                        }| j                  |j                         d}| j                  |j                         |       |j                          y Nr   r      s   OK)r/   rw   r@   r1   r   r   r   r   r6   noopr   r   r   r9   s      r   testNOOPzDebuggingServerTests.testNOOP/  W    ||D$))K$+$<$<>

#h/		r   c                    t        j                  t        | j                  dt        j
                        }| j                  |j                         d}| j                  |j                         |       |j                          y r   )r/   rw   r@   r1   r   r   r   r   r6   rsetr   r   s      r   testRSETzDebuggingServerTests.testRSET7  r   r   c                    t        j                  t        | j                  dt        j
                        }| j                  |j                         d}| j                  |j                         |       |j                          y )Nr   r   )r   s   
SIZE 33554432
HELP)r/   rw   r@   r1   r   r   r   r   r6   ehlor   r   s      r   testELHOzDebuggingServerTests.testELHO?  sW    ||D$))K$+$<$<>

#2h/		r   c                 *   t        j                  t        | j                  dt        j
                        }| j                  |j                         d}|j                  d       | j                  |j                         |       |j                          y )Nr   r   )i  s   EXPN not implementedEXPN)r/   rw   r@   r1   r   r   r   r   putcmdr6   getreplyr   r   s      r   testEXPNNotImplementedz+DebuggingServerTests.testEXPNNotImplementedH  sc    ||D$))K$+$<$<>

#1F(3		r   c                    t        j                  t        | j                  dt        j
                        }| j                  |j                         | j                  t              5 }|j                  d       d d d        | j                  dt        j                               |j                          y # 1 sw Y   ?xY w)Nr   r   zhelo
X-INJECTEDprohibited newline characters)r/   rw   r@   r1   r   r   r   r   r[   r\   r   assertInstr	exceptionr   )r   r   excs      r   &test_issue43124_putcmd_escapes_newlinez;DebuggingServerTests.test_issue43124_putcmd_escapes_newlineR  s    ||D$))K$+$<$<>

#z* 	,cKK*+	,5s3==7IJ			, 	,s   &B66B?c                 L   t        j                  t        | j                  dt        j
                        }| j                  |j                         d}| j                  |j                  d      |       | j                  |j                  d      |       |j                          y )Nr   r   )   s>   Cannot VRFY user, but will accept message and attempt deliverynobody@nowhere.com)r/   rw   r@   r1   r   r   r   r   r6   vrfyverifyr   r   s      r   testVRFYzDebuggingServerTests.testVRFY\  sw    ||D$))K$+$<$<>

#2#78(C%9:HE		r   c                 (   t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                          d}| j                  |j                         |       |j                          y )Nr   r   )i  s   Duplicate HELO/EHLO)r/   rw   r@   r1   r   r   r   r   helor6   r   r   s      r   testSecondHELOz#DebuggingServerTests.testSecondHELOf  sb     ||D$))K$+$<$<>

#		0h/		r   c                    t        j                  t        | j                  dt        j
                        }| j                  |j                         | j                  |j                         d       |j                          y )Nr   r   s@   Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r/   rw   r@   r1   r   r   r   r   r6   helpr   r   s     r   testHELPzDebuggingServerTests.testHELPq  sY    ||D$))K$+$<$<>

# 'G 	H		r   c                 *   d}t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                  dd|       t        j                  d       |j                          | j                  j                          | j                  j                          | j                   j#                          t$        |dt&        }| j)                  | j                   j+                         |       y )NA test messager   r   JohnSallyr   
r/   rw   r@   r1   r   r   r   r   sendmailr   r   r   r   r   r   r   r   flush	MSG_BEGINMSG_ENDr6   rj   r   mr   mexpects       r   testSendzDebuggingServerTests.testSendy  s    ||D$))K$+$<$<>

#fgq) 	

4		 )1g6--/9r   c                 H   d}t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                  dd|       t        j                  d       |j                          | j                  j                          | j                  j                          | j                   j#                          t$        |j'                  d      dt(        }| j+                  | j                   j-                         |       y )	Ns   A test messager   r   r   r   r   asciir   )r/   rw   r@   r1   r   r   r   r   r  r   r   r   r   r   r   r   r   r  r  decoder  r6   rj   r  s       r   testSendBinaryz#DebuggingServerTests.testSendBinary  s    ||D$))K$+$<$<>

#fgq)

4		 )188G+<gF--/9r   c                 *   d}t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                  dd|       t        j                  d       |j                          | j                  j                          | j                  j                          | j                   j#                          t$        |dt&        }| j)                  | j                   j+                         |       y )Nz.A test
.mes.sage.r   r   r   r   r   r   r   r  s       r   testSendNeedingDotQuotez,DebuggingServerTests.testSendNeedingDotQuote  s    !||D$))K$+$<$<>

#fgq)

4		 )1g6--/9r   c                    d}t        j                  t        | j                  dt        j
                        }| j                  |j                         | j                  t              5 }|j                  dd|       d d d        | j                  dt        j                               t        j                  d       |j!                          t"        j$                  j'                         }| j)                  d|       y # 1 sw Y   xY w)	Nwazzuuup
linetwozhi
X-INJECTEDr   	hi@me.com
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDr   z
X-INJECTED)r/   rw   r@   r1   r   r   r   r   r[   r\   r  r   r   r   r   r   r   r   r   rj   assertNotIn)r   r  r   r   debugouts        r   $test_issue43124_escape_localhostnamez9DebuggingServerTests.test_issue43124_escape_localhostname  s      ||D$))<L$+$<$<>

#z* 	8cMM+|Q7	8A	

 	

4		$$--/x0	8 	8s   (C??Dc                    d}t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                  dd|       | j                  t              5 }|j                  dddg       d d d        t        j                        }| j                  d|       | j                  d	|       t        j                   d
       |j#                          t$        j&                  j)                         }| j+                  d|       | j+                  d|       | j+                  d|       | j+                  d|       y # 1 sw Y   xY w)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)r/   rw   r@   r1   r   r   r   r   r  r[   r\   mailr   r   r   r   r   r   r   r   rj   r  )r   r  r   r   msgr  s         r   test_issue43124_escape_optionsz3DebuggingServerTests.test_issue43124_escape_options  s      ||$))K,,. 	

#k<3z* 	ZcIIk$<>W#XY	Z#-- 5s;H#N

4		$$--/X.h/22	Z 	Zs   ;EE&c                    d}t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                  dd|       t        j                  d       |j                          | j                  j                          | j                  j                          | j                   j#                          t$        |dt&        }| j)                  | j                   j+                         |       t,        j.                  j+                         }t1        j2                  dt0        j4                        }| j7                  ||       y )	Nr   r   r   z<>r   r   r   z^sender: <>$)r/   rw   r@   r1   r   r   r   r   r  r   r   r   r   r   r   r   r   r  r  r  r6   rj   r   r   rf   rg   rh   ri   )r   r  r   r  r  senders         r   testSendNullSenderz'DebuggingServerTests.testSendNullSender  s    ||D$))K$+$<$<>

#dGQ'

4		 )1g6--/9$$--/NBLL96*r   c                    t         j                  j                  j                  d      }t	        j
                  t        | j                  dt        j                        }| j                  |j                         |j                  |dd       t        j                  d       |j                          | j                   j#                          | j$                  j'                          | j(                  j+                          | j-                         }|d= t.        |j1                         d	t2        }| j5                  ||       y )
Nr   r   r   r   r   	from_addrto_addrsr   X-Peerr   )emailmimetextMIMETextr/   rw   r@   r1   r   r   r   r   send_messager   r   r   r   r   r   r   r   r  r   r  	as_stringr  r6   )r   r  r   r   r  s        r   testSendMessagez$DebuggingServerTests.testSendMessage  s    JJOO$$%56||D$))K$+$<$<>

#!v@

4		
 335hK )1;;='Bg.r   c                    t         j                  j                  j                  d      }d|d<   d|d<   d|d<   d|d	<   t	        j
                  t        | j                  d
t        j                        }| j                  |j                         |j                  |       t        j                  d       |j                          | j!                  |d	   d       | j"                  j%                          | j&                  j)                          | j*                  j-                          | j/                         }|d= |d	= t0        |j3                         dt4        }| j!                  ||       t6        j8                  j;                         }t=        j>                  dt<        j@                        }| jC                  ||       dD ]G  }t=        j>                  djE                  |      t<        j@                        }| jC                  ||       I y )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%  r/   rw   r@   r1   r   r   r   r   r&  r   r   r   r6   r   r   r   r   r   r  r   r  r'  r  r   r   rj   rf   rg   rh   ri   format	r   r  r   r   r  r  r  r$   to_addrs	            r   testSendMessageWithAddressesz1DebuggingServerTests.testSendMessageWithAddresses  s   JJOO$$%56!&	$$T%||D$))K$+$<$<>

#!

4		5 $? 	@ 	335hKeH )1;;='Bg.$$--/3R\\B6*/ 	0Djj!6!=!=d!C!#/GXw/		0r   c                    t         j                  j                  j                  d      }d|d<   d|d<   t	        j
                  t        | j                  dt        j                        }| j                  |j                         |j                  |       t        j                  d       |j                          | j                   j#                          | j$                  j'                          | j(                  j+                          | j-                         }|d	= t.        |j1                         d
t2        }| j5                  ||       t6        j8                  j;                         }t=        j>                  dt<        j@                        }| jC                  ||       dD ]G  }t=        j>                  djE                  |      t<        j@                        }| jC                  ||       I y )Nr   r*  r+  John, Dinsdaler,  r   r   r   r!  r   r1  r   Dinsdaler3  #r"  r#  r$  r%  r/   rw   r@   r1   r   r   r   r   r&  r   r   r   r   r   r   r   r   r  r   r  r'  r  r6   r   r   rj   rf   rg   rh   ri   r4  r5  s	            r    testSendMessageWithSomeAddressesz5DebuggingServerTests.testSendMessageWithSomeAddresses'  sc   JJOO$$%56!&	"$||D$))K$+$<$<>

#!

4		335hK )1;;='Bg.$$--/3R\\B6*( 	0Djj!6!=!=d!C!#/GXw/	0r   c                 L   t         j                  j                  j                  d      }d|d<   d|d<   t	        j
                  t        | j                  dt        j                        }| j                  |j                         |j                  |dd	
       t        j                  d       |j                          | j                   j#                          | j$                  j'                          | j(                  j+                          | j-                         }|d= t.        |j1                         dt2        }| j5                  ||       t6        j8                  j;                         }t=        j>                  dt<        j@                        }| jC                  ||       dD ]G  }t=        j>                  djE                  |      t<        j@                        }| jG                  ||       I t=        j>                  dt<        j@                        }	| jC                  ||	       y )Nr   r*  r+  r9  r,  r   r   zjoe@example.comzfoo@example.netr  r   r!  r   z^sender: joe@example.com$r:  r3  z^recips: .*'foo@example.net'.*$)$r"  r#  r$  r%  r/   rw   r@   r1   r   r   r   r   r&  r   r   r   r   r   r   r   r   r  r   r  r'  r  r6   r   r   rj   rf   rg   rh   ri   r4  assertNotRegex)
r   r  r   r   r  r  r  r$   r6  recips
             r   %testSendMessageWithSpecifiedAddressesz:DebuggingServerTests.testSendMessageWithSpecifiedAddressesD  s   JJOO$$%56!&	"$||D$))K$+$<$<>

#!'8CTU

4		335hK )1;;='Bg.$$--/7F6*( 	3Djj!6!=!=d!C!#/G'2	3 

=r||L5)r   c                    t         j                  j                  j                  d      }d|d<   d|d<   d|d<   t	        j
                  t        | j                  dt        j                  	      }| j                  |j                         |j                  |       t        j                  d
       |j                          | j                   j#                          | j$                  j'                          | j(                  j+                          | j-                         }|d= t.        |j1                         dt2        }| j5                  ||       t6        j8                  j;                         }t=        j>                  dt<        j@                        }| jC                  ||       dD ]G  }t=        j>                  djE                  |      t<        j@                        }| jC                  ||       I y )Nr   zBernard, Biancar+  z#the_rescuers@Rescue-Aid-Society.comSenderr9  r,  r   r   r   r!  r   z-^sender: the_rescuers@Rescue-Aid-Society.com$r:  r3  r<  r5  s	            r   testSendMessageWithMultipleFromz4DebuggingServerTests.testSendMessageWithMultipleFromc  sl   JJOO$$%56%&	;("$||D$))K$+$<$<>

#!

4		335hK )1;;='Bg.$$--/KR\\Z6*( 	0Djj!6!=!=d!C!#/GXw/	0r   c                 "   t         j                  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                  |j                         |j                  |       t        j                  d       |j                          | j                   j#                          | j$                  j'                          | j(                  j+                          |d	= |d= | j-                         }|d= t.        |j1                         dt2        }| j5                  ||       t6        j8                  j;                         }t=        j>                  dt<        j@                        }| jC                  ||       dD ]G  }t=        j>                  djE                  |      t<        j@                        }| jC                  ||       I y )Nr   r*  r+  r   r,  r-  r.  r/  r0  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JeffrL  r3  r<  r5  s	            r   testSendMessageResentz*DebuggingServerTests.testSendMessageResent  s   JJOO$$%56!&	$$T%;-+-A+,,||D$))K$+$<$<>

#!

4		eHlO335hK )1;;='Bg.$$--/6E6*K 	0Djj!6!=!=d!C!#/GXw/	0r   c                    t         j                  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                  |j                         | j                  t              5  |j                  |       d d d        |j                          y # 1 sw Y   xY w)Nr   r*  r+  r   r,  r-  r.  r/  r0  rF  rG  rH  rI  rJ  rK  rL  rM  zThu, 2 Jan 1970 17:42:00 +0000r   r   )r"  r#  r$  r%  r/   rw   r@   r1   r   r   r   r   r[   r\   r&  r   r  r   s      r   #testSendMessageMultipleResentRaisesz8DebuggingServerTests.testSendMessageMultipleResentRaises  s    JJOO$$%56!&	$$T%;-+-A+,,;-)+C-||D$))K$+$<$<>

#z* 	!a 	!

	! 	!s   C11C:)rr   rs   rt   maxDiffr2   r4   r   r   rE   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r(  r7  r=  rA  rD  rO  rR  r   r   r   r   r      s    G6= A
 	:&: :"1(32+&/,"0H0:*>0<#0Jr   r   c                       e Zd Zd Zd Zd Zy)NonConnectingTestsc                     t        j                         }| j                  t         j                  |j                         | j                  t         j                  |j
                  d       y )Nztest msg)r/   rw   r[   SMTPServerDisconnectedr   r   r   s     r   testNotConnectedz#NonConnectingTests.testNotConnected  sH    
 ||~'88$))D'88))Z	1r   c                     | j                  t        t        j                  dd       | j                  t        t        j                  d       y )Nr   boguszlocalhost:bogus)r[   r   r/   rw   r   s    r   testNonnumericPortz%NonConnectingTests.testNonnumericPort  s6    '7<<%w	0'7<<+	-r   c                     t        j                         5 }| j                  |j                         d d d        y # 1 sw Y   y xY wr   )r/   rw   rO   rR   r   s     r   testSockAttributeExistsz*NonConnectingTests.testSockAttributeExists  s6     \\^ 	)tdii(	) 	) 	)s	   :AN)rr   rs   rt   rX  r[  r]  r   r   r   rU  rU    s    1-)r   rU  c                       e Zd Zd Zd Zd Zy)DefaultArgumentsTestsc                    t               | _        d| j                  d<   t        j                         | _        t        d      | j                  _        t               t               c| j                  _        | j                  _        y )N   Páolo <főo@bar.com>r+  )   OK)return_value)	r   r  r/   rw   r   r   r   has_extnr  r   s    r   r2   zDefaultArgumentsTests.setUp  sT    >2LLN	;7		15.		DII.r   c                    d}| j                   j                  | j                         | j                   j                  | j                         | j                  | j                   j                  j
                  d   d   d   |       | j                  | j                   j                  j
                  d   d   d   |       y )N)SMTPUTF8BODY=8BITMIMEr      r   r   r&  r  r6   r  call_args_list)r   expected_mail_optionss     r   r(  z%DefaultArgumentsTests.testSendMessage  s     =		txx(		txx(++::1=a@C.	0++::1=a@C.	0r   c                     dg}d}| j                   j                  | j                  d d |       | j                  |dg       | j                  | j                   j                  j
                  d   d   d   |       y )NSTARTTLS)rn  rg  rh  r   ri  rj  )r   mail_optionsrl  s      r   testSendMessageWithMailOptionsz4DefaultArgumentsTests.testSendMessageWithMailOptions  so    "| I		txxt\B
|4++::1=a@C.	0r   N)rr   rs   rt   r2   r(  rp  r   r   r   r_  r_    s    @00r   r_  c                       e Zd Zd Zd Zd Zy)BadHELOServerTestsc                     t         t        _        t        j                  d       t        j
                  | _        t        j                         | _	        | j                  t        _        d| _
        y )Ns   199 no hello for you!r.   )r   r/   r0   r>   r   r   r   r   r   r   r1   r   s    r   r2   zBadHELOServerTests.setUp  sB    $78**kkm[[
	r   c                 L    t         t        _         | j                  t        _        y r   )r0   r/   r   r   r   r   s    r   r4   zBadHELOServerTests.tearDown  s    __
r   c                     | j                  t        j                  t        j                  t        | j
                  dd       y Nr   ri  )r[   r/   SMTPConnectErrorrw   r@   r1   r   s    r   testFailingHELOz"BadHELOServerTests.testFailingHELO  s+    '22GLL $))[!	=r   N)rr   rs   rt   r2   r4   rx  r   r   r   rr  rr    s    %=r   rr  c                   N    e Zd Zddej                  z  dz  z   dz   Zd Zd Zd Zy)	TooLongLineTestss   250 OK   .rp      
c                    t        j                         | _        t        j                  | _        t        j                         | _        | j                  t        _        t        j                         | _        t        j                  t        j                  t        j                        | _        | j                  j!                  d       t#        j$                  | j                        | _        | j                  | j(                  | j                  f}t        j*                  t,        |      | _        | j.                  j1                          | j                  j3                          | j                  j5                          y )N   r   )r	   r   r   r   r   r   r   r   r   r   r   r    r0   AF_INETSOCK_STREAMrR   
settimeoutr   	bind_portr1   respdatar   r*   r   r   r   r   )r   servargss     r   r2   zTooLongLineTests.setUp  s    *::<**kkm[[
??$MM&..&2D2DE			R !++DII6	HHdmmTYY7&&f8Dr   c                     | j                   j                          | j                  t        _        t        j                  | j                         | `| j                          t        j                  | j                    y r   )r    r   r   r   r   r	   r   r   r   r   r   r   s    r   r4   zTooLongLineTests.tearDown  sM    __
$$T[[1K**DOO<r   c                     | j                  t        j                  t        j                  t        | j
                  dd       y rv  )r[   r/   SMTPResponseExceptionrw   r@   r1   r   s    r   testLineTooLongz TooLongLineTests.testLineTooLong  s+    '77		;	;r   N)	rr   rs   rt   r/   _MAXLINEr  r2   r4   r  r   r   r   rz  rz    s0    D7#3#33a785@H =;r   rz  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y)ResponseExceptionN)rr   rs   rt   r   r   r   r  r  1  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j                  |D cg c]  }dj                  |       c}      | _        t        t        |   |i | y c c}w )N z	250-{0}
)joinr4  _extrafeaturesr   r  __init__)r   extra_featuresr   kwxr   s        r   r  zSimSMTPChannel.__init__>  sH     gg/=?!m""1%?And,d9b9 @s   A	c                    | j                   | j                  k(  rd| j                  j                  | j                        }t        dt        |      t        j                         g | _        	 | j                  |       y t        | A          y # t        $ rE}| j                  | _         | j                  |j                  d|j                         Y d }~y d }~ww xY w)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_terminatorD  s    ??dii'$$))$*=*=>D'4:E,=,=>"$DA  &  "	 % A"&,,		Q[[!,,?@@As   -B 	C;CCc                 t   | j                   s| j                  d       y | j                  rd| j                  vr| j                  d       y | j                  | j                  d       y |j                         }t        |      dvr| j                  d       y d|d   j                         j                  d	d
      z  }	 t        | |      | _
        | j                  | _        | j                  t        |      dk(  r
|d          y d        y # t        $ r# | j                  dj                  |             Y y w xY w)Nz503 Error: send EHLO firstr  z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)r   rp   z/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr   -_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rp   r   )seen_greetingr  extended_smtpr  authenticated_usersplitlenlowerreplacegetattrr  AttributeErrorr4  r  r  )r   argr   auth_object_names       r   	smtp_AUTHzSimSMTPChannel.smtp_AUTHR  s   !!II23!!V43F3F%FII@A"".IIEGyy{t9F"IIGH%Q(?(?S(II	&t-=>D
 ))CINa==  	II 77=v>N7OQ	s   ?D )D76D7c                 ~    |r|| _         | j                  d       n| j                  d       | j                  | _        y )Nz235 Authentication Succeededz&535 Authentication credentials invalid)r  r  r  r  )r   uservalids      r   _authenticatedzSimSMTPChannel._authenticatedk  s2    &*D#II45II>?,,r   c                 h    t        j                  |j                  d            j                  d      S )Nr
  utf-8)base64decodebytesencoder  )r   strings     r   _decode_base64zSimSMTPChannel._decode_base64s  s'    !!&--"89@@IIr   c                     || j                  d       y | j                  |      }	 |j                  d      ^ }}}| j                  ||t        d   k(         y # t        $ r+}| j                  dj	                  ||             Y d }~y d }~ww xY w)Nz334  =535 Splitting response {!r} into user and password failed: {}r   )r  r  r  r\   r4  r  sim_auth)r   r  logpassr  r  passwordr(   s          r   _auth_plainzSimSMTPChannel._auth_plainv  s    ;IIf))#.G%,]]4%8"D(
 h(1+&=>	  		 ((.w(:<s   A 	B"!BBc                    || j                  d       y t        | d      s(| j                  |      | _        | j                  d       y | j                  |      }| j	                  | j                  |t
        d   k(         | `y )Nz334 VXNlcm5hbWU6_auth_login_userz334 UGFzc3dvcmQ6r   )r  r   r  r  r  r  )r   r  r  s      r   _auth_loginzSimSMTPChannel._auth_login  st    ;II()12$($7$7$<D!II()**3/H 5 5x8A;7NO%r   c                 &    | j                  d       y )Nz334 QnVHZ1liVWdHeQ==)r  r   r  s     r   _auth_buggyzSimSMTPChannel._auth_buggy  s     			()r   c                    |%| j                  dj                  t                     y | j                  |      }	 |j	                         \  }}t        j                  t        d   j                  d      | j                  t              j                  d      d      j                         }| j                  |||k(         y # t
        $ r+}| j                  dj                  ||             Y d }~yd }~ww xY w)Nz334 {}r  Fr   r
  md5)r  r4  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$+MMO!k
 !%		""7+##$:;BB7K! !y{  k5F&FG  		 ''-vgq'9;s   C   	C4	!C//C4c                 j    d}|| j                   z   dz   }| j                  |       || _        d| _        y )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  s;    $
 d)))J6		$ !r   c                     |t         v r2| j                  dt         |   dt        j                  |             y | j                  d|z         y )N250 r  z550 No such user: %s)	sim_usersr  r/   	quoteaddrr  s     r   	smtp_VRFYzSimSMTPChannel.smtp_VRFY  s<    )IIYs^W5F5Fs5KLMII,s23r   c                 V   |j                         }|t        v rt        |   }t        |      D ]h  \  }}t        j                  |      }|t        |      dz
  k  r| j                  dt        |   d|       K| j                  dt        |   d|       j y | j                  d       y )Nr   z250-r  r  z550 No access for you!)r  	sim_lists	enumerater/   r  r  r  r  )r   r  	list_name	user_listr%   
user_emailquoted_addrs          r   	smtp_EXPNzSimSMTPChannel.smtp_EXPN  s    IIK		!!),I!*9!5 R:%//
;s9~))IIYz-BKPQIIYz-BKPQR II./r   c                     | j                   t        t        |   |       y | j	                  | j                          | j                          y r   )quit_responser   r  	smtp_QUITr  close_when_doner   r  r   s     r   r  zSimSMTPChannel.smtp_QUIT  s<    %.$1#6IId(()  "r   c                     | j                   t        | 	  |       y | j                  | j                          | j                  r| j                          y y r   )mail_responser   	smtp_MAILr  
disconnectr  r  s     r   r  zSimSMTPChannel.smtp_MAIL  sF    %Gc"IId(()$$& r   c                     | j                   t        | 	  |       y | xj                  dz  c_        | j	                  | j                   | j                  dz
            y Nr   )rcpt_responser   	smtp_RCPT
rcpt_countr  r  s     r   r  zSimSMTPChannel.smtp_RCPT  sM    %Gc"1		$$$T__Q%678r   c                 N    | xj                   dz  c_         t        | 	  |       y r  )
rset_countr   	smtp_RSETr  s     r   r  zSimSMTPChannel.smtp_RSET  s    1#r   c                 t    | j                   t        | 	  |       y | j                  | j                          y r   )data_responser   	smtp_DATAr  r  s     r   r  zSimSMTPChannel.smtp_DATA  s.    %Gc"IId(()r   c                       r   r   r   s    r   handle_errorzSimSMTPChannel.handle_error      r   r   )rr   rs   rt   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  2  s    MMMMJJJD:#>2'J?&*
H$	"40#'9*r   r  c                   .    e Zd ZeZd Zd Zd Zd Zd Z	y)SimSMTPServerc                 f    g | _         i | _        t        j                  j                  | g|i | y r   )_extra_features
_addressesr   
SMTPServerr  r   r   r  s      r   r  zSimSMTPServer.__init__  s/    !!!$444r   c                 b    | j                  | j                  | ||| j                        | _        y )Nr   )channel_classr  _decode_data_SMTPchannelr   r#   r$   s      r   handle_acceptedzSimSMTPServer.handle_accepted  s2     ..  $d)) / +r   c                 @    || j                   d<   || j                   d<   y )Nfromtos)r  )r   peermailfromrcpttosdatas        r   process_messagezSimSMTPServer.process_message  s    "*!(r   c                 :    | j                   j                  |       y 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)
rr   rs   rt   r  r
  r  r  r  r  r   r   r   r   r  r    s     "M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y)SMTPSimTestsc                    t        j                         | _        t        j                  | _        t        j                  t        _        t        j                         | _	        t        j                         | _
        t        t        dfdd      | _        | j                  j                  j                         d   | _        | j                  | j                  | j                  f}t        j                   t"        |      | _        | j$                  j'                          | j                  j)                          | j                  j+                          y Nr   r   Tr   r   r   )r	   r   r   r0   r   r   r   r   r   r   r   r  r@   r"   r   r1   r   r   r   r   r   r   r   s     r   r2   zSMTPSimTests.setUp  s    *::<"NN$,,!)#//+!4)_$O	II$$00215	YYt?	&&.>YO 	r   c                 0   | j                   t        _        | j                  j	                          | j
                  j                          t        j                  | j                         | `	| j                          t        j                  | j                    y r   r   r0   r   r   r   r   r   r	   r   r   r   r   r   r   s    r   r4   zSMTPSimTests.tearDown  b    **$$T[[1K**DOO<r   c                     t        j                  t        | j                  dt        j
                        }|j                          y r   r   r   s     r   r   zSMTPSimTests.testBasic$  r   r   c                    t        j                  t        | j                  dt        j
                        }| j                  |j                  i        dddddd}|j                          | j                  |j                  |       |D ]"  }| j                  |j                  |             $ | j                  |j                  d             |j                          y )Nr   r   r  20000000)expnsizestarttls	deliverbyr   zunsupported-feature)r/   rw   r@   r1   r   r   r6   esmtp_featuresr   
assertTruere  assertFalser   )r   r   expected_featuresks       r   testEHLOzSMTPSimTests.testEHLO*  s    ||D$))K$+$<$<> 	,,b1 %'%/)+*,%'	 			,,.?@" 	.AOODMM!,-	.'<=>		r   c           	         t        j                  t        | j                  dt        j
                        }t        j                         D ]L  \  }}dt        |dt        j                  |      d      f}| j                  |j                  |      |       N d}dd|z  j                  d      f}| j                  |j                  |      |       |j                          y )	Nr   r   r   r  r
  r   &  zNo such user: %s)r/   rw   r@   r1   r   r   r  itemsbytesr  r6   r   r  r   )r   r   	addr_specnameexpected_knownuexpected_unknowns          r   r   zSMTPSimTests.testVRFY@  s    ||D$))K$+$<$<>  )0 	COIt!5*.0A0A)0L*N)0$2 3N TYYy1>B		C !"4q"8!@!@!IJ1'78		r   c           	         t        j                  t        | j                  dt        j
                        }t        j                         D ]|  \  }}g }|D ]2  }|j                  t        |   dt        j                  |             4 dt        dj                  |      d      f}| j                  |j                  |      |       ~ d}d}| j                  |j                  |      |       |j                          y )	Nr   r   r  r   r   r
  zPSU-Members-List)r1  s   No access for you!)r/   rw   r@   r1   r   r   r  r2  r  r  r  r3  r  r6   r&  r   )	r   r   listnamemembersusersr  r6  r7  r8  s	            r   testEXPNzSMTPSimTests.testEXPNO  s    ||D$))K$+$<$<> "+!2 	BHgE M	!g6G6G6JKLM!55)97#CDNTYYx0.A	B 71'78		r   c                 (   | j                   j                  d       t        j                  t        | j
                  dt        j                        }|j                  t        d   t        d         }| j                  |d       |j                          y )N
AUTH PLAINr   r   r   r      s   Authentication Succeededr"   r  r/   rw   r@   r1   r   r   loginr  r6   r   r   r   r  s      r   testAUTH_PLAINzSMTPSimTests.testAUTH_PLAIN_  g    		l+||D$))K$+$<$<>zz(1+x{3AB

r   c                 (   | j                   j                  d       t        j                  t        | j
                  dt        j                        }|j                  t        d   t        d         }| j                  |d       |j                          y )N
AUTH LOGINr   r   r   r   r@  rB  rD  s      r   testAUTH_LOGINzSMTPSimTests.testAUTH_LOGINg  rF  r   c                 v   | j                   j                  d       t        j                  t        | j
                  dt        j                        5 }t        \  |_	        |_
        |j                  d       |j                  d|j                  d      }| j                  |d       d d d        y # 1 sw Y   y xY w)	NrH  r   r   test_auth_loginLOGINTinitial_response_okr@  r"   r  r/   rw   r@   r1   r   r   r  r  r  r   auth
auth_loginr6   rD  s      r   "testAUTH_LOGIN_initial_response_okz/SMTPSimTests.testAUTH_LOGIN_initial_response_oko  s    		l+\\$		+")":":< 	G?C'/$DIt}II'(99Wdoo49PDT#EF	G 	G 	G   AB//B8c                 v   | j                   j                  d       t        j                  t        | j
                  dt        j                        5 }t        \  |_	        |_
        |j                  d       |j                  d|j                  d      }| j                  |d       d d d        y # 1 sw Y   y xY w)	NrH  r   r   rK  rL  FrM  r@  rO  rD  s      r   %testAUTH_LOGIN_initial_response_notokz2SMTPSimTests.testAUTH_LOGIN_initial_response_notokx  s    		l+\\$		+")":":< 	G?C'/$DIt}II'(99Wdoo59QDT#EF	G 	G 	GrS  c                      j                   j                  d       d
 fd	}t        j                  t         j
                  dt        j                        }	 t        \  |_	        |_
        |j                  d       d} j                  t        j                  |      5 }|j                  d|d	       d d d        |j                          y # 1 sw Y   xY w# |j                          w xY w)Nz
AUTH BUGGYc                 *    j                  d|        y)Ns
   BuGgYbUgGyr  )r6   )	challenger   s    r   
auth_buggyz/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggy  s    ]I6r   r   r   test_auth_buggyz&^Server AUTH mechanism infinite loop.*BUGGYFrM  r   )r"   r  r/   rw   r@   r1   r   r   r  r  r  r   assertRaisesRegexSMTPExceptionrP  r   )r   rY  r   expectcms   `    r   testAUTH_BUGGYzSMTPSimTests.testAUTH_BUGGY  s    		l+	 ||$))K,,
	'/$DIt}II'(>F''(=(=vF J"		':5	IJ JJLJ J JJLs%   AC C4C CC C+r  T)opensslc                 (   | j                   j                  d       t        j                  t        | j
                  dt        j                        }|j                  t        d   t        d         }| j                  |d       |j                          y )NzAUTH CRAM-MD5r   r   r   r   r@  rB  rD  s      r   testAUTH_CRAM_MD5zSMTPSimTests.testAUTH_CRAM_MD5  sg    		o.||D$))K$+$<$<>zz(1+x{3AB

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

r   c           	         ddh}	 t        j                          |j                  d       |D ],  }| j                  j                  dj                  |             . |D ]  }| j                  |      5  t        j                  t        | j                  dt        j                        }|j                  d       t        d	   t        d
   c|_        |_        d|j%                         j'                  dd      z   }|j)                  |t+        ||            }| j-                  |d       |j/                          d d d         y # t        $ r Y $w xY w# 1 sw Y   xY w)NPLAINrL  zCRAM-MD5zAUTH {})	mechanismr   r   foor   r   auth_r  r  r@  )hashlibr  addr\   r"   r  r4  subTestr/   rw   r@   r1   r   r   r   r  r  r  r  r  rP  r  r6   r   )r   	supportedrh  r   methodr  s         r   test_auth_functionzSMTPSimTests.test_auth_function  s7   g&		&KKM MM*%" 	?III!!)"2"29"=>	?" 
	I	2 	||D$))3>,3,D,DF 		% +3A;(	4= 9??#4#<#<S##FFyyGD&,AB  'IJ

	 	
	  			 	s   E 3CE	EEE	c                 8   t        j                  t        | j                  dt        j
                        }|j                         \  }}| j                  |d       | j                  d|j                         |j                          | j                  d|j                         |j                  t        | j                         | j                  d|j                         |j                          | j                  d|j                         |j                          y )Nr   r   r   r'  )r/   rw   r@   r1   r   r   r   r6   r   r*  r   r  re   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12		!4!45T499%!4!45##%fd112		r   c                    t        j                  t        | j                        5 }|j	                         \  }}| j                  |d       d d d        | j                  t         j                  j                  d       t        j                  t        | j                        5 }|j                          d d d        | j                  t         j                  |j                  d       y # 1 sw Y   xY w# 1 sw Y   AxY w)Nr   s   foo)
r/   rw   r@   r1   r   r6   r[   rW  r   r   rs  s       r   test_with_statementz SMTPSimTests.test_with_statement  s    \\$		* 	(d IIKMD'T3'	( 	'88$))VL\\$		* 	dJJL	'88$))VL	( 	(	 	s   &C'"C3'C03C<c                    | j                  t        j                        5 }t        j                  t        | j
                        5 }|j                          d| j                  j                  _	        d d d        d d d        | j                  j                  j                  d       | j                  |j                  j                  d       y # 1 sw Y   ^xY w# 1 sw Y   bxY w)Nz421 QUIT FAILED  s   QUIT FAILED)r[   r/   r  rw   r@   r1   r   r"   r  r  r6   r   r  r  )r   errorr   s      r    test_with_statement_QUIT_failurez-SMTPSimTests.test_with_statement_QUIT_failure  s    w<<= 	IdDII. I$		7H		&&4I	I 	22C833^D	I I	I 	Is#   %C,C1CC	CC#c                    t        j                  t        | j                  dt        j
                        }|j                          d| j                  j                  _	        d| j                  j                  _
        | j                  t         j                        5  |j                  ddd       d d d        | j                  |j                         y # 1 sw Y   %xY w)Nr   r   z451 Requested action abortedTr   r   test message)r/   rw   r@   r1   r   r   r   r"   r  r  r  r[   SMTPSenderRefusedr  rO   rR   r   s     r   test__rest_from_mail_cmdz%SMTPSimTests.test__rest_from_mail_cmd  s    ||D$))K$+$<$<>		/M		,,0		)w889 	;MM&'>:	;$))$	; 	;s   CCc                    t        j                  t        | j                  dt        j
                        }|j                          d| j                  j                  _	        | j                  t         j                        5  |j                  ddd       d d d        | j                  |j                         | j                  | j                  j                  j                   d       y # 1 sw Y   UxY w)Nr   r   z421 closing connectionr   r   r~  r   )r/   rw   r@   r1   r   r   r   r"   r  r  r[   r  r  rO   rR   r6   r  r   s     r   test_421_from_mail_cmdz#SMTPSimTests.test_421_from_mail_cmd  s    ||D$))K$+$<$<>		/G		,w889 	;MM&'>:	;$))$//::A>	; 	;s    C((C1c                 F   t        j                  t        | j                  dt        j
                        }|j                          ddg| j                  j                  _	        | j                  t         j                        5 }|j                  dg dd       d d d        | j                  |j                         | j                  | j                  j                  j                   d       | j#                  j$                  j&                  d   d	d
i       y # 1 sw Y   xY w)Nr   r   z250 accepted421 closingr   )r   FrankGeorger~  r   r  )rz  s   closing)r/   rw   r@   r1   r   r   r   r"   r  r  r[   SMTPRecipientsRefusedr  rO   rR   r6   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	P$))$//::A>Q[[--a07<M2NO		P 	Ps   DD c                     G d dt               }|| j                  _        t        j                  t
        | j                  dt        j                        }|j                          | j                  t        j                        5  |j                  ddgd       d d d        | j                  |j                         | j                  | j                  j                   j"                  d       y # 1 sw Y   UxY w)	Nc                        e Zd Z fdZ xZS )=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelc                 x    | j                   | j                  k(  r| j                  d       y t        |           y )Nr  )r  DATAr  r   r  )r   r   s    r   r  zNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator  s*    ??dii/IIm,G,.r   )rr   rs   rt   r  r   r   s   @r   MySimSMTPChannelr    s    / /r   r  r   r   zJohn@foo.orgzSally@foo.orgr~  r   )r  r"   r
  r/   rw   r@   r1   r   r   r   r[   SMTPDataErrorr  rO   rR   r6   r  r  )r   r  r   s      r   test_421_from_data_cmdz#SMTPSimTests.test_421_from_data_cmd  s    	/~ 	/ #3		||D$))K$+$<$<>		w445 	MMM.?*;^L	M$))$//::A>	M 	Ms   C..C7c           	         t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                          | j                  |j                         | j                  |j                  d             | j                  t         j                  |j                  dddddg	       | j                  t         j                  |j                   dddg
       y )Nr   r   smtputf8r   r   r  rh  rg  ro  options)r/   rw   r@   r1   r   r   r   r   r   r+  
does_esmtpr,  re  r[   SMTPNotSupportedErrorr  r  r   s     r   4test_smtputf8_NotSupportedError_if_no_server_supportzASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_support  s    ||$))K,,. 	

#		(z23))MMGR
.K 	 	M 	))IIv'D 	 	Fr   c                 ,   t        j                  t        | j                  dt        j
                        }| j                  |j                         | j                  t        |j                  ddd       | j                  t        |j                  d       y )Nr   r   Aliceu   Böbr  u   Älice)r/   rw   r@   r1   r   r   r   r   r[   UnicodeEncodeErrorr  r  r   s     r   "test_send_unicode_without_SMTPUTF8z/SMTPSimTests.test_send_unicode_without_SMTPUTF8"  sh    ||$))K,,. 	

#,dmmWfbQ,diiBr   c                 `   t               }d|d<   d|d<   d|d<   t        j                  t        | j                  dt
        j                        }| j                  |j                         | j                  t        j                        5  |j                  |       d d d        y # 1 sw Y   y xY w)	Nra  r+  r;  r,     Nudge nudge, wink, wink ὠ9Subjectr   r   )r   r/   rw   r@   r1   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     n-FD	:I||$))K,,. 	

#w<<= 	#c"	# 	# 	#s   	B$$B-c                 (   t        j                  t        | j                  dt        j
                        }| j                  |j                         t               }t        j                  j                  d      |d<   t        j                  j                  d      |d<   | j                  |j                  |      i        | j                  | j                  j                   d   d       | j                  | j                  j                   d	   d
g       y )Nr   r   )u   Michaëlmichael@example.comr+  )u   Renérene@example.comr,  r  r  r  r  )r/   rw   r@   r1   r   r   r   r   r   r"  utils
formataddrr  r&  r6   r"   r  )r   r   ru  s      r   1test_name_field_not_included_in_envelop_addressesz>SMTPSimTests.test_name_field_not_included_in_envelop_addresses8  s    ||$))K,,. 	

#.++001TU../LMT..w7<--f57LM--e47I6JKr   N)rr   rs   rt   r2   r4   r   r/  r   r=  rE  rI  rR  rU  r`  r   requires_hashdigestrc  re  rp  rv  rx  r|  r  r  r  r  r  r  r  r  r   r   r   r  r    s    $	=, GG( (^''t< = (^''t< =,ME%?	P? F C#Lr   r  c                   $    e Zd Zd Zd Z	 	 ddZy)SimSMTPUTF8Serverc                 \    ddg| _         t        j                  j                  | g|i | y )Nrg  8BITMIME)r  r   r  r  r  s      r   r  zSimSMTPUTF8Server.__init__J  s/     !+J7!!$444r   c                 x    | j                  | j                  | ||| j                  | j                        | _        y )Nr   enable_SMTPUTF8)r
  r  r  r  r  r  s      r   r  z!SimSMTPUTF8Server.handle_acceptedQ  s;     ..  $d)) 00 / 
r   Nc                 X    || _         || _        || _        || _        || _        || _        y r   )	last_peerlast_mailfromlast_rcpttoslast_messagelast_mail_optionslast_rcpt_options)r   r  r  r  r  ro  rcpt_optionss          r   r  z!SimSMTPUTF8Server.process_messageX  s1    %# !-!-r   )NN)rr   rs   rt   r  r  r  r   r   r   r  r  H  s    5
 KOJN.r   r  c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)SMTPUTF8SimTestsNc                    t        j                         | _        t        j                  | _        t        j                  t        _        t        j                         | _	        t        j                         | _
        t        t        dfddd      | _        | j                  j                  j                         d   | _        | j                  | j                  | j                  f}t        j                   t"        |      | _        | j$                  j'                          | j                  j)                          | j                  j+                          y )Nr   r   FTr  r   r   )r	   r   r   r0   r   r   r   r   r   r   r   r  r@   r"   r   r1   r   r   r   r   r   r   r   s     r   r2   zSMTPUTF8SimTests.setUpf  s    *::<"NN$,,!)#//+%tQi276:<	 II$$00215	YYt?	&&.>YO 	r   c                 0   | j                   t        _        | j                  j	                          | j
                  j                          t        j                  | j                         | `	| j                          t        j                  | j                    y r   r!  r   s    r   r4   zSMTPUTF8SimTests.tearDownz  r"  r   c                 :   t        j                  t        | j                  dt        j
                        }| j                  |j                         |j                          | j                  |j                         | j                  |j                  d             y )Nr   r   r  )r/   rw   r@   r1   r   r   r   r   r   r+  r  re  r   s     r   $test_test_server_supports_extensionsz5SMTPUTF8SimTests.test_test_server_supports_extensions  sd    ||$))K,,. 	

#		(j12r   c                    dj                  d      }t        j                  t        | j                  dt
        j                        }| j                  |j                         |j                  dd|ddg	       | j                  | j                  j                  d       | j                  | j                  j                  dg       | j                  | j                  j                  |       | j                  d| j                  j                          | j                  d| j                  j                          | j                  | j                  j"                  g        y )
N$   ¡a test message containing unicode!r  r   r   u   Jőhnu   Sállyrh  rg  r  )r  r/   rw   r@   r1   r   r   r   r   r  r6   r"   r  r  r  r   r  r  rQ  s      r   ,test_send_unicode_with_SMTPUTF8_via_sendmailz=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmail  s    299'B||$))K,,. 	

#gx$3Z#@ 	 	B00'://(<//3otyy'B'BCj$))"="=>44b9r   c                 ~   dj                  d      }t        j                  t        | j                  dt
        j                        }| j                  |j                         |j                          | j                  |j                  dddg      d	       | j                  |j                  d
      d	       | j                  |j                  |      d	       | j                  | j                  j                  d       | j                  | j                  j                   d
g       | j                  | j                  j"                  |       | j%                  d| j                  j&                         | j%                  d| j                  j&                         | j                  | j                  j(                  g        y )Nr  r  r   r   u   Jőrh  rg  r  r   u   János)r  r/   rw   r@   r1   r   r   r   r   r   r6   r  rcptr  r"   r  r  r  r   r  r  rQ  s      r   1test_send_unicode_with_SMTPUTF8_via_low_level_APIzBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_API  sB   299'B||$))K,,. 	

#		IIeoz%BIC	 	8,l;1|400%8//(<//3otyy'B'BCj$))"="=>44b9r   c                 J   t               }d|d<   d|d<   d|d<   |j                  d       t        j                  d      }t	        j
                  t        | j                  d	t        j                  
      }| j                  |j                         | j                  |j                  |      i        | j                  | j                  j                  d       | j                  | j                  j                   dg       | j                  | j                  j"                  j%                         |       | j'                  d| j                  j(                         | j'                  d| j                  j(                         | j                  | j                  j*                  g        y )Nra  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.comrh  rg  )r   set_contenttextwrapdedentr/   rw   r@   r1   r   r   r   r   r6   r&  r"   r  r  r  r  r   r  r  )r   r  r9   r   s       r   2test_send_message_uses_smtputf8_if_addrs_non_asciizCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii  s<   n-FD	:I 	MN ?? 	$ 	 ||$))K,,. 	

#**3/400.A//*>//668(Cotyy'B'BCj$))"="=>44b9r   )
rr   rs   rt   rS  r2   r4   r  r  r  r  r   r   r   r  r  b  s%    G(	=3::&:r   r  s    psu doesnotexistr  )eolc                       e Zd Zd Zy)!SimSMTPAUTHInitialResponseChannelc                     |j                         }|d   j                         dk(  r,t        |      dk(  r|d   t        k(  r| j	                  d       y | j	                  d       y )Nr   plainrp   r   z235 Okz571 Bad authentication)r  r  r  EXPECTED_RESPONSEr  )r   r  r   s      r   r  z+SimSMTPAUTHInitialResponseChannel.smtp_AUTH  sW     yy{7==?g%4yA~ 7//IIh'		*+r   N)rr   rs   rt   r  r   r   r   r  r    s    ,r   r  c                       e Zd ZeZy) SimSMTPAUTHInitialResponseServerN)rr   rs   rt   r  r
  r   r   r   r  r    s    5Mr   r  c                   $    e Zd Zd Zd Zd Zd Zy)SMTPAUTHInitialResponseSimTestsc                    t        j                         | _        t        j                  | _        t        j                  t        _        t        j                         | _	        t        j                         | _
        t        t        dfdd      | _        | j                  j                  j                         d   | _        | j                  | j                  | j                  f}t        j                   t"        |      | _        | j$                  j'                          | j                  j)                          | j                  j+                          y r  )r	   r   r   r0   r   r   r   r   r   r   r   r  r@   r"   r   r1   r   r   r   r   r   r   r   s     r   r2   z%SMTPAUTHInitialResponseSimTests.setUp  s    *::<"NN$,,!)#//+41ID:	 II$$00215	YYt?	&&.>YO 	r   c                 0   | j                   t        _        | j                  j	                          | j
                  j                          t        j                  | j                         | `	| j                          t        j                  | j                    y r   r!  r   s    r   r4   z(SMTPAUTHInitialResponseSimTests.tearDown  r"  r   c                     | j                   j                  d       t        j                  t        | j
                  dt        j                        }|j                  dd       |j                          y )Nr?  r   r   psudoesnotexist)
r"   r  r/   rw   r@   r1   r   r   rC  r   r   s     r   %testAUTH_PLAIN_initial_response_loginzESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_login  sL    		l+||D$))K$+$<$<>

5.)

r   c                 B   | j                   j                  d       t        j                  t        | j
                  dt        j                        }d|_        d|_	        |j                  d|j                        \  }}|j                          | j                  |d       y )Nr?  r   r   r  r  r  rA  )r"   r  r/   rw   r@   r1   r   r   r  r  rP  
auth_plainr   r6   )r   r   rt  responses       r   $testAUTH_PLAIN_initial_response_authzDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_auth  st    		l+||D$))K$+$<$<>	&7DOO<h

s#r   N)rr   rs   rt   r2   r4   r  r  r   r   r   r  r    s    &	=$r   r  __main__)Er  email.mime.textr"  email.messager   email.base64mimer   encode_base64email.utilsrk  r  r0   r/   r   rf   r   r   r   r   r  r   r   testr   r   test.supportr   r   r	   r
   r   unittest.mockr   requires_working_socketr@   platformr   SMTPChannelr*   r,   TestCaserv   ry   r   r  r  r   rU  r_  rr  rz  r  r  r  r  	Exceptionr  r  r  r  r  r  r  r  r  r  r  rr   mainr   r   r   <module>r     s*     & 9      	 	 
       % ' & ) !      t ,<<8$/E!,`6 `6F|X%6%6 
/|X%6%6 /,> 6	
3S8,, Sj)** )60H-- 08=** =&;x(( ;@ #+#,'/	
 2; +,EF,.	
 )	 (uU&& upE$$ 6@L8$$ @LF
. .4l:x(( l:^ ""8bA , ,6} 6.$h&7&7 .$b zHMMO r   