
    =Ogy                     D   	 d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZ g dZdZ eeed           d dlZd dlZe j        d          ZdZ G d	 d
          Z e            adZdZdZd$dZ G d dej                  Z G d dej                  Z G d de          Z G d de          Z  G d d          Z!d Z"edk    rM e"            Z#e#j$        Z$de$v rJe$%                    d          Z& e'e$de&          e(             e)            dg          Z*e$e&dz   d         Z$nd dl+Z* e,e*e$          Z- e-e#j.        e#j/        fe#j0        e#j1        fe#j2        e#j3                  Z4e#j5        r	 d dl6Z6n-# e7$ r%  e8de j9                     e j:        d           Y nw xY w e6j;        d!          d"         Z<	  ej5        e<           n-# e=$ r%  e8d#e j9                     e j:        d           Y nw xY w	  ej>                     dS # e?$ r Y dS w xY wdS )%    N)_deprecatedwarn)get_addr_specget_angle_addr)SMTPChannel
SMTPServerDebuggingServer	PureProxyzThe {name} module is deprecated and unmaintained and will be removed in Python {remove}.  Please see aiosmtpd (https://aiosmtpd.readthedocs.io/) for the recommended replacement.)      )removezPython SMTP proxy version 0.3c                       e Zd Zd Zd ZdS )Devnullc                     d S N selfmsgs     /usr/lib64/python3.11/smtpd.pywritezDevnull.writei             c                     d S r   r   r   s    r   flushzDevnull.flushj   r   r   N)__name__
__module____qualname__r   r   r   r   r   r   r   h   s"        r   r   
z, i    c                     t          t          t                      z  t          j                   |rt          |t          j                   t          j        |            d S )Nfile)print__doc__globalssysstderrexit)coder   s     r   usager,   s   sN    	'GII
CJ////
 $c
####HTNNNNNr   c                   *   e Zd ZdZdZdZ ej        efd          Ze	d             Z
edddfdZd	 Zd
 Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        d             Ze	d             Zej        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)d0 Z*d1 Z+dS )2r   r      i   c                     | S r   r   )xs    r   <lambda>zSMTPChannel.<lambda>   s    q r   c                 ~    	 t          | j                                                  S # t          $ r
 | j        cY S w xY wr   )maxcommand_size_limitsvalues
ValueErrorcommand_size_limitr   s    r   max_command_size_limitz"SMTPChannel.max_command_size_limit   sN    	+t/6688999 	+ 	+ 	+****	+s   %( <<NFc                 Z   t           j                            | ||           || _        || _        || _        || _        || _        || _        |r|rt          d          |r"d| _
        d| _        d| _        t          | _        n)d| _
        d| _        t          d          | _        d	| _        |                                  d| _        d
| _        | j                                         t+          j                    | _        	 |                                | _        nB# t4          $ r5}|                                  |j        t8          j        k    r Y d }~d S d }~ww xY wt=          dt?          | j                  t@                     | !                    d| j        dtD                     d S )NmapFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer!   
.r      
   .   
