
    z%ix                     &   	 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mZ g d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	j2                        Z G d dej6                        Z G d de      Z G d de      Z G d d      Zd Z e!dk(  r e        Z"e"jF                  Z#de#v r3e#jI                  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"jZ                  e"j\                  fe"j^                  e"j`                  fe"jb                  e"jd                        Z3e"jh                  r-	 d dl5Z5 e5jt                  d      d    Z;	  ejh                  e;       	  ejz                          yy# e6$ r)  e7de jp                          e jr                  d       Y iw xY w# e<$ r)  e7d!e jp                          e jr                  d       Y rw xY w# e>$ r Y yw xY w)#    N)asyncoreasynchat)warn)get_addr_specget_angle_addr)SMTPChannel
SMTPServerDebuggingServer	PureProxyzPython SMTP proxy version 0.3c                       e Zd Zd Zd Zy)Devnullc                      y N selfmsgs     >/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/smtpd.pywritezDevnull.write]           c                      y r   r   r   s    r   flushzDevnull.flush^   r   r   N)__name__
__module____qualname__r   r   r   r   r   r   r   \   s    r   r   
z, i    c                     t        t        t               z  t        j                         |rt        |t        j                         t        j
                  |        y )Nfile)print__doc__globalssysstderrexit)coder   s     r   usager*   g   s3    	'GI
CJJ/
c

#HHTNr   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+y)2r   r      i   c                     | S r   r   )xs    r   <lambda>zSMTPChannel.<lambda>s   s    q r   c                     	 t        | j                  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_limitu   s<    	+t//66899 	+***	+s   "% ==NFc                 4   t         j                  j                  | ||       || _        || _        || _        || _        || _        || _        |r|rt        d      |r!d| _
        d| _        d| _        t        | _        n%d| _
        d| _        t        d      | _        d	| _        | j!                          d| _        d
| _        | j&                  j)                          t+        j,                         | _        	 |j1                         | _        t=        dt?        | j2                        t@               | jC                  d| j.                  dtD               y # t4        $ r8}| j7                          |j8                  t8        j:                  k7  r Y d }~y d }~ww xY w)NmapFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer   
.r      
   .   
