Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 18.189.195.219
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : test_smtplib.cpython-310.pyc
o

ab2��@s�ddlZddlZddlmZddlmZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZddlmZddlZe� ��e�!d	e"�ddl#Z#ddl$Z$Wd�n1s�wYej%Z%ej&d
kr�dd�Z'e'e$j(_'d
d�Z)Gdd�d�Z*Gdd�de*ej+�Z,Gdd�de*ej+�Z-dd�Z.dZ/dZ0Gdd�dej+�Z1Gdd�dej+�Z2Gdd�dej+�Z3Gdd �d ej+�Z4Gd!d"�d"ej+�Z5d#d$d%d&�Z6d'Z7d(Z8d)d*gd+gd,�Z9Gd-d.�d.e:�Z;Gd/d0�d0e$j(�Z<Gd1d2�d2e$j=�Z>Gd3d4�d4ej+�Z?Gd5d6�d6e>�Z@Gd7d8�d8ej+�ZAed9d:d;�ZBGd<d=�d=e<�ZCGd>d?�d?e>�ZDGd@dA�dAej+�ZEeFdBk�rfe�G�dSdS)C�N)�EmailMessage)�body_encode)�support�mock_socket)�hashlib_helper)�
socket_helper)�threading_helper)�Mock�ignore�darwincCsdS�N���selfr
r
�:/usr/local/python-3.10/lib/python3.10/test/test_smtplib.py�handle_expt%src
Cs�|��|��zVz|��\}}Wn	tyYn:wd}|rE|dkrEt�g|gg�\}}}|r;|�|�}	||	d�}|d8}|rE|dks#|��W|��|��dSW|��|��dS|��|��w)Ni�r�)�listen�set�accept�TimeoutError�select�send�close)
�evt�buf�serv�conn�addr�n�r�w�e�sentr
r
r�server*s.�
�
�
�
r$c@steZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS)�GeneralTestscCstt_d|_dS)N�)r�smtplib�socket�portrr
r
r�setUpBs
zGeneralTests.setUpcCs
tt_dSr)r(r'rr
r
r�tearDownFs
zGeneralTests.tearDowncCsd}d}|�|t�|��dS)Nzabc
.jkl
foo
..bluezabc
..jkl
foo
...blue)�assertEqualr'Z	quotedata)rZteststr�expectedr
r
r�
testQuoteDataKszGeneralTests.testQuoteDatacCs$t�d�|�t|j�}|��dS)N�220 Hola mundo�r�
reply_with�client�HOSTr)r�rr2r
r
r�
testBasic1Ps
zGeneralTests.testBasic1cC�6t�d�|jt|jdd�}|�|jd�|��dS)Nr/)z	127.0.0.1i�M)�source_address)rr1r2r3r)r,r7rr4r
r
r�testSourceAddressVs

�zGeneralTests.testSourceAddresscCs*t�d�|�dt|jf�}|��dS)Nr/z%s:%sr0r4r
r
r�
testBasic2^s
zGeneralTests.testBasic2cCr6)Nr/Ztesthost)�local_hostname)rr1r2r3r)r,r:rr4r
r
r�testLocalHostNameds
zGeneralTests.testLocalHostNamec	Cszt�d�|�t���t�d�|�t��d�z|�t|j�}Wt�d�nt�d�w|�|j	�
�d�|��dS)Nr/�)rr1�assertIsNone�getdefaulttimeout�setdefaulttimeoutr,r2r3r)�sock�
gettimeoutrr4r
r
r�testTimeoutDefaultks

zGeneralTests.testTimeoutDefaultc	Cslt�d�|�t���t�d�z|jt|jdd�}Wt�d�nt�d�w|�|j	�
��|��dS�Nr/r<��timeout)rr1r=r(r>r?r2r3r)r@rArr4r
r
r�testTimeoutNonews

zGeneralTests.testTimeoutNonecCsLt�d�|�t��|jt|jdd�Wd�dS1swYdS)Nr/rrD)rr1�assertRaises�
ValueErrorr2r3r)rr
r
r�testTimeoutZero�s
"�zGeneralTests.testTimeoutZerocCs:t�d�|jt|jdd�}|�|j��d�|��dSrC)	rr1r2r3r)r,r@rArr4r
r
r�testTimeoutValue�s
zGeneralTests.testTimeoutValuecC�|t�d�|��}|�d�t���}|�t|j�Wd�n1s$wY|�	�t
�dt
j�}|�
|��|�dS)N�220 Hello worldrz	^connect:�rr1r2Zset_debuglevelrZcaptured_stderr�connectr3r)r�re�compile�	MULTILINE�assertRegex�getvalue�rr2�stderrr-r
r
r�test_debuglevel�s


�zGeneralTests.test_debuglevelcCrK)NrL�z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rMrTr
r
r�test_debuglevel_2�s