FzPeer:r#   z220  )#asynchat
async_chat__init__smtp_serverconnaddrdata_size_limitenable_SMTPUTF8_decode_datar6   _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_stateseen_greetingextended_smtpr4   clearsocketgetfqdnfqdngetpeernamepeerOSErrorcloseerrnoENOTCONNr%   reprDEBUGSTREAMpush__version__)	r   serverrG   rH   rI   r;   rJ   decode_dataerrs	            r   rE   zSMTPChannel.__init__   s   $$T4S$999!		..' 	A{ 	A @ A A A 		" "D"DMDL#DMM #D#DMt99DL!DM" &&(((N$$		((**DII 	 	 	 JJLLLyEN**FFFFF	 	gtDI[9999			KK899999s   D 
E%*EEc                     	 | j         | _        d | _        g | _        d| _        d| _        |                     d           d S )NFr   r?   )COMMAND
smtp_statemailfromrcpttosrequire_SMTPUTF8	num_bytesset_terminatorr   s    r   _set_post_data_statez SMTPChannel._set_post_data_state   sE    =, %G$$$$$r   c                 L    	 |                                   d| _        g | _        d S Nr!   )rn   received_datareceived_linesr   s    r   rR   zSMTPChannel._set_rset_state   s-    <!!### r   c                 <    t          dt          d           | j        S )NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' instead   r   DeprecationWarningrF   r   s    r   __serverzSMTPChannel.__server   s*     ();Q	@ 	@ 	@r   c                 @    t          dt          d           || _        d S )NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrt   ru   r   values     r   rw   zSMTPChannel.__server   s/     ();Q	@ 	@ 	@ r   c                 <    t          dt          d           | j        S )NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrt   r   rv   rr   r   s    r   __linezSMTPChannel.__line   s*     +,>	C 	C 	C""r   c                 @    t          dt          d           || _        d S )NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrt   r|   ry   s     r   r}   zSMTPChannel.__line   s/     +,>	C 	C 	C#r   c                 <    t          dt          d           | j        S )NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrt   r   rv   rh   r   s    r   __statezSMTPChannel.__state   s&     '(:A	? 	? 	?r   c                 @    t          dt          d           || _        d S )NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadrt   r   ry   s     r   r   zSMTPChannel.__state   s)     '(:A	? 	? 	?r   c                 <    t          dt          d           | j        S )NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadrt   r   rv   rS   r   s    r   
__greetingzSMTPChannel.__greeting   *     *+=q	B 	B 	B!!r   c                 @    t          dt          d           || _        d S )NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrt   r   ry   s     r   r   zSMTPChannel.__greeting   /     *+=q	B 	B 	B"r   c                 <    t          dt          d           | j        S )NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrt   r   rv   ri   r   s    r   
__mailfromzSMTPChannel.__mailfrom   s&     %&8!	= 	= 	=}r   c                 @    t          dt          d           || _        d S )NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrt   r   ry   s     r   r   zSMTPChannel.__mailfrom   s)     %&8!	= 	= 	=r   c                 <    t          dt          d           | j        S )NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadrt   r   rv   rj   r   s    r   	__rcpttoszSMTPChannel.__rcpttos   s&     $%7	< 	< 	<|r   c                 @    t          dt          d           || _        d S )NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrt   r   ry   s     r   r   zSMTPChannel.__rcpttos   s)     $%7	< 	< 	<r   c                 <    t          dt          d           | j        S )NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadrt   r   rv   rq   r   s    r   __datazSMTPChannel.__data  r   r   c                 @    t          dt          d           || _        d S )NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrt   r   ry   s     r   r   zSMTPChannel.__data  r   r   c                 <    t          dt          d           | j        S )NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadrt   r   rv   rX   r   s    r   __fqdnzSMTPChannel.__fqdn  &     !"4a	9 	9 	9yr   c                 @    t          dt          d           || _        d S )NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrt   r   ry   s     r   r   zSMTPChannel.__fqdn  )     !"4a	9 	9 	9			r   c                 <    t          dt          d           | j        S )NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrt   r   rv   rZ   r   s    r   __peerzSMTPChannel.__peer  r   r   c                 @    t          dt          d           || _        d S )NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrt   r   ry   s     r   r   zSMTPChannel.__peer  r   r   c                 <    t          dt          d           | j        S )NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadrt   r   rv   rG   r   s    r   __connzSMTPChannel.__conn#  r   r   c                 @    t          dt          d           || _        d S )NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrt   r   ry   s     r   r   zSMTPChannel.__conn(  r   r   c                 <    t          dt          d           | j        S )NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadrt   r   rv   rH   r   s    r   __addrzSMTPChannel.__addr.  r   r   c                 @    t          dt          d           || _        d S )NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrt   r   ry   s     r   r   zSMTPChannel.__addr3  r   r   c                 z    t           j                            | t          |dz   | j        rdnd                     d S )Nr=   utf-8ascii)rC   rD   ra   bytesrk   r   s     r   ra   zSMTPChannel.push:  sQ      u&LT%:G''(I (I 	J 	J 	J 	J 	Jr   c                 Z   d }| j         | j        k    r| j        }n| j         | j        k    r| j        }|r| j        |k    rd S |r| xj        t          |          z  c_        | j        r*| j        	                    t          |d                     d S | j        	                    |           d S )Nr   )rh   rg   r8   DATArI   rl   lenrK   rr   appendstr)r   datalimits      r   collect_incoming_dataz!SMTPChannel.collect_incoming_data?  s    ?dl**/EE_	))(E 	(T^e++F 	(NNc$ii'NN 	-&&s4'9'9:::::&&t,,,,,r   c                    | j                             | j                  }t          dt	          |          t
                     g | _        | j        | j        k    r!| j        dc}| _        |s| 	                    d           d S | j
        st          |d          }|                    d          }|dk     r|                                }d }n;|d |                                         }||dz   d                                          }| j        r| j        |         n| j        }||k    r| 	                    d           d S t%          | d	|z   d           }|s| 	                    d