FzPeer:r!   z220  )#r   
async_chat__init__smtp_serverconnaddrdata_size_limitenable_SMTPUTF8_decode_datar4   _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_stateseen_greetingextended_smtpr2   clearsocketgetfqdnfqdngetpeernamepeerOSErrorcloseerrnoENOTCONNr#   reprDEBUGSTREAMpush__version__)	r   serverrD   rE   rF   r9   rG   decode_dataerrs	            r   rB   zSMTPChannel.__init__|   sU   $$T4S$9!		..'{ @ A A "D"DMDL#DM #D#DMt9DL!DM"  &&(NN$		((*DI 	gtDII[9		K89  	 JJLyyENN*	s   6E 	F.FFc                     	 | j                   | _        d | _        g | _        d| _        d| _        | j                  d       y )NFr   r=   )COMMAND
smtp_statemailfromrcpttosrequire_SMTPUTF8	num_bytesset_terminatorr   s    r   _set_post_data_statez SMTPChannel._set_post_data_state   s;    =,, %G$r   c                 B    	 | j                          d| _        g | _        y Nr   )rk   received_datareceived_linesr   s    r   rO   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   DeprecationWarningrC   r   s    r   __serverzSMTPChannel.__server   s!     ();Q	@r   c                 4    t        dt        d       || _        y )NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrq   rr   r   values     r   rt   zSMTPChannel.__server   s     ();Q	@ r   c                 <    t        dt        d       | j                  S )NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrq   r   rs   ro   r   s    r   __linezSMTPChannel.__line   s!     +,>	C"""r   c                 4    t        dt        d       || _        y )NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrq   ry   rv   s     r   rz   zSMTPChannel.__line   s     +,>	C#r   c                 <    t        dt        d       | j                  S )NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrq   r   rs   re   r   s    r   __statezSMTPChannel.__state   s     '(:A	?r   c                 4    t        dt        d       || _        y )NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadrq   r}   rv   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' insteadrq   r   rs   rP   r   s    r   
__greetingzSMTPChannel.__greeting   !     *+=q	B!!!r   c                 4    t        dt        d       || _        y )NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrq   r   rv   s     r   r   zSMTPChannel.__greeting        *+=q	B"r   c                 <    t        dt        d       | j                  S )NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrq   r   rs   rf   r   s    r   
__mailfromzSMTPChannel.__mailfrom   s     %&8!	=}}r   c                 4    t        dt        d       || _        y )NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrq   r   rv   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' insteadrq   r   rs   rg   r   s    r   	__rcpttoszSMTPChannel.__rcpttos   s     $%7	<||r   c                 4    t        dt        d       || _        y )NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrq   r   rv   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' insteadrq   r   rs   rn   r   s    r   __datazSMTPChannel.__data   r   r   c                 4    t        dt        d       || _        y )NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrq   r   rv   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' insteadrq   r   rs   rU   r   s    r   __fqdnzSMTPChannel.__fqdn       !"4a	9yyr   c                 4    t        dt        d       || _        y )NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrq   r   rv   s     r   r   zSMTPChannel.__fqdn       !"4a	9	r   c                 <    t        dt        d       | j                  S )NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrq   r   rs   rW   r   s    r   __peerzSMTPChannel.__peer  r   r   c                 4    t        dt        d       || _        y )NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrq   r   rv   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' insteadrq   r   rs   rD   r   s    r   __connzSMTPChannel.__conn  r   r   c                 4    t        dt        d       || _        y )NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrq   r   rv   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' insteadrq   r   rs   rE   r   s    r   __addrzSMTPChannel.__addr"  r   r   c                 4    t        dt        d       || _        y )NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrq   r   rv   s     r   r   zSMTPChannel.__addr'  r   r   c                     t         j                  j                  | t        |dz   | j                  rd             y d             y )Nr;   utf-8ascii)r   rA   r^   bytesrh   r   s     r   r^   zSMTPChannel.push.  sA      u&LT%:%:'(I 	J@G(I 	Jr   c                    d }| j                   | j                  k(  r| j                  }n%| j                   | j                  k(  r| j                  }|r| j
                  |kD  ry |r| xj
                  t        |      z  c_        | j                  r&| j                  j                  t        |d             y | j                  j                  |       y )Nr   )re   rd   r6   DATArF   ri   lenrH   ro   appendstr)r   datalimits      r   collect_incoming_dataz!SMTPChannel.collect_incoming_data3  s    ??dll*//E__		)((ET^^e+NNc$i'N&&s4'9:&&t,r   c                    | j                   j                  | j                        }t        dt	        |      t
               g | _        | j                  | j                  k(  r | j                  dc}| _        |s| j                  d       y | j                  st        |d      }|j                  d      }|dk  r|j                         }d }n)|d | j                         }||dz   d  j                         }| j                  r| j                   |   n| j"                  }||kD  r| j                  d       y t%        | d	|z   d       }|s| j                  d
|z         y  ||       y | j                  | j&                  k7  r| j                  d       d| _        y | j(                  r2| j                  | j(                  kD  r| j                  d       d| _        y g }|j+                  | j,                        D ]<  }	|	r'|	d   | j.                  k(  r|j1                  |	dd         ,|j1                  |	       > | j2                  j                  |      | _        | j6                  | j8                  | j:                  | j4                  f}
i }| j                  s| j<                  | j>                  d} | j@                  jB                  |
i |}| jE                          |s| j                  d       y | j                  |       y )NzData:r!   r   z500 Error: bad syntaxr   r@   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)#rI   joinro   r#   r\   r]   re   rd   ri   r^   rH   r   findupperstriprQ   r2   r5   getattrr   rF   splitrJ   rK   r   rM   rn   rW   rf   rg   r   r   rC   process_messagerk   )r   lineszicommandargmax_szmethodr   textargskwargsstatuss                r   found_terminatorzSMTPChannel.found_terminatorC  s     %%d&9&9:gtDz4 ??dll*!%B		12$$4)		#A1u**,r(..*1Q34j&&(-- ..w7373J3J F{		45T7W#4d;F		BWLM3K$))+		23!"##9M9M(M		9:!" D

4==1 &DGt||3KKQR)KK%	&
 "&!3!3D!9DIIt}}dllD<N<NODF$$$($5$5$($5$5 6T%%55tFvFF%%'		(#		&!r   c                     |s| j                  d       y | j                  r| j                  d       y | j                          || _        | j                  d| j                  z         y )Nz501 Syntax: HELO hostname503 Duplicate HELO/EHLOz250 %s)r^   rP   rO   rU   r   r   s     r   	smtp_HELOzSMTPChannel.smtp_HELO  sW    II12II/0 		(TYY&'r   c                 &   |s| j                  d       y | j                  r| j                  d       y | j                          || _        d| _        | j                  d| j                  z         | j
                  r5| j                  d| j
                  z         | j                  dxx   dz  cc<   | j                  s| j                  d       | j                  r(| j                  d	       | j                  dxx   d
z  cc<   | j                  d       y )Nz501 Syntax: EHLO hostnamer   Tz250-%sz250-SIZE %sMAIL   z250-8BITMIMEz250-SMTPUTF8
   z250 HELP)	r^   rP   rO   rQ   rU   rF   r2   rH   rG   r   s     r   	smtp_EHLOzSMTPChannel.smtp_EHLO  s    II12II/0 !		(TYY&'IImd&:&::;$$V,2,  IIn%IIn%$$V,2,		*r   c                 N    |r| j                  d       y | j                  d       y )Nz501 Syntax: NOOPr   r^   r   s     r   	smtp_NOOPzSMTPChannel.smtp_NOOP  s    II()IIhr   c                 F    | j                  d       | j                          y )Nz221 Bye)r^   close_when_doner   s     r   	smtp_QUITzSMTPChannel.smtp_QUIT  s    		)r   c                 l    t        |      }|d | j                         |k(  r||d  j                         S yrm   )r   r   r   )r   keywordr   keylens       r   _strip_command_keywordz"SMTPChannel._strip_command_keyword  s:    Ww<7*vw<%%''r   c                     |sy|j                         j                  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  sV    ::<""3'*3/MGT)#.MGTD=   $&&r   c                     i }|D ]6  }|j                  d      \  }}}|j                         r|r|s y |r|nd||<   8 |S )N=T)	partitionisalnum)r   paramsresultparameqrw   s         r   
_getparamszSMTPChannel._getparams  sQ      	2E$s3E2u==?b%'ETF5M		2
 r   c                 ^   |rd}|j                         }|dk(  r| j                  d       y |dk(  r| j                  d       y |dk(  r%d}| j                  r||z  }| j                  |       y |dk(  r%d	}| j                  r||z  }| j                  |       y |d
k(  r| j                  d       y |dk(  r| j                  d       y |dk(  r| j                  d       y |dk(  r| j                  d       y |dk(  r| j                  d       y | j                  d       y | j                  d       y )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   r^   rQ   )r   r   extendedlc_argr   s        r   	smtp_HELPzSMTPChannel.smtp_HELP  s    0HYY[F		566!		566!8%%8OC		#6!6%%8OC		#6!		,-6!		,-6!		,-6!		,-6!		67		 5 6 II , -r   c                     |r=| j                  |      \  }}|r| j                  d       y | j                  d|z         y | j                  d       y )NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY <address>)r   r^   )r   r   r   r   s       r   	smtp_VRFYzSMTPChannel.smtp_VRFY  sL    "mmC0OGV		 1 2 		1C78II23r   c                    | j                   s| j                  d       y t        d|t               d}| j                  r|dz  }|| j                  |       y | j                  d|      }| j                  |      \  }}|s| j                  |       y | j                  s|r| j                  |       y | j                  r| j                  d       y |j                         j                         | _
        | j                  | j                        }|| j                  |       y | j                  s(|j                  dd	      }|d
vr| j                  d       y | j                  r4|j                  dd      }|du rd| _        n|dur| j                  d       y |j                  dd       }|rX|j!                         s| j                  |       y | j"                  r*t%        |      | j"                  kD  r| j                  d       y t'        |j)                               dkD  r| j                  d       y || _        t        d| j                  t               | j                  d       y )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   )rP   r^   r#   r]   rQ   r   r   rf   r   r   r   r   rH   poprG   rh   isdigitrF   intr   keys)r   r   	syntaxerrr   r   bodysmtputf8sizes           r   	smtp_MAILzSMTPChannel.smtp_MAIL  s   !!II23k3[16	22I;IIi ))'37--,IIi !!fIIi ==II67"LLN002!2!23>IIi   ::ff-D//		MNzz*e4H4(,%&		BCzz&$'<<>		)$%%#d)d6J6J*J		VWv{{}!IIRSi[9		(r   c                 2   | j                   s| j                  d       y t        d|t               | j                  s| j                  d       y d}| j
                  r|dz  }|| j                  |       y | j                  d|      }| j                  |      \  }}|s| j                  |       y | j
                  s|r| j                  |       y |j                         j                         | _
        | j                  | j                        }|| j                  |       y t        |j                               dkD  r| j                  d	       y | j                  j                  |       t        d
| j                  t               | j                  d       y )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   )rP   r^   r#   r]   rf   rQ   r   r   r   r   r   r   r   r  rg   r   )r   r   r  r   r   s        r   	smtp_RCPTzSMTPChannel.smtp_RCPT.  sK   !!II23k3[1}}II454	22I;IIi ))%5--,IIi !!fIIi "LLN002!2!23>IIi v{{}!IIPQG$iK8		(r   c                 n    |r| j                  d       y | j                          | j                  d       y )Nz501 Syntax: RSETr   )r^   rO   r   s     r   	smtp_RSETzSMTPChannel.smtp_RSETQ  s-    II()		(r   c                 
   | j                   s| j                  d       y | j                  s| j                  d       y |r| j                  d       y | j                  | _        | j                  d       | j                  d       y )Nr   z503 Error: need RCPT commandz501 Syntax: DATAs   
.
z#354 End data with <CR><LF>.<CR><LF>)rP   r^   rg   r   re   rj   r   s     r   	smtp_DATAzSMTPChannel.smtp_DATAX  sk    !!II23||II45II()))L)		78r   c                 &    | j                  d       y )Nz502 EXPN not implementedr   r   s     r   	smtp_EXPNzSMTPChannel.smtp_EXPNg  s    		,-r   ),r   r   r   rd   r   r5   collectionsdefaultdictr2   propertyr6   DATA_SIZE_DEFAULTrB   rk   rO   _SMTPChannel__serversetter_SMTPChannel__line_SMTPChannel__state_SMTPChannel__greeting_SMTPChannel__mailfrom_SMTPChannel__rcpttos_SMTPChannel__data_SMTPChannel__fqdn_SMTPChannel__peer_SMTPChannel__conn_SMTPChannel__addrr^   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r  r   r   r   r   r   n   s   GD1+11;M2PQ+ + <M5e%:N%!     __! !
 # # ]]$ $
   ^^   
 " " # #
    
    
 " " ]]# #
   ]] 
   ]] 
   ]] 
   ]] J
- ;"|
(, 
	'	!-F	44l!F9.r   r   c                   ,    e Zd ZeZedddfdZd Zd Zy)r	   NFc           	      h   || _         || _        || _        || _        || _        |r|rt        d      t        j                  j                  | |       	 t        j                  |dt        j                  i}| j                  |d   d   |d   d          | j                          | j                  |       | j                  d       t!        | j"                  j$                  dt'        j(                  t'        j&                               d|d	|t*        
       y #  | j-                           xY w)Nr:   r8   typer   r,      z started at z
	Local addr: z
	Remote addr:r!   )
_localaddr_remoteaddrrF   rG   rH   r4   r   
dispatcherrB   rS   getaddrinfoSOCK_STREAMcreate_socketset_reuse_addrbindlistenr#   	__class__r   timectimer]   rY   )r   	localaddr
remoteaddrrF   r9   rG   ra   gai_resultss           r   rB   zSMTPServer.__init__o  s    $%..'{ @ A A$$Ts$3	: ,,i F282D2DFK{1~a0+a.2CD!IIi KKN
 ''DIIK)@:'-8:		JJLs   A3D D1c           	          t        dt        |      z  t               | j                  | ||| j                  | j
                  | j                  | j                        }y )NzIncoming connection from %sr!   )r#   r\   r]   channel_classrF   _maprG   rH   )r   rD   rE   channels       r   handle_acceptedzSMTPServer.handle_accepted  sP    +d4j8{K$$T%)%)%)%9%9%)YY%)%9%9%)%6%68r   c                     	 t         r   )NotImplementedErrorr   rW   rf   rg   r   r   s         r   r   zSMTPServer.process_message  s    	< "!r   )	r   r   r   r   r6  r  rB   r9  r   r   r   r   r	   r	   k  s"    M "3!&E:88"r   r	   c                       e Zd Zd Zd Zy)r
   c                    d}|j                         }|D ]k  }|rA|s?d|d   z   }t        |t              st        |j	                  d            }t        |       d}t        |t              st        |      }t        |       m y )Nr,   zX-Peer: r   r   )
splitlines
isinstancer   r\   encoder#   )r   rW   r   	inheaderslinesr   
peerheaders          r   _print_message_contentz&DebuggingServer._print_message_content  s{    	! 	D'$q'1
!$,!%j&7&7&@!AJj!	dC(Dz$K	r   c                     t        d       |rD|j                  d      rt        d|d   z         |j                  d      rt        d|d   z         | j                  ||       t        d       y )Nz%---------- MESSAGE FOLLOWS ----------r   zmail options: %sr   zrcpt options: %s
z%------------ END MESSAGE ------------)r#   getrE  r<  s         r   r   zDebuggingServer.process_message  se    56zz.)(6.+AABzz.)*VN-CCD##D$/56r   N)r   r   r   rE  r   r   r   r   r
   r
     s    "7r   r
   c                   *     e Zd Z fdZd Zd Z xZS )r   c                 T    d|v r|d   rt        d      t        t        |   |i | y )NrG   z$PureProxy does not support SMTPUTF8.)r4   superr   rB   )r   r   r   r/  s      r   rB   zPureProxy.__init__  s3    &62C+DCDDi'88r   c                     |j                  d      }d}|D ]  }|s n|dz  } |j                  |d|d   z         t        j                  |      }| j	                  |||      }t        d|t               y )Nr   r   r,   z
X-Peer: %szwe got some refusals:r!   )r   insertrL   r   _deliverr#   r]   )	r   rW   rf   rg   r   rC  r   r   refuseds	            r   r   zPureProxy.process_message  sy    

4  	DFA	 	QtAw./||E"--'48%w[Ar   c                 6   dd l }i }	 |j                         }|j                  | j                  d   | j                  d          	 |j	                  |||      }|j                          |S # |j                          w xY w# |j                  $ r(}t        dt               |j                  }Y d }~|S d }~wt        |j                  f$ rO}t        d|j                  t               t        |dd      }t        |dd	      }	|D ]	  }
||	f||
<    Y d }~|S d }~ww xY w)
Nr   r,   zgot SMTPRecipientsRefusedr!   got	smtp_code
smtp_errorignore)smtplibSMTPconnectr'  sendmailquitSMTPRecipientsRefusedr#   r]   
recipientsrX   SMTPExceptionr/  r   )r   rf   rg   r   rU  rN  seerrcodeerrmsgrs              r   rM  zPureProxy._deliver  s   	/AIId&&q)4+;+;A+>?**Xw=  ,, 	#-K@llG  ../ 	/%;7 ab1GQh7F /%v.
/	/s<   <A? A* A? *A<<A? ?DB11D	ADD)r   r   r   rB   r   rM  __classcell__)r/  s   @r   r   r     s    9
Br   r   c                       e Zd ZdZdZdZdZy)OptionsTr   NF)r   r   r   setuid	classname
size_limitrG   r   r   r   rd  rd    s    FIJOr   rd  c                     	 t        j                   t        j                  dd  dg d      \  } }t               } D ]  \  }}|dv rt	        d       |dv r%t        t               t        j                  d       ?|dv rd|_	        K|d	v r||_
        W|d
v rt        j                  al|dv rd|_        x|dv s}	 t        |      }||_         t!              dk  rd}d}nQt!        |      dk  r|d   }d}n;t!        |      dk  r|d   }|d   }n"t	        ddt"        j%                  |      z         j'                  d      }	|	dk  rt	        dd|z         |d |	 |_        	 t        ||	dz   d        |_        j'                  d      }	|	dk  rt	        dd|z         |d |	 |_        	 t        ||	dz   d        |_        |S # t         j                  $ r}t	        d|       Y d }~d }~ww xY w#  t        d|z   t        j                         t        j                  d       Y xY w# t,        $ r t	        dd|z         Y w xY w# t,        $ r t	        dd|z         Y |S w xY w)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:25rq      zInvalid arguments: %s:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)getoptr&   argverrorr*   rd  r#   r_   r(   re  rf  r'   r]   rG   r  rg  r   
COMMASPACEr   r   	localhost	localportr4   
remotehost
remoteport)
optsr   r^  optionsoptr   int_size	localspec
remotespecr   s
             r   	parseargsr}  
  st   ]]HHQRL+
d iG S""!H''+HHQK(("GN%% #G%%**K((&*G#$$s8%-"#. 4y1}$	#
	TQG	#
	TQG	!W
a(:??4+@@A 	sA1ua%	12!"1G3	!A#$0 	A1ua&34#BQG5 AaCD!12 Nq << a,&,3::>,  3a%	123  5a&34N5sG   -F? 9G,!H' 'I ?G)G$$G),5H$'III! I!__main__r<   r,   )rG   z7Cannot import module "pwd"; try running with -n option.r!   nobodyrq   z3Cannot setuid "nobody"; try running with -n option.)r   )?r&   osrZ   ro  r0  rS   r  test.supportr   r   warningsr   email._header_value_parserr   r   __all__rp  programr_   r   r]   rL   rr  r  r*   rA   r   r(  r	   r
   r   rd  r}  r   rx  rf  rfindlastdot
__import__r%   localsmodr~  r   class_rs  rt  ru  rv  rg  rG   proxyre  pwdImportErrorr#   r'   r(   getpwnamr  PermissionErrorloopKeyboardInterruptr   r   r   <module>r     s1  +N  	      +  D ((1+- 
 i

 z.(%% z.zJ"$$ J"Z7j 7<*
 *Z ?D zkG!!I
i//#&8G,giB4Hgaij)	S)$FG%%w'8'89&&(:(:;%%w7N7NPE ~~	 h'*	BIIf7 "  	KRUR\R\]CHHQK	  	GcjjYCHHQK	
  s6   &F&  G H &+GG+HHHH