\dyFdZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z ddl m Z m Z gdZdZe eedddlZddlZejdZd ZGd d Zead Zd ZdZd%dZGddejZGddejZGddeZ GddeZ!GddZ"dZ#edkrMe#Z$e$j%Z%de%vrJe%&dZ'e(e%de'e)e*dgZ+e%e'dzdZ%nddl,Z+e-e+e%Z.e.e$j/e$j0fe$j1e$j2fe$j3e$j4Z5e$j6r ddl7Z7n-#e8$r%e9d ej:!ej;dYnwxYwe7j<d"d#Z= ej6e=n-#e>$r%e9d$ej:!ej;dYnwxYw ej?dS#e@$rYdSwxYwdS)&aAn RFC 5321 smtp proxy with optional RFC 1870 and RFC 6531 extensions. Usage: %(program)s [options] [localhost:localport [remotehost:remoteport]] Options: --nosetuid -n This program generally tries to setuid `nobody', unless this flag is set. The setuid call will fail if this program is not run as root (in which case, use this flag). --version -V Print the version number and exit. --class classname -c classname Use `classname' as the concrete SMTP proxy class. Uses `PureProxy' by default. --size limit -s limit Restrict the total size of the incoming message to "limit" number of bytes via the RFC 1870 SIZE extension. Defaults to 33554432 bytes. --smtputf8 -u Enable the SMTPUTF8 extension and behave as an RFC 6531 smtp proxy. --debug -d Turn on debugging prints. --help -h Print this message and exit. Version: %(__version__)s If localhost is not given then `localhost' is used, and if localport is not given then 8025 is used. If remotehost is not given then `localhost' is used, and if remoteport is not given, then 25 is used. N) _deprecatedwarn) get_addr_specget_angle_addr) SMTPChannel SMTPServerDebuggingServer 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.) )removezPython SMTP proxy version 0.3ceZdZdZdZdS)DevnullcdSNselfmsgs ..\python\lib\smtpd.pywritez Devnull.writeicdSrrrs rflushz Devnull.flushjrrN)__name__ __module__ __qualname__rrrrrrrhs"rr z, ictttztj|rt|tjtj|dS)Nfile)print__doc__globalssysstderrexit)coders rusager,ssN 'GII CJ//// $ c ####HTNNNNNrc*eZdZdZdZdZejefdZe dZ e dddfdZ d Z d Ze d Zejd Ze d ZejdZe dZejdZe dZejdZe dZejdZe dZejdZe dZejdZe dZejdZe dZejdZe dZejdZe dZejd Zd!Zd"Zd#Zd$Zd%Zd&Z d'Z!d(Z"d)Z#d*Z$d+Z%d,Z&d-Z'd.Z(d/Z)d0Z*d1Z+dS)2rric|Srr)xs rzSMTPChannel.sqrc~ t|jS#t$r |jcYSwxYwr)maxcommand_size_limitsvalues ValueErrorcommand_size_limitrs rmax_command_size_limitz"SMTPChannel.max_command_size_limitsN +t/668899 9 + + +* * * * +s %(<<NFcZtj|||||_||_||_||_||_||_|r|rtd|r"d|_ d|_ d|_ t|_n)d|_ d|_ td|_ d |_|d|_d |_|jt+j|_ ||_nB#t4$r5}||jt8jkrYd}~dSd}~wwxYwt=d t?|jt@ |!d |jdtDdS)NmapFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timer! .r . FzPeer:r#z220  )#asynchat async_chat__init__ smtp_serverconnaddrdata_size_limitenable_SMTPUTF8 _decode_datar6 _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_state seen_greeting extended_smtpr4clearsocketgetfqdnfqdn getpeernamepeerOSErrorcloseerrnoENOTCONNr%repr DEBUGSTREAMpush __version__) rserverrGrHrIr;rJ decode_dataerrs rrEzSMTPChannel.__init__s$$T4S$999!  ..'  A{ A@AA A  " "D "DMDL#DMM #D #DMt99DL!DM "  &&(((N$$  ((**DII    JJLLLyEN** FFFFF   gtDI[9999 KK899999sD E%*EEc|j|_d|_g|_d|_d|_|ddS)z/Reset state variables to their post-DATA state.NFrr?)COMMAND smtp_statemailfromrcpttosrequire_SMTPUTF8 num_bytesset_terminatorrs r_set_post_data_statez SMTPChannel._set_post_data_statesB,  % G$$$$$rcJ|d|_g|_dS)z.Reset all state variables except the greeting.r!N)rn received_datareceived_linesrs rrRzSMTPChannel._set_rset_states* !!### rc<tdtd|jS)NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' insteadrDeprecationWarningrFrs r__serverzSMTPChannel.__servers* ();Q @ @ @rc@tdtd||_dS)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadrsrtrvalues rrvzSMTPChannel.__servers/ ();Q @ @ @ rc<tdtd|jS)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadrsrrurqrs r__linezSMTPChannel.__lines* +,> C C C""rc@tdtd||_dS)NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadrsr{rxs rr|zSMTPChannel.__lines/ +,> C C C#rc<tdtd|jS)NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadrsrrurhrs r__statezSMTPChannel.__states& '(:A ? ? ?rc@tdtd||_dS)NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadrsrrxs rrzSMTPChannel.__states) '(:A ? ? ?rc<tdtd|jS)NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadrsrrurSrs r __greetingzSMTPChannel.__greeting* *+=q B B B!!rc@tdtd||_dS)NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadrsrrxs rrzSMTPChannel.__greeting/ *+=q B B B"rc<tdtd|jS)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadrsrrurirs r __mailfromzSMTPChannel.__mailfroms& %&8! = = =}rc@tdtd||_dS)NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadrsrrxs rrzSMTPChannel.__mailfroms) %&8! = = = rc<tdtd|jS)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadrsrrurjrs r __rcpttoszSMTPChannel.__rcpttoss& $%7 < < <|rc@tdtd||_dS)NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadrsrrxs rrzSMTPChannel.__rcpttoss) $%7 < < < rc<tdtd|jS)NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadrsrrurprs r__datazSMTPChannel.__datarrc@tdtd||_dS)NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadrsrrxs rrzSMTPChannel.__datarrc<tdtd|jS)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadrsrrurXrs r__fqdnzSMTPChannel.__fqdn & !"4a 9 9 9yrc@tdtd||_dS)NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadrsrrxs rrzSMTPChannel.__fqdn) !"4a 9 9 9 rc<tdtd|jS)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadrsrrurZrs r__peerzSMTPChannel.__peerrrc@tdtd||_dS)NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadrsrrxs rrzSMTPChannel.__peerrrc<tdtd|jS)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadrsrrurGrs r__connzSMTPChannel.__conn#rrc@tdtd||_dS)NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadrsrrxs rrzSMTPChannel.__conn(rrc<tdtd|jS)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadrsrrurHrs r__addrzSMTPChannel.__addr.rrc@tdtd||_dS)NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadrsrrxs rrzSMTPChannel.__addr3rrcztj|t|dz|jrdnddS)Nr=utf-8ascii)rCrDrabytesrkrs rrazSMTPChannel.push:sQ  u <%:G''(I(I J J J J JrcZd}|j|jkr|j}n|j|jkr|j}|r |j|krdS|r|xjt |z c_|jr*|j t|ddS|j |dS)Nr) rhrgr8DATArIrllenrKrqappendstr)rdatalimits rcollect_incoming_dataz!SMTPChannel.collect_incoming_data?s ?dl * */EE _ ) )(E  (T^e++ F  ( NNc$ii 'NN   -   & &s4'9'9 : : : : :   & &t , , , , ,rc|j|j}tdt |t g|_|j|jkr!|jdc}|_|s| ddS|j st|d}| d}|dkr| }d}n;|d| }||dzd}|jr |j|n|j}||kr| ddSt%|d |zd}|s| d |zdS||dS|j|jkr| d d|_dS|jr.|j|jkr| d d|_dSg}||jD]H} | r/| d|jkr|| dd3|| I|j||_|j|j|j|jf} i} |j s|j|jd } |j j!| i| } |"| s| ddS| | dS)NzData:r#rz500 Error: bad syntaxrrBr.z500 Error: line too longsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail data) mail_options rcpt_options250 OK)#rLjoinrqr%r_r`rhrgrlrarKrfindupperstriprTr4r7getattrrrIsplitrMrNrrPrprZrirjrrrFprocess_messagern) rlineszicommandargmax_szmethodrtextargskwargsstatuss rfound_terminatorzSMTPChannel.found_terminatorOs %%d&9:: gtDzz 4444  ?dl * *!% B  1222$ *4)) #A1uu**,,rr(..**1Q344j&&((-Kd.w77373J F{{ 4555T7W#4d;;F  BWLMMM F3KKK F$)++ 2333!"# 9M(M(M 9:::!"D 4=11 & &&DGt|33KKQRR))))KK%%%%!%!3!3D!9!9D It}dlD]EHLOz250 Syntax: EHLO hostnameHELOz250 Syntax: HELO hostnamerz 250 Syntax: MAIL FROM:
RCPTz250 Syntax: RCPT TO:
rz250 Syntax: DATARSETz250 Syntax: RSETNOOPz250 Syntax: NOOPQUITz250 Syntax: QUITVRFYz250 Syntax: VRFY
zD501 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFYzD250 Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)rrarT)rrextendedlc_argrs r smtp_HELPzSMTPChannel.smtp_HELPs  -0HYY[[F 5666666!! 5666666!!8%$8OC #6!!6%$8OC #6!! ,-----6!! ,-----6!! ,-----6!! ,-----6!! 677777 566666 II, - - - - -rc|rK||\}}|r|ddS|d|zdS|ddS)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY
)rra)rrrrs r smtp_VRFYzSMTPChannel.smtp_VRFYs  4"mmC00OGV 9 122222 1C788888 II2 3 3 3 3 3rcV|js|ddStd|td}|jr|dz }|||dS|d|}||\}}|s||dS|js|r||dS|jr|ddS| |_ | |j }|||dS|j s1| dd }|d vr|d dS|jr=| d d }|durd|_n|d ur|ddS| dd}|ra|s||dS|jr/t%||jkr|ddSt'|dkr|ddS||_td|jt|ddS)N503 Error: send HELO firstz ===> MAILr#z 501 Syntax: MAIL FROM:
rzFROM:z503 Error: nested MAIL commandBODY7BIT)r8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMESMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsSIZEz:552 Error: message size exceeds fixed maximum message sizerz:555 MAIL FROM parameters not recognized or not implementedzsender:r)rSrar%r`rTrrrirrrrrKpoprJrkisdigitrIintrkeys)rr syntaxerrrrbodysmtputf8sizes r smtp_MAILzSMTPChannel.smtp_MAILs!  II2 3 3 3 F k3[11116   3 2 2I ; IIi F))'377--,,  IIi F! f  IIi F =  II6 7 7 7 F"LLNN0022!233 > IIi F  ::ff--D/// MNNN   zz*e44H4(,%%&& BCCCzz&$''  <<>>  )$$$% #d))d6J*J*J VWWW v{{}}   ! ! IIR S S S F  i[9999 (rc|js|ddStd|t|js|ddSd}|jr|dz }|||dS|d|}||\}}|s||dS|js|r||dS| |_ | |j }|||dSt| dkr|d dS|j|td |jt|d dS) Nrz ===> RCPTr#z503 Error: need MAIL commandz501 Syntax: RCPT TO:
rzTO:rz8555 RCPT TO parameters not recognized or not implementedzrecips:r)rSrar%r`rirTrrrrrrrrrjr)rrrrrs r smtp_RCPTzSMTPChannel.smtp_RCPT:s!  II2 3 3 3 F k3[1111}  II4 5 5 5 F4   3 2 2I ; IIi F))%55--,,  IIi F! f  IIi F"LLNN0022!233 > IIi F v{{}}   ! ! IIP Q Q Q F G$$$ iK8888 (rc|r|ddS||ddS)Nz501 Syntax: RSETr)rarRrs r smtp_RSETzSMTPChannel.smtp_RSET]sL   II( ) ) ) F  (rc|js|ddS|js|ddS|r|ddS|j|_|d|ddS)Nrz503 Error: need RCPT commandz501 Syntax: DATAs . z#354 End data with .)rSrarjrrhrmrs r smtp_DATAzSMTPChannel.smtp_DATAds!  II2 3 3 3 F|  II4 5 5 5 F   II( ) ) ) F) L))) 788888rc0|ddS)Nz502 EXPN not implementedrrs r smtp_EXPNzSMTPChannel.smtp_EXPNss ,-----r),rrrrgrr7 collections defaultdictr4propertyr8DATA_SIZE_DEFAULTrErnrR_SMTPChannel__serversetter_SMTPChannel__line_SMTPChannel__state_SMTPChannel__greeting_SMTPChannel__mailfrom_SMTPChannel__rcpttos_SMTPChannel__data_SMTPChannel__fqdn_SMTPChannel__peer_SMTPChannel__conn_SMTPChannel__addrrarrrrrrrrrrrr r rrrrrrrrzsG D1+1;M2P2P2PQQ ++X+ "!r) rrrrr9rrEr<rrrrrrwsWM"3!&E::::8888"""""rrceZdZdZdZdS)r cPd}|}|D]}|rU|sSd|dz}t|ts"t|d}t |d}t|tst|}t |dS)Nr.zX-Peer: rr) splitlines isinstancerr_encoder%)rrZr inheaderslinesr peerheaders r_print_message_contentz&DebuggingServer._print_message_contents !!  D  '$q'1 !$,,B!%j&7&7&@&@!A!AJj!!! dC(( "Dzz $KKKK  rc &td|rZ|drtd|dz|drtd|dz|||tddS)Nz%---------- MESSAGE FOLLOWS ----------rzmail options: %srzrcpt options: %s z%------------ END MESSAGE ------------)r%getrHr?s rrzDebuggingServer.process_messages 5666  Ezz.)) C(6.+AABBBzz.)) E*VN-CCDDD ##D$/// 566666rN)rrrrHrrrrr r s2"77777rr c*eZdZfdZdZdZxZS)r c~d|vr|drtdtt|j|i|dS)NrJz$PureProxy does not support SMTPUTF8.)r6superr rE)rrrr2s rrEzPureProxy.__init__sP  & &62C+D &CDD D'i'888888rc|d}d}|D] }|sn|dz } ||d|dzt|}||||}t d|t dS)Nr rr.z X-Peer: %szwe got some refusals:r#)rinsertrOr_deliverr%r`) rrZrirjrrFrrrefuseds rrzPureProxy.process_messages 4     D  FAA Q tAw.///||E""--'488 %w[AAAAAArcPddl}i} |}||jd|jd ||||}|n#|wxYwn#|j$r'}tdt|j }Yd}~nkd}~wt|j f$rT}td|j tt|dd}t|dd } |D] } || f|| < Yd}~nd}~wwxYw|S) Nrr.zgot SMTPRecipientsRefusedr#got smtp_code smtp_errorignore)smtplibSMTPconnectr)sendmailquitSMTPRecipientsRefusedr%r` recipientsr[ SMTPExceptionr2r) rrirjrrXrQseerrcodeerrmsgrs rrPzPureProxy._deliversb / A IId&q)4+;A+> ? ? ? **Xw==, # # # -K @ @ @ @lGGGGGG./ / / / %; 7 7 7 7ab11GQ h77F / /%v.  / / / / / /s=AB A5 B5B  B D#B;;D#A DD#)rrrrErrP __classcell__)r2s@rr r sY99999 B B Brr ceZdZdZdZdZdZdS)OptionsTr NF)rrrsetuid classname size_limitrJrrrrgrgs" FIJOOOrrgc tjtjdddgd\}}n,#tj$r}t d|Yd}~nd}~wwxYwt }|D]\}}|dvrt d|dvr)t ttjdF|dvrd|_ R|d vr||_ ^|d vr tj a o|d vrd |_ {|d vrQ t|}||_#t d|ztj tjdYxYwt!|dkrd}d}nmt!|dkr |d}d}nOt!|dkr|d}|d}n+t ddt"|z|d} | dkrt dd|z|d| |_ t|| dzd|_n##t,$rt dd|zYnwxYw|d} | dkrt dd|z|d| |_ t|| dzd|_n##t,$rt dd|zYnwxYw|S)Nr.z nVhc:s:du)zclass=nosetuidversionhelpzsize=debugr )z-hz--helpr)z-Vz --version)z-nz --nosetuidF)z-cz--class)z-dz--debug)z-uz --smtputf8T)z-sz--sizezInvalid size: r#zlocalhost:8025z localhost:25rsr zInvalid arguments: %s:zBad local spec: %szBad local port: %szBad remote spec: %szBad remote port: %s)getoptr(argverrorr,rgr%rbr*rhrir)r`rJrrjr COMMASPACErr localhost localportr6 remotehost remoteport) optsrraoptionsoptrint_size localspec remotespecrs r parseargsrsN] HQRRL+    dd < a iiGS " " " !HHHH ' ' ' +    HQKKKK ( ( ("GNN % % % #G   % % %*KK ( ( (&*G # # $ $ $ s88%-"" &,3:>>>> % 4yy1}}$ # TQG # TQG !W  a(:??4+@+@@AAA sA1uu a% 1222!"1" G3 !A#$$00 333 a% 1222223A1uu a&3444#BQBG5 AaCDD!122 555 a&3444445 NsD-0AAA,D4D9H I?IJ!!KK__main__r>r.)rJz7Cannot import module "pwd"; try running with -n option.r#nobodyrsz3Cannot setuid "nobody"; try running with -n option.)r!)Ar&r(osr]rqr3rVrwarningsrremail._header_value_parserrr__all___DEPRECATION_MSGrr*rCrrprogramrbrr`rOrtrr,rDrr+rr r rgrrzrirfindlastdot __import__r'localsmodrrclass_rurvrwrxrjrJproxyrhpwd ImportErrorr%r)r*getpwnamrPermissionErrorloopKeyboardInterruptrrrrs#++N &&&&&&&&DDDDDDDD   # H&w7777  (1+-  gii   z.z.z.z.z.(%z.z.z.zJ"J"J"J"J"$J"J"J"Z77777j777<***** ***Z???D zikkG!I i//#&&j8G8,ggiiB4HHgaijj)  WS) $ $F FG%w'89&(:;%w7N P P PE~   JJJJ    EKRUR\ ] ] ] ] CHQKKKKK h''*  BIf        EGcj Y Y Y Y CHQKKKKK         9s6<F'F+*F+G'H?HHHH