
    9bh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     </opt/python-3.12.12/usr/lib/python3.12/test/support/smtpd.pywritezDevnull.write]   s    $    c                      y r   r   r   s    r   flushzDevnull.flush^   s    Tr   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    qr   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_datar3   _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_stateseen_greetingextended_smtpr1   clearsocketgetfqdnfqdngetpeernamepeerOSErrorcloseerrnoENOTCONNr"   reprDEBUGSTREAMpush__version__)	r   serverrC   rD   rE   r8   rF   decode_dataerrs	            r   rA   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   )rj   received_datareceived_linesr   s    r   rN   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   DeprecationWarningrB   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' insteadrp   rq   r   values     r   rs   zSMTPChannel.__server   s     ();Q	@ r   c                 <    t        dt        d       | j                  S )NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrp   r   rr   rn   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' insteadrp   rx   ru   s     r   ry   zSMTPChannel.__line   s     +,>	C#r   c                 <    t        dt        d       | j                  S )NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrp   r   rr   rd   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' insteadrp   r|   ru   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' insteadrp   r   rr   rO   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' insteadrp   r   ru   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' insteadrp   r   rr   re   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' insteadrp   r   ru   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' insteadrp   r   rr   rf   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' insteadrp   r   ru   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' insteadrp   r   rr   rm   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' insteadrp   r   ru   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' insteadrp   r   rr   rT   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' insteadrp   r   ru   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' insteadrp   r   rr   rV   r   s    r   __peerzSMTPChannel.__peer  r   r   c                 4    t        dt        d       || _        y )NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrp   r   ru   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' insteadrp   r   rr   rC   r   s    r   __connzSMTPChannel.__conn  r   r   c                 4    t        dt        d       || _        y )NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrp   r   ru   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' insteadrp   r   rr   rD   r   s    r   __addrzSMTPChannel.__addr"  r   r   c                 4    t        dt        d       || _        y )NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrp   r   ru   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   r@   r]   bytesrg   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   )rd   rc   r5   DATArE   rh   lenrG   rn   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)#rH   joinrn   r"   r[   r\   rd   rc   rh   r]   rG   r   findupperstriprP   r1   r4   getattrr   rE   splitrI   rJ   r   rL   rm   rV   re   rf   r   r   rB   process_messagerj   )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%	 2
 "&!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]   rO   rN   rT   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]   rO   rN   rP   rT   rE   r1   rG   rF   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rl   )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eqrv   s         r   
_getparamszSMTPChannel._getparams  sL     E$s3E2u==?b%'ETF5M	 
 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]   rP   )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   )rO   r]   r"   r\   rP   r   r   re   r   r   r   r   rG   poprF   rg   isdigitrE   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   )rO   r]   r"   r\   re   rP   r   r   r   r   r   r   r   r  rf   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]   rN   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>)rO   r]   rf   r   rd   ri   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   rc   r   r4   collectionsdefaultdictr1   propertyr5   DATA_SIZE_DEFAULTrA   rj   rN   _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)Nr9   r7   typer   r+      z started at z
	Local addr: z
	Remote addr:r    )
_localaddr_remoteaddrrE   rF   rG   r3   r   
dispatcherrA   rR   getaddrinfoSOCK_STREAMcreate_socketset_reuse_addrbindlistenr"   	__class__r   timectimer\   rX   )r   	localaddr
remoteaddrrE   r8   rF   r`   gai_resultss           r   rA   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_classrE   _maprF   rG   )r   rC   rD   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   rV   re   rf   r   r   s         r   r   zSMTPServer.process_message  s    	< "!r   )	r   r   r   r   r5  r  rA   r8  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   rV   r   	inheaderslinesr   
peerheaders          r   _print_message_contentz&DebuggingServer._print_message_content  sv    	!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"   getrD  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   rD  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 )NrF   z$PureProxy does not support SMTPUTF8.)r3   superr   rA   )r   r   r   r.  s      r   rA   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   insertrK   r   _deliverr"   r\   )	r   rV   re   rf   r   rB  r   r   refuseds	            r   r   zPureProxy.process_message  st    

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\   
recipientsrW   SMTPExceptionr.  r   )r   re   rf   r   rT  rM  seerrcodeerrmsgrs              r   rL  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   rA   r   rL  __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_limitrF   r   r   r   rc  rc    s    FIJOr   rc  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:25rp      zInvalid arguments: %s:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)getoptr%   argverrorr)   rc  r"   r^   r'   rd  re  r&   r\   rF   r  rf  r   
COMMASPACEr   r   	localhost	localportr3   
remotehost
remoteport)
optsr   r]  optionsoptr   int_size	localspec
remotespecr   s
             r   	parseargsr|  
  so   ]]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+   )rF   z7Cannot import module "pwd"; try running with -n option.r    nobodyrp   z3Cannot setuid "nobody"; try running with -n option.)r   )?r%   osrY   rn  r/  rR   r  test.supportr   r   warningsr   email._header_value_parserr   r   __all__ro  programr^   r   r\   rK   rq  r  r)   r@   r   r'  r	   r
   r   rc  r|  r   rw  re  rfindlastdot
__import__r$   localsmodr}  r   class_rr  rs  rt  ru  rf  rF   proxyrd  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