��zGeneralTests.test_debuglevel_2N)�__name__�
__module__�__qualname__r*r+r.r5r8r9r;rBrFrIrJrVrXr
r
r
rr%@s
r%c@seZdZejZdS)�SMTPGeneralTestsN)rYrZr[r'�SMTPr2r
r
r
rr\�s
r\cs<eZdZejZe�ee	d�d�dd��Z
�fdd�Z�ZS)�LMTPGeneralTests�AF_UNIXz test requires Unix domain socketc	CsTd}t�d�z|�||j�}Wt�d�nt�d�w|�|j���|��dS)N�!/some/local/lmtp/delivery/programrL)	rr1r2r)r?r=r@rAr)r�
local_hostr2r
r
r�"testUnixDomainSocketTimeoutDefault�s
z3LMTPGeneralTests.testUnixDomainSocketTimeoutDefaultcsLt���d}|�t��|j|dd�Wd�dS1swYdS)Nr`rrD)�superrIrGrHr2)rra��	__class__r
rrI�s

"�z LMTPGeneralTests.testTimeoutZero)
rYrZr[r'ZLMTPr2�unittestZ
skipUnless�hasattrr(rbrI�
__classcell__r
r
rdrr^�s


r^c	Cs�|��zSz1ttd�rtj}ntj}d}tjr5|dkr5|dtj�|��r*|��q5|d8}tjr5|dksWn	t	y?YnwW|��sNt
�d�|��t��|��dS|��set
�d�|��t��|��w)N�polli�r�{�G�z�?rg�?)
rrgr�asyncoreZpoll2riZ
socket_map�is_setrr�time�sleepZ	close_all)r�serv_evt�
client_evtZpoll_funrr
r
r�debugging_server�s8
����
�

rqz&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�ZdS)6�DebuggingServerTestsNcCs�t��|_tj|_tjt_tj|_	t
��|_|jt_t
��|_t
��|_tj|_t
��t_tjtdfddd�|_|jj��dd�\|_|_|j|j|jf}t
jt|d�|_|j��|j��|j��dS)Nr�Znowhere���T��decode_datarW��target�args) r�threading_setup�
thread_keyr(�getfqdn�real_getfqdnr�sys�stdout�
old_stdout�io�StringIO�output�	threading�Eventrorp�smtpd�DEBUGSTREAM�old_DEBUGSTREAMZDebuggingServerr3r�getsockname�hostr)�Threadrq�thread�start�wait�clear�rZ	serv_argsr
r
rr*�s&




�

zDebuggingServerTests.setUpcCs^|jt_|j��|j��t�|j	�|j
t_t
j��|jt
_|`	|��tj|j�dSr)r}r(r|rprror�r�join_threadr�r�r~rr�r�rr��
doCleanups�threading_cleanupr{rr
r
rr+s


zDebuggingServerTests.tearDowncCs$|j��}tjdd|tjtjBd�S)Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)�flags)r�rSrO�subrQ�DOTALL)r�test_outputr
r
r�get_output_without_xpeers
�z-DebuggingServerTests.get_output_without_xpeercC�"tjt|jdtjd�}|��dS�N�	localhost�r:rE�r'r]r3r)r�LOOPBACK_TIMEOUT�quit�r�smtpr
r
r�	testBasic��zDebuggingServerTests.testBasicc
Cs�t��}z.tj|j|jdtj|j|fd�}|�|j	�|�
|j|j|f�|�
|jd�|�
�WdStyL}z|jtjkrG|�d|��d}~ww)Nr�)r:rEr7zcouldn't bind to source port %d)rZfind_unused_portr'r]r�r)rr��
addCleanuprr,r7r:r��OSError�errnoZ
EADDRINUSEZskipTest)rZsrc_portr�r"r
r
rr8 s ���z&DebuggingServerTests.testSourceAddresscC�Btjt|jdtjd�}|�|j�d}|�|�	�|�|�
�dS�Nr�r���sOK)r'r]r3r)rr�r�rr,�noopr��rr�r-r
r
r�testNOOP0��zDebuggingServerTests.testNOOPcCr�r�)r'r]r3r)rr�r�rr,Zrsetr�r�r
r
r�testRSET8r�zDebuggingServerTests.testRSETcCr�)Nr�r�)r�s
SIZE 33554432
HELP)r'r]r3r)rr�r�rr,�ehlor�r�r
r
r�testELHO@s�zDebuggingServerTests.testELHOcCsLtjt|jdtjd�}|�|j�d}|�d�|�	|�
�|�|��dS)Nr�r�)i�sEXPN not implementedZEXPN)r'r]r3r)rr�r�r�putcmdr,Zgetreplyr�r�r
r
r�testEXPNNotImplementedIs�
z+DebuggingServerTests.testEXPNNotImplementedcCsttjt|jdtjd�}|�|j�|�t	��
}|�
d�Wd�n1s&wY|�dt|j
��|��dS)Nr�r�zhelo
X-INJECTED�prohibited newline characters)r'r]r3r)rr�r�rrGrHr��assertIn�str�	exceptionr�)rr��excr
r
r�&test_issue43124_putcmd_escapes_newlineSs��z;DebuggingServerTests.test_issue43124_putcmd_escapes_newlinecCsVtjt|jdtjd�}|�|j�d}|�|�	d�|�|�|�
d�|�|��dS)Nr�r�)�s>Cannot VRFY user, but will accept message and attempt delivery�nobody@nowhere.com)r'r]r3r)rr�r�rr,�vrfyZverifyr�r�r
r
r�testVRFY]s�zDebuggingServerTests.testVRFYcCsJtjt|jdtjd�}|�|j�|��d}|�	|��|�|�
�dS)Nr�r�)i�sDuplicate HELO/EHLO)r'r]r3r)rr�r�rZhelor,r�r�r
r
r�testSecondHELOgs�z#DebuggingServerTests.testSecondHELOcCs>tjt|jdtjd�}|�|j�|�|�	�d�|�
�dS)Nr�r�s@Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r'r]r3r)rr�r�rr,�helpr�r�r
r
r�testHELPrs�zDebuggingServerTests.testHELPcC�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|tf}|�|j��|�dS)N�A test messager�r��John�Sallyrj�%s%s
%s�r'r]r3r)rr�r�r�sendmailrmrnr�rprror�r��flush�	MSG_BEGIN�MSG_ENDr,rS�r�mr��mexpectr
r
r�testSendzs�



zDebuggingServerTests.testSendcCs�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|�d�tf}|�|j��|�dS)	NsA test messager�r�r�r�rjr��ascii)r'r]r3r)rr�r�rr�rmrnr�rprror�r�r�r��decoder�r,rSr�r
r
r�testSendBinary�s�



z#DebuggingServerTests.testSendBinarycCr�)Nz.A test
.mes.sage.r�r�r�r�rjr�r�r�r
r
r�testSendNeedingDotQuote�s�



z,DebuggingServerTests.testSendNeedingDotQuotecCs�d}tjt|jdtjd�}|�|j�|�t	��}|�
dd|�Wd�n1s*wY|�dt|j
��t�d�|��tj��}|�d|�dS)	N�wazzuuup
linetwoz
hi
X-INJECTEDr��	hi@me.com�
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDrjz
X-INJECTED)r'r]r3r)rr�r�rrGrHr�r�r�r�rmrnr�r�r�rS�assertNotIn)rr�r�r��debugoutr
r
r�$test_issue43124_escape_localhostname�s ���

z9DebuggingServerTests.test_issue43124_escape_localhostnamecCs�d}tjt|jdtjd�}|�|j�|�dd|�|�	t
��}|�dddg�Wd�n1s2wYt|j
�}|�d|�|�d	|�t�d
�|��tj��}|�d|�|�d|�|�d
|�|�d|�dS)Nr�r�r�r�r�zX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2r�z.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2rjzX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r'r]r3r)rr�r�rr�rGrH�mailr�r�r�rmrnr�r�r�rSr�)rr�r�r��msgr�r
r
r�test_issue43124_escape_options�s(��


z3DebuggingServerTests.test_issue43124_escape_optionscCs�d}tjt|jdtjd�}|�|j�|�dd|�t	�
d�|��|j�
�|j��|j��dt|tf}|�|j��|�tj��}t�dtj�}|�||�dS)	Nr�r�r�z<>r�rjr�z^sender: <>$)r'r]r3r)rr�r�rr�rmrnr�rprror�r�r�r�r�r,rSr�r�rOrPrQrR)rr�r�r�r��senderr
r
r�testSendNullSender�s �




z'DebuggingServerTests.testSendNullSendercCs�tjj�d�}tjt|jdtj	d�}|�
|j�|j|ddd�t
�d�|��|j��|j��|j��|��}|d=d	t|��tf}|�||�dS)
Nr�r�r�r�r��Z	from_addrZto_addrsrj�X-Peerr�)�email�mime�text�MIMETextr'r]r3r)rr�r�r�send_messagermrnr�rprror�r�r�r�r��	as_stringr�r,)rr�r�r�r�r
r
r�testSendMessage�s�



z$DebuggingServerTests.testSendMessagec	Cstjj�d�}d|d<d|d<d|d<d|d	<tjt|jd
tj	d�}|�
|j�|�|�t
�d�|��|�|d	d�|j��|j��|j��|��}|d
=|d	=dt|��tf}|�||�tj��}t�dtj �}|�!||�dD]}t�d�"|�tj �}|�!||�qzdS)Nr��foo@bar.com�Fromr��To�Sally, Fred�CC�?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>�Bccr�r�rjr�r��^sender: foo@bar.com$)r�r�ZFredzroot@localhostzwarped@silly.walks.com�^recips: .*'{}'.*$)#r�r�r�r�r'r]r3r)rr�r�rr�rmrnr�r,rprror�r�r�r�r�r�r�r�r�rSrOrPrQrR�format�	rr�r�r�r�r�r�r�to_addrr
r
r�testSendMessageWithAddressess<�





��z1DebuggingServerTests.testSendMessageWithAddressesc	Cs�tjj�d�}d|d<d|d<tjt|jdtj	d�}|�
|j�|�|�t
�d�|��|j��|j��|j��|��}|d	=d
t|��tf}|�||�tj��}t�dtj �}|�!||�dD]}t�d
�"|�tj �}|�!||�qgdS)Nr�r�r��John, Dinsdaler�r�r�rjr�r�r��r��Dinsdaler��#r�r�r�r�r'r]r3r)rr�r�rr�rmrnr�rprror�r�r�r�r�r�r�r,r�r�rSrOrPrQrRr�r�r
r
r� testSendMessageWithSomeAddresses(s4�





��z5DebuggingServerTests.testSendMessageWithSomeAddressesc
Cstjj�d�}d|d<d|d<tjt|jdtj	d�}|�
|j�|j|dd	d
�t
�d�|��|j��|j��|j��|��}|d=d
t|��tf}|�||�tj��}t�dtj �}|�!||�dD]}t�d�"|�tj �}|�#||�qjt�dtj �}	|�!||	�dS)Nr�r�r�r�r�r�r�zjoe@example.comzfoo@example.netr�rjr�r�z^sender: joe@example.com$r�r�z^recips: .*'foo@example.net'.*$)$r�r�r�r�r'r]r3r)rr�r�rr�rmrnr�rprror�r�r�r�r�r�r�r,r�r�rSrOrPrQrRr�ZassertNotRegex)
rr�r�r�r�r�r�rr�Zrecipr
r
r�%testSendMessageWithSpecifiedAddressesEs6�




�z:DebuggingServerTests.testSendMessageWithSpecifiedAddressesc	Cstjj�d�}d|d<d|d<d|d<tjt|jdtj	d	�}|�
|j�|�|�t
�d
�|��|j��|j��|j��|��}|d=dt|��tf}|�||�tj��}t�d
tj �}|�!||�dD]}t�d�"|�tj �}|�!||�qkdS)Nr�zBernard, Biancar�z#the_rescuers@Rescue-Aid-Society.comZSenderr�r�r�r�rjr�r�z-^sender: the_rescuers@Rescue-Aid-Society.com$r�r�r�r�r
r
r�testSendMessageWithMultipleFromds6�





��z4DebuggingServerTests.testSendMessageWithMultipleFromc	Cs4tjj�d�}d|d<d|d<d|d<d|d	<d
|d<d|d
<d|d<d|d<tjt|jdtj	d�}|�
|j�|�|�t
�d�|��|j��|j��|j��|d	=|d=|��}|d=dt|��tf}|�||�tj��}t�dtj �}|�!||�dD]}t�d�"|�tj �}|�!||�q�dS)Nr�r�r�r�r�r�r�r�r��Thu, 1 Jan 1970 17:42:00 +0000�Resent-Date�holy@grail.net�Resent-From�&Martha <my_mom@great.cooker.com>, Jeff�	Resent-To�doe@losthope.net�
Resent-Bccr�r�rjr�r�z^sender: holy@grail.net$)zmy_mom@great.cooker.comZJeffrr�r�r�r
r
r�testSendMessageResent�sD�





��z*DebuggingServerTests.testSendMessageResentcCs�tjj�d�}d|d<d|d<d|d<d|d	<d
|d<d|d
<d|d<d|d<d|d<d|d<d|d
<tjt|jdtj	d�}|�
|j�|�t
��
|�|�Wd�n1sYwY|��dS)Nr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrzThu, 2 Jan 1970 17:42:00 +0000r�r�)r�r�r�r�r'r]r3r)rr�r�rrGrHr��rr�r�r
r
r�#testSendMessageMultipleResentRaises�s(��z8DebuggingServerTests.testSendMessageMultipleResentRaises)rYrZr[�maxDiffr*r+r�r�r8r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr
r
r
rrr�s8	


$%rrc@�$eZdZdd�Zdd�Zdd�ZdS)�NonConnectingTestscCs.t��}|�tj|j�|�tj|jd�dS)Nztest msg)r'r]rG�SMTPServerDisconnectedr�rr�r
r
r�testNotConnected�s
�z#NonConnectingTests.testNotConnectedcCs&|�ttjdd�|�ttjd�dS)Nr�Zboguszlocalhost:bogus)rGr�r'r]rr
r
r�testNonnumericPort�s
�
�z%NonConnectingTests.testNonnumericPortcCs:t���}|�|j�Wd�dS1swYdSr)r'r]r=r@r�r
r
r�testSockAttributeExists�s
"�z*NonConnectingTests.testSockAttributeExistsN)rYrZr[r
rrr
r
r
rr�s
rc@r)�DefaultArgumentsTestscCsDt�|_d|jd<t��|_tdd�|j_t�t�|j_|j_dS)N�Páolo <főo@bar.com>r�)��ZOK)Zreturn_value)	rr�r'r]r�r	r��has_extnr�rr
r
rr*�s


zDefaultArgumentsTests.setUpcCs`d}|j�|j�|j�|j�|�|jjjddd|�|�|jjjddd|�dS)N)�SMTPUTF8�
BODY=8BITMIMEr�r�r�r�r�r,r�Zcall_args_list)r�expected_mail_optionsr
r
rr��s��z%DefaultArgumentsTests.testSendMessagecCsNdg}d}|j�|jdd|�|�|dg�|�|jjjddd|�dS)N�STARTTLS)rrrrrr)r�mail_optionsrr
r
r�testSendMessageWithMailOptions�s�z4DefaultArgumentsTests.testSendMessageWithMailOptionsN)rYrZr[r*r�rr
r
r
rr
�s	r
c@r)�BadHELOServerTestscCs4tt_t�d�tj|_t��|_	|j	t_d|_
dS)Ns199 no hello for you!r&)rr'r(r1r~rr�r�r�r�r)rr
r
rr*�s


zBadHELOServerTests.setUpcCstt_|jt_dSr)r(r'r�r~rrr
r
rr+�szBadHELOServerTests.tearDowncC�|�tjtjt|jdd�dS�Nr�r)rGr'ZSMTPConnectErrorr]r3r)rr
r
r�testFailingHELO�
�z"BadHELOServerTests.testFailingHELON)rYrZr[r*r+rr
r
r
rr�src@s:eZdZddejddZdd�Zdd�Zd	d
�ZdS)�TooLongLineTestss250 OK�.rW�
cCs�t��|_tj|_t��|_|jt_t	�
�|_t�tj
tj�|_|j�d�t�|j�|_|j|j|jf}t	jt|d�|_|j��|j��|j��dS)N�rw)rrzr{r~rr�r�r�r�r�r�rr(�AF_INET�SOCK_STREAMr@�
settimeoutrZ	bind_portr)�respdatar�r$r�r�r�r�)rZservargsr
r
rr*s




zTooLongLineTests.setUpcCs:|j��|jt_t�|j�|`|��tj	|j
�dSr)rr�r�r~rrr�r�r�r�r{rr
r
rr+s
zTooLongLineTests.tearDowncCrr)rGr'�SMTPResponseExceptionr]r3r)rr
r
r�testLineTooLong rz TooLongLineTests.testLineTooLongN)	rYrZr[r'Z_MAXLINEr%r*r+r'r
r
r
rrs
rzJohn AzSally BzRuth C)�Mr.A@somewhere.com�Ms.B@xn--fo-fka.com�Mrs.C@somewhereesle.com)r(Zsomepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=r(r*r))zlist-1zlist-2c@seZdZdS)�ResponseExceptionN)rYrZr[r
r
r
rr+2sr+cs�eZdZdZdZdZdZdZdZdZ	dZ
dZ�fdd�Z�fdd�Z
dd	�Zd
d�Zdd
�Zd(dd�Zd(dd�Zd(dd�Zd(dd�Zdd�Zdd�Zdd�Z�fdd�Z�fdd�Z�fd d!�Z�fd"d#�Z�fd$d%�Zd&d'�Z�ZS))�SimSMTPChannelNr�ccs0d�dd�|D��|_tt|�j|i|��dS)N�cSsg|]}d�|��qS)z	250-{0}
)r�)�.0�xr
r
r�
<listcomp>Asz+SimSMTPChannel.__init__.<locals>.<listcomp>)�join�_extrafeaturesrcr,�__init__)rZextra_featuresry�kwrdr
rr4?s�zSimSMTPChannel.__init__c
s�|j|jkrE|j�|j�}tdt|�tjd�g|_z|�	|�WdSt
yD}z|j|_|�d|j
|jf�WYd}~dSd}~wwt���dS)NzData:)�file�%s %s)�
smtp_state�AUTHZ_emptystringr2Zreceived_lines�print�reprr�r��auth_objectr+�COMMAND�push�	smtp_code�
smtp_errorrc�found_terminator)r�liner"rdr
rrAEs� ��zSimSMTPChannel.found_terminatorcCs�|js
|�d�dS|jrd|jvr|�d�dS|jdur%|�d�dS|��}t|�dvr6|�d�dSd|d���d	d
�}zt	||�|_
Wnty\|�d�|��YdSw|j
|_|�
t|�dkrp|d
�dSd�dS)Nz503 Error: send EHLO firstr9z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)rrWz/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr�-�_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}rWr)�
seen_greetingr>�
extended_smtpr3�authenticated_user�split�len�lower�replace�getattrr<�AttributeErrorr�r9r8)r�argryZauth_object_namer
r
r�	smtp_AUTHSs4