|z             d S  ||           d S | j        | j        k    r| 	                    d           d| _        d S | j        r.| j        | j        k    r| 	                    d           d| _        d S g }|                    | j                  D ]H}	|	r/|	d         | j        k    r|                    |	dd                     3|                    |	           I| j                            |          | _        | j        | j        | j        | j        f}
i }| j
        s| j        | j        d} | j         j!        |
i |}| "                                 |s| 	                    d           d S | 	                    |           d S )NzData:r#   r   z500 Error: bad syntaxr   rB   r.   z500 Error: line too longsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail data)mail_optionsrcpt_options250 OK)#rL   joinrr   r%   r_   r`   rh   rg   rl   ra   rK   r   findupperstriprT   r4   r7   getattrr   rI   splitrM   rN   r   rP   rq   rZ   ri   rj   r   r   rF   process_messagern   )r   lineszicommandargmax_szmethodr   textargskwargsstatuss                r   found_terminatorzSMTPChannel.found_terminatorO  s    %%d&9::gtDzz4444 ?dl**!%B 		1222$ *4))		#A1uu**,,rr(..**1Q344j&&((-Kd.w77373J F{{		4555T7W#4d;;F 		BWLMMMF3KKKF$)++		2333!"# 9M(M(M		9:::!" D

4=11 & & &DGt|33KKQRR))))KK%%%%!%!3!3D!9!9DIt}dlD<NODF$ $($5$($5  6T%5tFvFFF%%''' "		(#####		&!!!!!r   c                     |s|                      d           d S | j        r|                      d           d S |                                  || _        |                      d| j        z             d S )Nz501 Syntax: HELO hostname503 Duplicate HELO/EHLOz250 %s)ra   rS   rR   rX   r   r   s     r   	smtp_HELOzSMTPChannel.smtp_HELO  s~     	II1222F 	II/000F 		(TY&'''''r   c                 (   |s|                      d           d S | j        r|                      d           d S |                                  || _        d| _        |                      d| j        z             | j        r2|                      d| j        z             | j        dxx         dz  cc<   | j        s|                      d           | j        r*|                      d	           | j        dxx         d
z  cc<   |                      d           d S )Nz501 Syntax: EHLO hostnamer   Tz250-%sz250-SIZE %sMAIL   z250-8BITMIMEz250-SMTPUTF8
   z250 HELP)	ra   rS   rR   rT   rX   rI   r4   rK   rJ   r   s     r   	smtp_EHLOzSMTPChannel.smtp_EHLO  s5    	II1222F 	II/000F !		(TY&''' 	3IImd&::;;;$V,,,2,,,  	&IIn%%% 	3IIn%%%$V,,,2,,,		*r   c                 b    |r|                      d           d S |                      d           d S )Nz501 Syntax: NOOPr   ra   r   s     r   	smtp_NOOPzSMTPChannel.smtp_NOOP  s;     	 II()))))IIhr   c                 X    |                      d           |                                  d S )Nz221 Bye)ra   close_when_doner   s     r   	smtp_QUITzSMTPChannel.smtp_QUIT  s,    		)r   c                     t          |          }|d |                                         |k    r||d                                          S dS rp   )r   r   r   )r   keywordr   keylens       r   _strip_command_keywordz"SMTPChannel._strip_command_keyword  sK    Www<7**vww<%%'''rr   c                     |sdS |                                                     d          rt          |          \  }}nt          |          \  }}|s||fS |j        |fS )N)r!   r!   <)lstrip
