grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026 й¼]"Šã@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z m Z ddddgZejdZdZGd d „d ƒZeƒad Zd Zd Zddd„ZGdd„dejƒZGdd„dejƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„dƒZdd„Z e!dkre ƒZ"e"j#Z#de#krÿe#j$dƒZ%e&e#de%…e'ƒe(ƒdgƒZ)e#e%dd…Z#n ddl*Z)e+e)e#ƒZ,e,e"j-e"j.fe"j/e"j0fe"j1de"j2ƒZ3e"j4r÷yddl5Z5Wn2e6k r�e7dd ej8ƒej9dƒYnXe5j:d!ƒd"Z;yej4e;ƒWn2e<k röe7d#d ej8ƒej9dƒYnXyej=ƒWne>k rYnXdS)$éN)Úwarn)Ú get_addr_specÚget_angle_addrÚ SMTPServerÚDebuggingServerÚ PureProxyÚ MailmanProxyzPython SMTP proxy version 0.3c@s(eZdZdd„Zdd„ZdS)ÚDevnullcCsdS)N©)ÚselfÚmsgr r ú*/opt/alt/python35/lib64/python3.5/smtpd.pyÚwritecsz Devnull.writecCsdS)Nr )r r r r Úflushdsz Devnull.flushN)Ú__name__Ú __module__Ú __qualname__rrr r r r r bs  r Ú z, iÚcCsDtttƒdtjƒ|r3t|dtjƒtj|ƒdS)NÚfile)ÚprintÚ__doc__ÚglobalsÚsysÚstderrÚexit)Úcoder r r r Úusagemsrc@sõeZdZdZdZdZejedd„ƒZe dd„ƒZ e dd dd d „Z d d „Z dd„Ze dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd„ƒZejdd„ƒZe dd „ƒZejd!d „ƒZe d"d#„ƒZejd$d#„ƒZe d%d&„ƒZejd'd&„ƒZe d(d)„ƒZejd*d)„ƒZe d+d,„ƒZejd-d,„ƒZe d.d/„ƒZejd0d/„ƒZd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Z d=d>„Z!d?d@„Z"dAdB„Z#dCdD„Z$dEdF„Z%dGdH„Z&dIdJ„Z'dKdL„Z(dMdN„Z)dOdP„Z*dQdR„Z+dS)SÚ SMTPChannelréicCs|S)Nr )Úxr r r ÚyszSMTPChannel.c Cs7yt|jjƒƒSWntk r2|jSYnXdS)N)ÚmaxÚcommand_size_limitsÚvaluesÚ ValueErrorÚcommand_size_limit)r r r r Úmax_command_size_limit{s z"SMTPChannel.max_command_size_limitNFc Csºtjj||d|ƒ||_||_||_||_||_|rd|r^tdƒ‚d}|dkr†t dt dƒd}||_ |r¼d|_ d|_ d |_t|_n*d |_ d |_ td ƒ|_d |_|jƒd|_d|_|jjƒtjƒ|_y|jƒ|_WnLtk r}z,|jƒ|jdtj kri‚dSWYdd}~XnXt!dt"|jƒdt#ƒ|j$d|jt%fƒdS)NÚmapzFdecode_data and enable_SMTPUTF8 cannot be set to True at the same timeFzgThe decode_data default of True will change to False in 3.6; specify an explicit value for this keywordéTrz Ú.ós ó.s rzPeer:rz 220 %s %s)&ÚasynchatÚ async_chatÚ__init__Ú smtp_serverÚconnÚaddrÚdata_size_limitÚenable_SMTPUTF8r%rÚDeprecationWarningÚ _decode_dataÚ _emptystringÚ_linesepÚ_dotsepÚNEWLINEÚ_newlineÚordÚ_set_rset_stateÚ seen_greetingÚ extended_smtpr#ÚclearÚsocketÚgetfqdnÚfqdnÚ getpeernameÚpeerÚOSErrorÚcloseÚargsÚerrnoZENOTCONNrÚreprÚ DEBUGSTREAMÚpushÚ __version__) r Zserverr1r2r3r(r4Ú decode_dataÚerrr r r r/‚sL                     zSMTPChannel.__init__cCsA|j|_d|_g|_d|_d|_|jdƒdS)NFrs )ÚCOMMANDÚ smtp_stateÚmailfromÚrcpttosÚrequire_SMTPUTF8Ú num_bytesÚset_terminator)r r r r Ú_set_post_data_state°s      z SMTPChannel._set_post_data_statecCs |jƒd|_g|_dS)Nr)rWÚ received_dataÚreceived_lines)r r r r r=¹s  zSMTPChannel._set_rset_statecCstdtdƒ|jS)NzTAccess to __server attribute on SMTPChannel is deprecated, use 'smtp_server' insteadr))rr5r0)r r r r Ú__serverÁs zSMTPChannel.__servercCstdtdƒ||_dS)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadr))rr5r0)r Úvaluer r r rZÆs cCstdtdƒ|jS)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadr))rr5rY)r r r r Ú__lineÌs zSMTPChannel.__linecCstdtdƒ||_dS)NzSSetting __line attribute on SMTPChannel is deprecated, set 'received_lines' insteadr))rr5rY)r r[r r r r\Ñs cCstdtdƒ|jS)NzRAccess to __state attribute on SMTPChannel is deprecated, use 'smtp_state' insteadr))rr5rQ)r r r r Ú__state×s zSMTPChannel.__statecCstdtdƒ||_dS)NzPSetting __state attribute on SMTPChannel is deprecated, set 'smtp_state' insteadr))rr5rQ)r r[r r r r]Üs cCstdtdƒ|jS)NzXAccess to __greeting attribute on SMTPChannel is deprecated, use 'seen_greeting' insteadr))rr5r>)r r r r Ú __greetingâs zSMTPChannel.__greetingcCstdtdƒ||_dS)NzVSetting __greeting attribute on SMTPChannel is deprecated, set 'seen_greeting' insteadr))rr5r>)r r[r r r r^çs cCstdtdƒ|jS)NzSAccess to __mailfrom attribute on SMTPChannel is deprecated, use 'mailfrom' insteadr))rr5rR)r r r r Ú __mailfromís zSMTPChannel.__mailfromcCstdtdƒ||_dS)NzQSetting __mailfrom attribute on SMTPChannel is deprecated, set 'mailfrom' insteadr))rr5rR)r r[r r r r_òs cCstdtdƒ|jS)NzQAccess to __rcpttos attribute on SMTPChannel is deprecated, use 'rcpttos' insteadr))rr5rS)r r r r Ú __rcpttosøs zSMTPChannel.__rcpttoscCstdtdƒ||_dS)NzOSetting __rcpttos attribute on SMTPChannel is deprecated, set 'rcpttos' insteadr))rr5rS)r r[r r r r`ýs cCstdtdƒ|jS)NzTAccess to __data attribute on SMTPChannel is deprecated, use 'received_data' insteadr))rr5rX)r r r r Ú__datas zSMTPChannel.__datacCstdtdƒ||_dS)NzRSetting __data attribute on SMTPChannel is deprecated, set 'received_data' insteadr))rr5rX)r r[r r r ras cCstdtdƒ|jS)NzKAccess to __fqdn attribute on SMTPChannel is deprecated, use 'fqdn' insteadr))rr5rC)r r r r Ú__fqdns zSMTPChannel.__fqdncCstdtdƒ||_dS)NzISetting __fqdn attribute on SMTPChannel is deprecated, set 'fqdn' insteadr))rr5rC)r r[r r r rbs cCstdtdƒ|jS)NzKAccess to __peer attribute on SMTPChannel is deprecated, use 'peer' insteadr))rr5rE)r r r r Ú__peers zSMTPChannel.__peercCstdtdƒ||_dS)NzISetting __peer attribute on SMTPChannel is deprecated, set 'peer' insteadr))rr5rE)r r[r r r rcs cCstdtdƒ|jS)NzKAccess to __conn attribute on SMTPChannel is deprecated, use 'conn' insteadr))rr5r1)r r r r Ú__conn$s zSMTPChannel.__conncCstdtdƒ||_dS)NzISetting __conn attribute on SMTPChannel is deprecated, set 'conn' insteadr))rr5r1)r r[r r r rd)s cCstdtdƒ|jS)NzKAccess to __addr attribute on SMTPChannel is deprecated, use 'addr' insteadr))rr5r2)r r r r Ú__addr/s zSMTPChannel.__addrcCstdtdƒ||_dS)NzISetting __addr attribute on SMTPChannel is deprecated, set 'addr' insteadr))rr5r2)r r[r r r re4s cCs3tjj|t|d|jr%dndƒƒdS)Nz zutf-8Úascii)r-r.rLÚbytesrT)r r r r r rL;szSMTPChannel.pushcCs¬d}|j|jkr$|j}n|j|jkr?|j}|rX|j|krXdS|rs|jt|ƒ7_|jr˜|jj t |dƒƒn|jj |ƒdS)Nzutf-8) rQrPr'ÚDATAr3rUÚlenr6rYÚappendÚstr)r ÚdataÚlimitr r r Úcollect_incoming_data@s   z!SMTPChannel.collect_incoming_datac CsÊ|jj|jƒ}tdt|ƒdtƒg|_|j|jkrf|jd}|_|ss|j dƒdS|j s‹t |dƒ}|j dƒ}|dkr»|j ƒ}d}n0|d|…j ƒ}||dd…jƒ}|jr|j|n|j}||kr'|j dƒdSt|d |dƒ}|sX|j d |ƒdS||ƒdS|j|jkr’|j d ƒd|_dS|jrÇ|j|jkrÇ|j d ƒd|_dSg}xZ|j|jƒD]F} | r| d|jkr|j| dd…ƒqà|j| ƒqàW|jj|ƒ|_|j|j|j|jf} i} |j s„d |jd|ji} |j j!| | Ž} |j"ƒ| s¹|j dƒn |j | ƒdS)NzData:rrz500 Error: bad syntaxzutf-8ú rz500 Error: line too longZsmtp_z&500 Error: command "%s" not recognizedz451 Internal confusionz552 Error: Too much mail dataÚ mail_optionsÚ rcpt_optionsz250 OK)#r7ÚjoinrYrrJrKrQrPrUrLr6rkÚfindÚupperÚstripr?r#r&Úgetattrrhr3Úsplitr8r9rjr;rXrErRrSrprqr0Úprocess_messagerW) r ÚlineZszÚiÚcommandÚargZmax_szÚmethodrlÚtextrHÚkwargsÚstatusr r r Úfound_terminatorPsd                zSMTPChannel.found_terminatorcCs\|s|jdƒdS|jr1|jdƒdS|jƒ||_|jd|jƒdS)Nz501 Syntax: HELO hostnamez503 Duplicate HELO/EHLOz250 %s)rLr>r=rC)r r|r r r Ú smtp_HELOŽs     zSMTPChannel.smtp_HELOcCsÝ|s|jdƒdS|jr1|jdƒdS|jƒ||_d|_|jd|jƒ|jr�|jd|jƒ|jdd7<|js¥|jdƒ|jrÌ|jd ƒ|jdd 7<|jd ƒdS) Nz501 Syntax: EHLO hostnamez503 Duplicate HELO/EHLOTz250-%sz 250-SIZE %sÚMAILéz 250-8BITMIMEz 250-SMTPUTF8é z250 HELP) rLr>r=r?rCr3r#r6r4)r r|r r r Ú smtp_EHLOšs&           zSMTPChannel.smtp_EHLOcCs'|r|jdƒn |jdƒdS)Nz501 Syntax: NOOPz250 OK)rL)r r|r r r Ú smtp_NOOP°szSMTPChannel.smtp_NOOPcCs|jdƒ|jƒdS)Nz221 Bye)rLZclose_when_done)r r|r r r Ú smtp_QUIT¶s zSMTPChannel.smtp_QUITcCs@t|ƒ}|d|…jƒ|kr<||d…jƒSdS)Nr)rirtru)r Úkeywordr|Zkeylenr r r Ú_strip_command_keyword»s z"SMTPChannel._strip_command_keywordcCsc|s dS|jƒjdƒr4t|ƒ\}}nt|ƒ\}}|sV||fS|j|fS)Nrú<)rr)ÚlstripÚ startswithrrZ addr_spec)r r|ÚaddressÚrestr r r Ú_getaddrÁs zSMTPChannel._getaddrcCsgi}xZ|D]R}|jdƒ\}}}|jƒ sE|rI| rIdS|rU|nd||]ZEHLOz250 Syntax: EHLO hostnameZHELOz250 Syntax: HELO hostnamerƒz 250 Syntax: MAIL FROM:
ZRCPTz250 Syntax: RCPT TO:
rhz250 Syntax: DATAZRSETz250 Syntax: RSETZNOOPz250 Syntax: NOOPZQUITz250 Syntax: QUITZVRFYz250 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)rtrLr?)r r|ZextendedZlc_argr r r r Ú smtp_HELP×s:              zSMTPChannel.smtp_HELPcCsV|rE|j|ƒ\}}|r1|jdƒqR|jd|ƒn |jdƒdS)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY
)r�rL)r r|rŽr”r r r Ú smtp_VRFYús zSMTPChannel.smtp_VRFYcCse|js|jdƒdStd|dtƒd}|jrF|d7}|dkrc|j|ƒdS|jd|ƒ}|j|ƒ\}}|s¡|j|ƒdS|j rÂ|rÂ|j|ƒdS|jrÜ|jdƒdS|jƒj ƒ|_ |j |j ƒ}|dkr |j|ƒdS|j sX|j dd ƒ}|dkrX|jd ƒdS|jr¨|j d d ƒ}|dkr‹d|_n|d k r¨|jdƒdS|j ddƒ}|r |jƒsÝ|j|ƒdS|jr t|ƒ|jkr |jdƒdSt|jƒƒdkr5|jdƒdS||_td|jdtƒ|jdƒdS)Nz503 Error: send HELO firstz ===> MAILrz 501 Syntax: MAIL FROM:
z [SP ]zFROM:z503 Error: nested MAIL commandZBODYÚ7BITÚ8BITMIMEz1501 Error: BODY can only be one of 7BIT, 8BITMIMEZSMTPUTF8FTz&501 Error: SMTPUTF8 takes no argumentsZSIZEz:552 Error: message size exceeds fixed maximum message sizerz:555 MAIL FROM parameters not recognized or not implementedzsender:z250 OK)ršr›)r>rLrrKr?rŠr�rRrtrwrpr—r6Úpopr4rTÚisdigitr3ÚintriÚkeys)r r|Ú syntaxerrrŽr”ZbodyÚsmtputf8Úsizer r r Ú smtp_MAILsh                         zSMTPChannel.smtp_MAILcCs€|js|jdƒdStd|dtƒ|jsG|jdƒdSd}|jr`|d7}|dkr}|j|ƒdS|jd|ƒ}|j|ƒ\}}|s»|j|ƒdS|j rÜ|rÜ|j|ƒdS|jƒj ƒ|_ |j |j ƒ}|dkr |j|ƒdSt |j ƒƒdkrI|jd ƒdS|jj|ƒtd |jdtƒ|jd ƒdS) Nz503 Error: send HELO firstz ===> RCPTrz503 Error: need MAIL commandz501 Syntax: RCPT TO:
z [SP ]zTO:rz8555 RCPT TO parameters not recognized or not implementedzrecips:z250 OK)r>rLrrKrRr?rŠr�rtrwrqr—rirŸrSrj)r r|r rŽr”r r r Ú smtp_RCPT;s@             zSMTPChannel.smtp_RCPTcCs2|r|jdƒdS|jƒ|jdƒdS)Nz501 Syntax: RSETz250 OK)rLr=)r r|r r r Ú smtp_RSET^s   zSMTPChannel.smtp_RSETcCsu|js|jdƒdS|js4|jdƒdS|rK|jdƒdS|j|_|jdƒ|jdƒdS)Nz503 Error: send HELO firstz503 Error: need RCPT commandz501 Syntax: DATAs . z#354 End data with .)r>rLrSrhrQrV)r r|r r r Ú smtp_DATAes       zSMTPChannel.smtp_DATAcCs|jdƒdS)Nz502 EXPN not implemented)rL)r r|r r r Ú smtp_EXPNtszSMTPChannel.smtp_EXPN),rrrrPrhr&Ú collectionsÚ defaultdictr#Úpropertyr'ÚDATA_SIZE_DEFAULTr/rWr=Z_SMTPChannel__serverÚsetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrLrnr�r‚r†r‡rˆrŠr�r—r˜r™r£r¤r¥r¦r§r r r r rts` -    >     # 6 #  rc@sFeZdZeZeddddd„Zdd„Zdd„ZdS) rNFc Cs4||_||_||_||_|rB|r<tdƒ‚d}|dkrdtdtdƒd}||_tj j |d|ƒy`t j |dt j Œ}|j|dd|dd ƒ|jƒ|j|ƒ|jd ƒWn|jƒ‚Yn6Xtd |jjtjtjƒƒ||fd tƒdS) NzVThe decode_data and enable_SMTPUTF8 parameters cannot be set to True at the same time.FzgThe decode_data default of True will change to False in 3.6; specify an explicit value for this keywordr)Tr(Útyperréz0%s started at %s Local addr: %s Remote addr:%sr)Z _localaddrÚ _remoteaddrr3r4r%rr5r6ÚasyncoreÚ dispatcherr/rAÚ getaddrinfoÚ SOCK_STREAMZ create_socketZset_reuse_addrÚbindÚlistenrGrÚ __class__rÚtimeÚctimerK)r Z localaddrZ remoteaddrr3r(r4rNZ gai_resultsr r r r/|s6              zSMTPServer.__init__cCsKtdt|ƒdtƒ|j||||j|j|j|jƒ}dS)NzIncoming connection from %sr)rrJrKÚ channel_classr3Ú_mapr4r6)r r1r2Zchannelr r r Úhandle_accepted s zSMTPServer.handle_acceptedcKs t‚dS)N)ÚNotImplementedError)r rErRrSrlrr r r rx«szSMTPServer.process_message) rrrrr¹r«r/r»rxr r r r rxs " c@s(eZdZdd„Zdd„ZdS)rcCs›d}|jƒ}x‚|D]z}|rn| rnd|d}t|tƒs^t|jdƒƒ}t|ƒd}t|tƒs‰t|ƒ}t|ƒqWdS)NrzX-Peer: rzutf-8)Ú splitlinesÚ isinstancerkrJÚencoder)r rErlZ inheadersÚlinesryZ peerheaderr r r Ú_print_message_contentÏs     z&DebuggingServer._print_message_contentcKsptdƒ|rR|jdƒr1td|dƒ|jdƒrRtd|dƒ|j||ƒtdƒdS)Nz%---------- MESSAGE FOLLOWS ----------rpzmail options: %srqzrcpt options: %s z%------------ END MESSAGE ------------)rÚgetrÁ)r rErRrSrlrr r r rxàs zDebuggingServer.process_messageN)rrrrÁrxr r r r rÍs  cs:eZdZ‡fdd†Zdd„Zdd„Z‡S)rcs?d|kr"|dr"tdƒ‚tt|ƒj||ŽdS)Nr4z$PureProxy does not support SMTPUTF8.)r%Úsuperrr/)r rHr)r¶r r r/ìs zPureProxy.__init__c CsŠ|jdƒ}d}x|D]}|s)P|d7}qW|j|d|dƒtj|ƒ}|j|||ƒ}td|dtƒdS)Nrrrz X-Peer: %szwe got some refusals:r)rwÚinsertr:rrÚ_deliverrrK) r rErRrSrlrÀrzryÚrefusedr r r rxñs zPureProxy.process_messagec Cs7ddl}i}yU|jƒ}|j|jd|jdƒz|j|||ƒ}Wd|jƒXWnÉ|jk rª}ztddtƒ|j }WYdd}~Xn‰t |j fk r2}z`td|j dtƒt |dd ƒ}t |ddƒ} x|D]} || f|| Psp           ÿÿU-S B    (