�
��(zSimSMTPChannel.smtp_AUTHcCs,|r||_|�d�n|�d�|j|_dS)Nz235 Authentication Succeededz&535 Authentication credentials invalid)rGr>r=r8)r�userZvalidr
r
r�_authenticatedls

zSimSMTPChannel._authenticatedcCst�|�d���d�S)Nr��utf-8)�base64Zdecodebytes�encoder�)r�stringr
r
r�_decode_base64tszSimSMTPChannel._decode_base64c
Cs�|dur|�d�dS|�|�}z|�d��^}}}Wnty7}z|�d�||��WYd}~dSd}~ww|�||tdk�dS)Nz334 ��=535 Splitting response {!r} into user and password failed: {}r)r>rVrHrHr�rQ�sim_auth)rrN�logpassrDrP�passwordr"r
r
r�_auth_plainws
���zSimSMTPChannel._auth_plaincCsb|dur|�d�dSt|d�s|�|�|_|�d�dS|�|�}|�|j|tdk�|`dS)Nz334 VXNlcm5hbWU6�_auth_login_userz334 UGFzc3dvcmQ6r)r>rgrVr]rQrY)rrNr[r
r
r�_auth_login�s

zSimSMTPChannel._auth_logincCs|�d�dS)Nz334 QnVHZ1liVWdHeQ==)r>�rrNr
r
r�_auth_buggy�szSimSMTPChannel._auth_buggyc
Cs�|dur|�d�t��dS|�|�}z|��\}}Wnty7}z|�d�||��WYd}~dSd}~wwt�td�	d�|�t��	d�d��
�}|�|||k�dS)Nz334 {}rXFrr��md5)r>r��sim_cram_md5_challengerVrHrH�hmacZHMACrYrT�	hexdigestrQ)rrNrZrPZhashed_passr"Zvalid_hashed_passr
r
r�_auth_cram_md5�s(
�����zSimSMTPChannel._auth_cram_md5cCs,d}||jd}|�|�||_d|_dS)NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)r3r>rErF)rrN�respr
r
r�	smtp_EHLO�s


zSimSMTPChannel.smtp_EHLOcCs:|tvr|�dt|t�|�f�dS|�d|�dS)N�	250 %s %sz550 No such user: %s)�	sim_usersr>r'�	quoteaddrr_r
r
r�	smtp_VRFY�s zSimSMTPChannel.smtp_VRFYcCs�|��}|tvr;t|}t|�D](\}}t�|�}|t|�dkr-|�dt||f�q|�dt||f�qdS|�d�dS)Nrz	250-%s %srhz550 No access for you!)rJ�	sim_lists�	enumerater'rjrIr>ri)rrNZ	list_nameZ	user_listrZ
user_emailZquoted_addrr
r
r�	smtp_EXPN�s
�zSimSMTPChannel.smtp_EXPNcs6|jdurtt|��|�dS|�|j�|��dSr)�
quit_responsercr,�	smtp_QUITr>�close_when_doner_rdr
rrp�s
zSimSMTPChannel.smtp_QUITcs<|jdur
t��|�dS|�|j�|jr|��dSdSr)�
mail_responserc�	smtp_MAILr>�
disconnectrqr_rdr
rrs�s
�zSimSMTPChannel.smtp_MAILcsB|jdur
t��|�dS|jd7_|�|j|jd�dS�Nr)�
rcpt_responserc�	smtp_RCPT�
rcpt_countr>r_rdr
rrw�s

zSimSMTPChannel.smtp_RCPTcs|jd7_t��|�dSru)�
rset_countrc�	smtp_RSETr_rdr
rrz�szSimSMTPChannel.smtp_RSETcs*|jdur
t��|�dS|�|j�dSr)�
data_responserc�	smtp_DATAr>r_rdr
rr|�s
zSimSMTPChannel.smtp_DATAcC��rr
rr
r
r�handle_error��zSimSMTPChannel.handle_errorr)rYrZr[rorrrvr{rxryrtr9rGr4rArOrQrVr\r^r`rergrkrnrprsrwrzr|r~rhr
r
rdrr,3s8