startswithr   r   	addr_spec)r   r   addressrests       r   _getaddrzSMTPChannel._getaddr  sq     	6::<<""3'' 	/*3//MGTT)#..MGT 	!D=  $&&r   c                     i }|D ]?}|                     d          \  }}}|                                r|r|s d S |r|nd||<   @|S )N=T)	partitionisalnum)r   paramsresultparameqrz   s         r   
_getparamszSMTPChannel._getparams  sn      	2 	2E$s33E2u==?? b  tt%'1EETF5MMr   c                    |rNd}|                                 }|dk    r|                     d           d S |dk    r|                     d           d S |dk    r%d}| j        r||z  }|                     |           d S |dk    r%d	}| j        r||z  }|                     |           d S |d
k    r|                     d           d S |dk    r|                     d           d S |dk    r|                     d           d S |dk    r|                     d           d S |dk    r|                     d           d S |                     d           d S |                     d           d S )N [SP <mail-parameters>]EHLOz250 Syntax: EHLO hostnameHELOz250 Syntax: HELO hostnamer   z 250 Syntax: MAIL FROM: <address>RCPTz250 Syntax: RCPT TO: <address>r   z250 Syntax: DATARSETz250 Syntax: RSETNOOPz250 Syntax: NOOPQUITz250 Syntax: QUITVRFYz250 Syntax: VRFY <address>zD501 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFYzD250 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r   ra   rT   )r   r   extendedlc_argr   s        r   	smtp_HELPzSMTPChannel.smtp_HELP  s     	-0HYY[[F		5666666!!		5666666!!8% $8OC		#6!!6% $8OC		#6!!		,-----6!!		,-----6!!		,-----6!!		,-----6!!		677777		 5 6 6 6 6 6 II , - - - - -r   c                     |rK|                      |          \  }}|r|                     d           d S |                     d|z             d S |                     d           d S )NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY <address>)r   ra   )r   r   r   r   s       r   	smtp_VRFYzSMTPChannel.smtp_VRFY  s     	4"mmC00OGV 9		 1 2 2 2 2 2 		1C788888II233333r   c                 V   | j         s|                     d           d S t          d|t                     d}| j        r|dz  }||                     |           d S |                     d|          }|                     |          \  }}|s|                     |           d S | j        s|r|                     |           d S | j        r|                     d           d S |                                	                                | _
        |                     | j
                  }||                     |           d S | j        s1|                    dd	          }|d
vr|                     d           d S | j        r=|                    dd          }|du rd| _        n|dur|                     d           d S |                    dd           }|ra|                                s|                     |           d S | j        r/t%          |          | j        k    r|                     d           d S t'          |                                          dk    r|                     d           d S || _        t          d| j        t                     |                     d           d S )N503 Error: send HELO firstz	===> MAILr#   z 501 Syntax: MAIL FROM: <address>r   zFROM:z503 Error: nested MAIL commandBODY7BIT)r   8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMESMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsSIZEz:552 Error: message size exceeds fixed maximum message sizer   z:555 MAIL FROM parameters not recognized or not implementedzsender:r   )rS   ra   r%   r`   rT   r   r   ri   r   r   r   r   rK   poprJ   rk   isdigitrI   intr   keys)r   r   	syntaxerrr   r   bodysmtputf8sizes           r   	smtp_MAILzSMTPChannel.smtp_MAIL  s   ! 	II2333Fk3[11116	 	322I;IIi   F))'377--,, 	IIi   F! 	f 	IIi   F= 	II6777F"LLNN0022!233>IIi   F  	::ff--D///		MNNN 	zz*e44H4(,%%&&		BCCCzz&$'' 	<<>> 		)$$$% #d))d6J*J*J		VWWWv{{}}!!IIRSSSFi[9999		(r   c                    | j         s|                     d           d S t          d|t                     | j        s|                     d           d S d}| j        r|dz  }||                     |           d S |                     d|          }|                     |          \  }}|s|                     |           d S | j        s|r|                     |           d S |                                	                                | _
        |                     | j
                  }||                     |           d S t          |                                          dk    r|                     d	           d S | j                            |           t          d
| j        t                     |                     d           d S )Nr   z	===> RCPTr#   z503 Error: need MAIL commandz501 Syntax: RCPT TO: <address>r   zTO:r   z8555 RCPT TO parameters not recognized or not implementedzrecips:r   )rS   ra   r%   r`   ri   rT   r   r   r   r   r   r   r   r  rj   r   )r   r   r  r   r   s        r   	smtp_RCPTzSMTPChannel.smtp_RCPT:  s   ! 	II2333Fk3[1111} 	II4555F4	 	322I;IIi   F))%55--,, 	IIi   F! 	f 	IIi   F"LLNN0022!233>IIi   Fv{{}}!!IIPQQQFG$$$iK8888		(r   c                     |r|                      d           d S |                                  |                      d           d S )Nz501 Syntax: RSETr   )ra   rR   r   s     r   	smtp_RSETzSMTPChannel.smtp_RSET]  sL     	II()))F		(r   c                    | j         s|                     d           d S | j        s|                     d           d S |r|                     d           d S | j        | _        |                     d           |                     d           d S )Nr   z503 Error: need RCPT commandz501 Syntax: DATAs   
.
z#354 End data with <CR><LF>.<CR><LF>)rS   ra   rj   r   rh   rm   r   s     r   	smtp_DATAzSMTPChannel.smtp_DATAd  s    ! 	II2333F| 	II4555F 	II()))F)L)))		788888r   c                 0    |                      d           d S )Nz502 EXPN not implementedr   r   s     r   	smtp_EXPNzSMTPChannel.smtp_EXPNs  s    		,-----r   ),r   r   r   rg   r   r7   collectionsdefaultdictr4   propertyr8   DATA_SIZE_DEFAULTrE   rn   rR   _SMTPChannel__serversetter_SMTPChannel__line_SMTPChannel__state_SMTPChannel__greeting_SMTPChannel__mailfrom_SMTPChannel__rcpttos_SMTPChannel__data_SMTPChannel__fqdn_SMTPChannel__peer_SMTPChannel__conn_SMTPChannel__addrra   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r   r   r   r   z   s       GD1+1;M2P2P2PQQ+ + X+ <M5e%: %: %: %:N% % %! ! !     X  _! ! _!
 # # X# ]$ $ ]$
   X ^    ^ 
 " " X" # # #
   X   
   X   
 " " X" ]# # ]#
   X ]  ]
   X ]  ]
   X ]  ]
   X ]  ]J J J
- - - ;" ;" ;"|
( 
( 
(  ,       
  	' 	' 	'	 	 	!- !- !-F	4 	4 	44 4 4l! ! !F  9 9 9. . . . .r   r   c                   .    e Zd ZeZedddfdZd Zd ZdS )r   NFc           	         || _         || _        || _        || _        || _        |r|rt          d          t          j                            | |           	 t          j
        |dt          j        i}|                     |d         d         |d         d                    |                                  |                     |           |                     d           t!          | j        j        dt'          j        t'          j                              d|d	|t*          
           d S #  |                                   xY w)Nr<   r:   typer   r.      z started at z
	Local addr: z
	Remote addr:r#   )
_localaddr_remoteaddrrI   rJ   rK   r6   asyncore
dispatcherrE   rV   getaddrinfoSOCK_STREAMcreate_socketset_reuse_addrbindlistenr%   	__class__r   timectimer`   r\   )r   	localaddr
remoteaddrrI   r;   rJ   rd   gai_resultss           r   rE   zSMTPServer.__init__{  sj    $%..' 	A{ 	A @ A A A$$Ts$333	: ,i F282DF FK{1~a0+a.2CDDD!!!IIi   KKNNN
 '''DIKK)@)@)@)@		::'-8: : : : : :		JJLLLs   BD0 0Ec           	          t          dt          |          z  t                     |                     | ||| j        | j        | j        | j                  }d S )NzIncoming connection from %sr#   )r%   r_   r`   channel_classrI   _maprJ   rK   )r   rG   rH   channels       r   handle_acceptedzSMTPServer.handle_accepted  sY    +d4jj8{KKKK$$T%)%)%)%9%)Y%)%9%)%68 8r   c                     	 t           r   )NotImplementedErrorr   rZ   ri   rj   r   r   s         r   r   zSMTPServer.process_message  s    	< "!r   )	r   r   r   r   r:  r  rE   r=  r   r   r   r   r   r   w  sW        M "3!&E: : : :88 8 8" " " " "r   r   c                       e Zd Zd Zd ZdS )r	   c                 P   d}|                                 }|D ]}|rU|sSd|d         z   }t          |t                    s"t          |                    d                    }t          |           d}t          |t                    st          |          }t          |           d S )Nr.   zX-Peer: r   r   )
splitlines
isinstancer   r_   encoder%   )r   rZ   r   	inheaderslinesr   
peerheaders          r   _print_message_contentz&DebuggingServer._print_message_content  s    	!! 	 	D  '$q'1
!$,, B!%j&7&7&@&@!A!AJj!!!	dC(( "Dzz$KKKK	 	r   c                 &   t          d           |rZ|                    d          rt          d|d         z             |                    d          rt          d|d         z             |                     ||           t          d           d S )Nz%---------- MESSAGE FOLLOWS ----------r   zmail options: %sr   zrcpt options: %s
z%------------ END MESSAGE ------------)r%   getrI  r@  s         r   r   zDebuggingServer.process_message  s    5666 	Ezz.)) C(6.+AABBBzz.)) E*VN-CCDDD##D$///566666r   N)r   r   r   rI  r   r   r   r   r	   r	     s2          "7 7 7 7 7r   r	   c                   *     e Zd Z fdZd Zd Z xZS )r
   c                 ~    d|v r|d         rt          d           t          t          |           j        |i | d S )NrJ   z$PureProxy does not support SMTPUTF8.)r6   superr
   rE   )r   r   r   r3  s      r   rE   zPureProxy.__init__  sP    &&62C+D&CDDD'i'888888r   c                    |                     d          }d}|D ]}|s n|dz  }|                    |d|d         z             t                              |          }|                     |||          }t          d|t                     d S )Nr    r   r.   z
X-Peer: %szwe got some refusals:r#   )r   insertrO   r   _deliverr%   r`   )	r   rZ   ri   rj   r   rG  r   r   refuseds	            r   r   zPureProxy.process_message  s    

4   	 	D FAAQtAw.///||E""--'488%w[AAAAAAr   c                 P   dd l }i }	 |                                }|                    | j        d         | j        d                    	 |                    |||          }|                                 n# |                                 w xY wn# |j        $ r'}t          dt                     |j	        }Y d }~nkd }~wt          |j        f$ rT}t          d|j        t                     t          |dd          }t          |dd	          }	|D ]	}
||	f||
<   
Y d }~nd }~ww xY w|S )
Nr   r.   zgot SMTPRecipientsRefusedr#   got	smtp_code
smtp_errorignore)smtplibSMTPconnectr*  sendmailquitSMTPRecipientsRefusedr%   r`   
recipientsr[   SMTPExceptionr3  r   )r   ri   rj   r   rY  rR  seerrcodeerrmsgrs              r   rQ  zPureProxy._deliver  sb   	/AIId&q)4+;A+>???**Xw==, 	# 	# 	#-K@@@@lGGGGGG./ 	/ 	/ 	/%;7777 ab11GQh77F / /%v.

/ / / / /	/ s=   A B 	A5  B 5BB 
D#B;;D#A
DD#)r   r   r   rE   r   rQ  __classcell__)r3  s   @r   r
   r
     sY        9 9 9 9 9
B B B      r   r
   c                       e Zd ZdZdZdZdZdS )OptionsTr
   NF)r   r   r   setuid	classname
size_limitrJ   r   r   r   rh  rh    s"        FIJOOOr   rh  c                     	 t          j         t          j        dd          dg d          \  } }n,# t           j        $ r}t	          d|           Y d }~nd }~ww xY wt                      }| D ]\  }}|dv rt	          d           |dv r)t          t                     t          j        d           F|dv rd|_	        R|d	v r||_
        ^|d
v rt          j        ao|dv rd|_        {|dv rQ	 t          |          }||_        #  t          d|z   t          j                   t          j        d           Y xY wt!          |          dk     rd}d}nmt!          |          dk     r|d         }d}nOt!          |          dk     r|d         }|d         }n+t	          ddt"                              |          z             |                    d          }	|	dk     rt	          dd|z             |d |	         |_        	 t          ||	dz   d                    |_        n## t,          $ r t	          dd|z             Y nw xY w|                    d          }	|	dk     rt	          dd|z             |d |	         |_        	 t          ||	dz   d                    |_        n## t,          $ r t	          dd|z             Y nw xY w|S )Nr.   z	nVhc:s:du)zclass=nosetuidversionhelpzsize=debugr
  )z-hz--helpr   )z-Vz	--version)z-nz
--nosetuidF)z-cz--class)z-dz--debug)z-uz
--smtputf8T)z-sz--sizezInvalid size: r#   zlocalhost:8025zlocalhost:25rt   r   zInvalid arguments: %s:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)getoptr(   argverrorr,   rh  r%   rb   r*   ri  rj  r)   r`   rJ   r  rk  r   
COMMASPACEr   r   	localhost	localportr6   
remotehost
remoteport)
optsr   rb  optionsoptr   int_size	localspec
remotespecr   s
             r   	parseargsr    sN   ]HQRRL+   
dd <   a iiG  S"""!HHHH'''+HQKKKK((("GNN%%% #G%%%*KK(((&*G##$$$s88%-""&,3:>>>> % 4yy1}}$	#

	TQG	#

	TQG	!W

a(:??4+@+@@AAA 	sA1uua%	1222!"1"G3	!A#$$00 3 3 3a%	1222223A1uua&3444#BQBG5 AaCDD!122 5 5 5a&3444445NsD   -0 AAA,D4D9 H   I ?I J! !K K__main__r>   r.   )rJ   z7Cannot import module "pwd"; try running with -n option.r#   nobodyrt   z3Cannot setuid "nobody"; try running with -n option.)r!   )@r(   osr]   rr  r4  rV   r  warningsr   r   email._header_value_parserr   r   __all___DEPRECATION_MSGr   r+  rC   rs  programrb   r   r`   rO   ru  r  r,   rD   r   r,  r   r	   r
   rh  r  r{  rj  rfindlastdot
__import__r'   localsmodr  r   class_rv  rw  rx  ry  rk  rJ   proxyri  pwdImportErrorr%   r)   r*   getpwnamr  PermissionErrorloopKeyboardInterruptr   r   r   <module>r     s  +N 


 				         & & & & & & & & D D D D D D D D  #  H&w 7 7 7 7
   (1+-       
 gii

    z. z. z. z. z.(% z. z. z.zJ" J" J" J" J"$ J" J" J"Z7 7 7 7 7j 7 7 7<* * * * *
 * * *Z       ? ? ?D zikkG!I
i//#&&j8G8,ggiiB4HHgaijj)		WS)$$FFG%w'89&(:;%w7NP P PE ~ 	JJJJ 	 	 	EKRUR\]]]]CHQKKKKK	 h''*	BIf 	 	 	EGcjYYYYCHQKKKKK	   9 s6   ;F   'F*)F*G 'G?>G?H HH