r,c@s8eZdZeZdd�Zdd�Zdd�Zdd�Zd	d
�Z	dS)�
SimSMTPServercOs*g|_i|_tjj|g|�Ri|��dSr)�_extra_features�
_addressesr��
SMTPServerr4�rryr5r
r
rr4�szSimSMTPServer.__init__cCs|j|j||||jd�|_dS)Nru)�
channel_classr��_decode_data�_SMTPchannel�rrrr
r
r�handle_accepted�s
�zSimSMTPServer.handle_acceptedcCs||jd<||jd<dS)N�from�tos)r�)r�peer�mailfrom�rcpttos�datar
r
r�process_message�s
zSimSMTPServer.process_messagecCs|j�|�dSr)r��append)rZfeaturer
r
r�add_feature�szSimSMTPServer.add_featurecCr}rr
rr
r
rr~rzSimSMTPServer.handle_errorN)
rYrZr[r,r�r4r�r�r�r~r
r
r
rr��sr�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
ejddd�dd��Zejddd�dd��Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6S)7�SMTPSimTestscC�t��|_tj|_tjt_t��|_	t��|_
ttdfddd�|_
|j
j��d|_|j
|j	|j
f}tjt|d�|_|j��|j	��|j	��dS�NrrsTrurrw)rrzr{r(r|r}rr�r�rorpr�r3rr�r)r�rqr�r�r�r�r�r
r
rr*s




zSMTPSimTests.setUpcC�D|jt_|j��|j��t�|j	�|`	|�
�tj|j�dSr�
r}r(r|rprror�rr�r�r�r�r{rr
r
rr+�

zSMTPSimTests.tearDowncCr�r�r�r�r
r
rr�%r�zSMTPSimTests.testBasiccCs�tjt|jdtjd�}|�|ji�dddddd�}|��|�|j|�|D]
}|�	|�
|��q'|�|�
d��|��dS)Nr�r�r.Z20000000)�expn�sizeZstarttlsZ	deliverbyr�zunsupported-feature)
r'r]r3r)rr�r,�esmtp_featuresr��
assertTruer�assertFalser�)rr�Zexpected_features�kr
r
r�testEHLO+s ��zSMTPSimTests.testEHLOcCs�tjt|jdtjd�}t��D]\}}dtd|t�	|�fd�f}|�
|�|�|�qd}dd|�d�f}|�
|�|�|�|�
�dS)	Nr�r�r�r7r�r��&zNo such user: %s)r'r]r3r)rr�ri�items�bytesrjr,r�rTr�)rr�Z	addr_spec�name�expected_known�u�expected_unknownr
r
rr�As���zSMTPSimTests.testVRFYc		Cs�tjt|jdtjd�}t��D],\}}g}|D]}|�dt	|t�
|�f�qdtd�|�d�f}|�
|�|�|�qd}d}|�
|�|�|�|��dS)	Nr�r�r7r��
r�zPSU-Members-List)r�sNo access for you!)r'r]r3r)rr�rlr�r�rirjr�r2r,r�r�)	rr�Zlistname�membersZusersr�r�r�r�r
r
r�testEXPNPs�zSMTPSimTests.testEXPNcC�N|j�d�tjt|jdtjd�}|�t	dt	d�}|�
|d�|��dS)N�
AUTH PLAINr�r�rr���sAuthentication Succeeded�rr�r'r]r3r)rr��loginrYr,r�rr�rfr
r
r�testAUTH_PLAIN`��zSMTPSimTests.testAUTH_PLAINcCr�)N�
AUTH LOGINr�r�rrr�r�r�r
r
r�testAUTH_LOGINhr�zSMTPSimTests.testAUTH_LOGINcC�||j�d�tjt|jdtjd��#}t\|_	|_
|�d�|jd|j
dd�}|�|d�Wd�dS1s7wYdS)	Nr�r�r��test_auth_login�LOGINT�Zinitial_response_okr��rr�r'r]r3r)rr�rYrPr[r��authZ
auth_loginr,r�r
r
r�"testAUTH_LOGIN_initial_response_okp��
"�z/SMTPSimTests.testAUTH_LOGIN_initial_response_okcCr�)	Nr�r�r�r�r�Fr�r�r�r�r
r
r�%testAUTH_LOGIN_initial_response_notokyr�z2SMTPSimTests.testAUTH_LOGIN_initial_response_notokcs��j�d�d�fdd�	}tjt�jdtjd�}z:t\|_	|_
|�d�d}��tj
|��}|jd|d	d
�Wd�n1s@wYW|��dSW|��dS|��w)Nz
AUTH BUGGYcs��d|�dS)Ns
BuGgYbUgGyrW)r,)Z	challengerr
r�
auth_buggy�sz/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggyr�r�Ztest_auth_buggyz&^Server AUTH mechanism infinite loop.*ZBUGGYFr�r)rr�r'r]r3r)rr�rYrPr[r�ZassertRaisesRegexZ
SMTPExceptionr�r)rr�r��expect�cmr
rr�testAUTH_BUGGY�s �
��zSMTPSimTests.testAUTH_BUGGYraT)ZopensslcCr�)Nz
AUTH CRAM-MD5r�r�rrr�r�r�r
r
r�testAUTH_CRAM_MD5�s�zSMTPSimTests.testAUTH_CRAM_MD5cCr�)NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r�r�rrr�r�r�r
r
r�testAUTH_multiple�s�zSMTPSimTests.testAUTH_multiplec	Cs�ddh}zt��Wn	tyYnw|�d�|D]}|j�d�|��q|D]P}|j|d��@tj	t
|jdtj
d�}|�d�td	td
|_|_d|���dd
�}|�|t||��}|�|d�|��Wd�n1stwYq)dS)NZPLAINr�zCRAM-MD5zAUTH {})�	mechanismr�r�ZfoorrZauth_rCrDr�)�hashlibrarH�addrr�r�ZsubTestr'r]r3r)rr�r�rYrPr[rJrKr�rLr,r)rZ	supportedr�r��methodrfr
r
r�test_auth_function�s0�

�

���zSMTPSimTests.test_auth_functioncCs�tjt|jdtjd�}|��\}}|�|d�|�d|j	�|�
�|�d|j	�|�t|j�|�d|j	�|�
�|�d|j	�|�
�dS)Nr�r�r�r�)r'r]r3r)rr�r�r,r�r�r�r�rNZehlo_or_helo_if_needed�rr��code�messager
r
r�test_quit_resets_greeting�s
�z&SMTPSimTests.test_quit_resets_greetingcCs�t�t|j��}|��\}}|�|d�Wd�n1swY|�tj|jd�t�t|j��}|�	�Wd�n1sBwY|�tj|jd�dS)Nr�sfoo)
r'r]r3r)r�r,rGr	rrr�r
r
r�test_with_statement�s�
�z SMTPSimTests.test_with_statementc	Cs�|�tj��(}t�t|j��}|��d|jj_	Wd�n1s"wYWd�n1s1wY|�
|jjd�|�
|jj
d�dS)Nz421 QUIT FAILED�sQUIT FAILED)rGr'r&r]r3r)r�rr�ror,r�r?r@)r�errorr�r
r
r� test_with_statement_QUIT_failure�s���z-SMTPSimTests.test_with_statement_QUIT_failurecCs|tjt|jdtjd�}|��d|jj_	d|jj_
|�tj��|�
ddd�Wd�n1s1wY|�|j�dS)Nr�r�z451 Requested action abortedTr�r��test message)r'r]r3r)rr�r�rr�rrrtrG�SMTPSenderRefusedr�r=r@r�r
r
r�test__rest_from_mail_cmd�s�

�z%SMTPSimTests.test__rest_from_mail_cmdcCs�tjt|jdtjd�}|��d|jj_	|�
tj��|�ddd�Wd�n1s,wY|�
|j�|�|jjjd�dS)Nr�r�z421 closing connectionr�r�r�r)r'r]r3r)rr�r�rr�rrrGr�r�r=r@r,ryr�r
r
r�test_421_from_mail_cmd�s�
�z#SMTPSimTests.test_421_from_mail_cmdcCs�tjt|jdtjd�}|��ddg|jj_	|�
tj��}|�dgd�d�Wd�n1s0wY|�
|j�|�|jjjd�|�|jjdd	d
i�dS)Nr�r�z250 accepted�421 closingr�)r��FrankZGeorger�rr�)r�sclosing)r'r]r3r)rr�r�rr�rvrGZSMTPRecipientsRefusedr�r=r@r,ry�assertDictEqualr�ry)rr�r r
r
r�test_421_from_rcpt_cmd�s��z#SMTPSimTests.test_421_from_rcpt_cmdcCs�Gdd�dt�}||j_tjt|jdtjd�}|�	�|�
tj��|�ddgd�Wd�n1s4wY|�
|j�|�|jjjd�dS)	NcseZdZ�fdd�Z�ZS)z=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannelcs(|j|jkr
|�d�dSt���dS)Nr�)r8ZDATAr>rcrArrdr
rrAszNSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator)rYrZr[rArhr
r
rdr�MySimSMTPChannelsr�r�r�zJohn@foo.orgz
Sally@foo.orgr�r)r,rr�r'r]r3r)rr�r�rGZ
SMTPDataErrorr�r=r@r,r�rx)rr�r�r
r
r�test_421_from_data_cmds��z#SMTPSimTests.test_421_from_data_cmdcCs�tjt|jdtjd�}|�|j�|��|�	|j
�|�|�d��|j
tj|jdddddgd	�|j
tj|jdddgd
�dS)Nr�r��smtputf8r�r�r.rr�r��options)r'r]r3r)rr�r�rr�r��
does_esmtpr�rrG�SMTPNotSupportedErrorr�r�r�r
r
r�4test_smtputf8_NotSupportedError_if_no_server_supports"��
�zASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_supportcCsJtjt|jdtjd�}|�|j�|�t	|j
ddd�|�t	|jd�dS)Nr�r�ZAliceuBöbr.uÄlice)r'r]r3r)rr�r�rrG�UnicodeEncodeErrorr�r�r�r
r
r�"test_send_unicode_without_SMTPUTF8#s�z/SMTPSimTests.test_send_unicode_without_SMTPUTF8cCs|t�}d|d<d|d<d|d<tjt|jdtjd�}|�|j�|�	tj
��|�|�Wd�dS1s7wYdS)	Nrr�r�r��Nudge nudge, wink, wink ὠ9�Subjectr�r�)rr'r]r3r)rr�r�rrGr�r�)rr�r�r
r
r�9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8+s�"�zFSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8cCs�tjt|jdtjd�}|�|j�t�}t	j
�d�|d<t	j
�d�|d<|�|�
|�i�|�|jjdd�|�|jjd	d
g�dS)Nr�r�)uMichaël�michael@example.comr�)uRené�rene@example.comr�r�r�r�r�)r'r]r3r)rr�r�rrr�ZutilsZ
formataddrr�r�r,rr�)rr�r�r
r
r�1test_name_field_not_included_in_envelop_addresses9s�z>SMTPSimTests.test_name_field_not_included_in_envelop_addressesN)rYrZr[r*r+r�r�r�r�r�r�r�r�r�rZrequires_hashdigestr�r�r�r�r�r�r�r�r�r�r�r�r�r�r
r
r
rr�s8		

		
r�c@s*eZdZdd�Zdd�Z		ddd�ZdS)	�SimSMTPUTF8ServercOs(ddg|_tjj|g|�Ri|��dS)NrZ8BITMIME)r�r�r�r4r�r
r
rr4Ks
zSimSMTPUTF8Server.__init__cCs"|j|j||||j|jd�|_dS)N�rv�enable_SMTPUTF8)r�r�r�r�r�r�r
r
rr�Rs

�z!SimSMTPUTF8Server.handle_acceptedNcCs(||_||_||_||_||_||_dSr)Z	last_peer�
last_mailfrom�last_rcpttos�last_message�last_mail_options�last_rcpt_options)rr�r�r�r�rZrcpt_optionsr
r
rr�Ys
z!SimSMTPUTF8Server.process_message)NN)rYrZr[r4r�r�r
r
r
rr�Is�r�c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�SMTPUTF8SimTestsNcCs�t��|_tj|_tjt_t��|_	t��|_
ttdfdddd�|_
|j
j��d|_|j
|j	|j
f}tjt|d�|_|j��|j	��|j	��dS)NrrsFTr�rrw)rrzr{r(r|r}rr�r�rorpr�r3rr�r)r�rqr�r�r�r�r�r
r
rr*gs



�

zSMTPUTF8SimTests.setUpcCr�rr�rr
r
rr+{r�zSMTPUTF8SimTests.tearDowncCsJtjt|jdtjd�}|�|j�|��|�	|j
�|�	|�d��dS)Nr�r�r�)r'r]r3r)rr�r�rr�r�r�rr�r
r
r�$test_test_server_supports_extensions�s�z5SMTPUTF8SimTests.test_test_server_supports_extensionscCs�d�d�}tjt|jdtjd�}|�|j�|j	dd|ddgd	�|�
|jjd�|�
|jj
dg�|�
|jj|�|�d|jj�|�d|jj�|�
|jjg�dS)
N�$¡a test message containing unicode!rRr�r�uJőhnuSállyrrr�)rTr'r]r3r)rr�r�rr�r,rr�r�r�r�r�r�rr
r
r�,test_send_unicode_with_SMTPUTF8_via_sendmail�s
�
�z=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmailcCs�d�d�}tjt|jdtjd�}|�|j�|�	�|�
|jdddgd�d	�|�
|�d
�d	�|�
|�
|�d	�|�
|jjd�|�
|jjd
g�|�
|jj|�|�d|jj�|�d|jj�|�
|jjg�dS)Nr�rRr�r�uJőrrr�r�uJános)rTr'r]r3r)rr�r�rr�r,r�Zrcptr�rr�r�r�r�r�r�rr
r
r�1test_send_unicode_with_SMTPUTF8_via_low_level_API�s&
��zBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_APIcCs�t�}d|d<d|d<d|d<|�d�t�d�}tjt|jd	tj	d
�}|�
|j�|�|�
|�i�|�|jjd�|�|jjdg�|�|jj��|�|�d|jj�|�d
|jj�|�|jjg�dS)Nrr�r�r�r�r�u1oh 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.comrr)rZset_content�textwrap�dedentr'r]r3r)rr�r�rr,r�rr�r�r�r�r�r�r�)rr�r-r�r
r
r�2test_send_message_uses_smtputf8_if_addrs_non_ascii�s$


�zCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii)
rYrZr[rr*r+r�r�r�r�r
r
r
rr�cs	r�spsudoesnotexistr.)Zeolc@seZdZdd�ZdS)�!SimSMTPAUTHInitialResponseChannelcCsL|��}|d��dkrt|�dkr|dtkr|�d�dS|�d�dS)Nr�plainrWrz235 Okz571 Bad authentication)rHrJrI�EXPECTED_RESPONSEr>)rrNryr
r
rrO�s
z+SimSMTPAUTHInitialResponseChannel.smtp_AUTHN)rYrZr[rOr
r
r
rr��sr�c@seZdZeZdS)� SimSMTPAUTHInitialResponseServerN)rYrZr[r�r�r
r
r
rr��sr�c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�SMTPAUTHInitialResponseSimTestscCr�r�)rrzr{r(r|r}rr�r�rorpr�r3rr�r)r�rqr�r�r�r�r�r
r
rr*�s



�

z%SMTPAUTHInitialResponseSimTests.setUpcCr�rr�rr
r
rr+�r�z(SMTPAUTHInitialResponseSimTests.tearDowncCs:|j�d�tjt|jdtjd�}|�dd�|�	�dS)Nr�r�r��psu�doesnotexist)
rr�r'r]r3r)rr�r�rr�r
r
r�%testAUTH_PLAIN_initial_response_logins�zESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_logincCsX|j�d�tjt|jdtjd�}d|_d|_	|�
d|j�\}}|��|�
|d�dS)Nr�r�r�r�rr�r�)rr�r'r]r3r)rr�rPr[r�Z
auth_plainrr,)rr�r��responser
r
r�$testAUTH_PLAIN_initial_response_auth
s�zDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_authN)rYrZr[r*r+rrr
r
r
rr��s
r��__main__)HrSZemail.mime.textr�Z
email.messagerZemail.base64mimerZ
encode_base64Zemail.utilsr�rcr(r'r�rOr~rmrr�r�r�rf�testrrZtest.supportrrrZ
unittest.mockr	�warnings�catch_warnings�simplefilter�DeprecationWarningrkr�r3�platformrZSMTPChannelr$r%ZTestCaser\r^rqr�r�rrrr
rrrirYrbrl�	Exceptionr+r,r�r�r�r�r�r�r�r�r�rY�mainr
r
r
r�<module>s�

�
cX ��9Eo
1�
© 2025 GrazzMean