]"@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z m Z ddddgZejdZdZGd d d Zead Zd Zd ZdddZGdddejZGdddejZGdddeZGdddeZGdddeZGdddZddZ e!dkre Z"e"j#Z#de#kre#j$dZ%e&e#de%e'e(dgZ)e#e%ddZ#n ddl*Z)e+e)e#Z,e,e"j-e"j.fe"j/e"j0fe"j1de"j2Z3e"j4ryddl5Z5Wn2e6k re7dd ej8ej9dYnXe5j:d!d"Z;yej4e;Wn2e<k re7d#d ej8ej9dYnXyej=Wne>k rYnXdS)$N)warn) get_addr_specget_angle_addr SMTPServerDebuggingServer PureProxy MailmanProxyzPython SMTP proxy version 0.3c@s(eZdZddZddZdS)DevnullcCsdS)N)selfmsgr r */opt/alt/python35/lib64/python3.5/smtpd.pywritecsz Devnull.writecCsdS)Nr )r r r r flushdsz Devnull.flushN)__name__ __module__ __qualname__rrr r r r r bs  r  z, icCsDtttdtj|r3t|dtjtj|dS)Nfile)print__doc__globalssysstderrexit)coder r r r usagemsrc@seZdZdZdZdZejeddZe ddZ e dd dd d Z d d Z ddZe ddZejddZe ddZejddZe ddZejddZe ddZejddZe ddZejddZe 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/Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dS)S SMTPChannelricCs|S)Nr )xr r r yszSMTPChannel.c Cs7yt|jjSWntk r2|jSYnXdS)N)maxcommand_size_limitsvalues ValueErrorcommand_size_limit)r r r r max_command_size_limit{s z"SMTPChannel.max_command_size_limitNFc Cstjj||d|||_||_||_||_||_|rd|r^tdd}|dkrt dt dd}||_ |rd|_ d|_ d |_t|_n*d |_ d |_ td |_d |_|jd|_d|_|jjtj|_y|j|_WnLtk r}z,|j|jdtj kridSWYdd}~XnXt!dt"|jdt#|j$d|jt%fdS)NmapzFdecode_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 keywordTrz .s .s rzPeer:rz 220 %s %s)&asynchat async_chat__init__ smtp_serverconnaddrdata_size_limitenable_SMTPUTF8r%rDeprecationWarning _decode_data _emptystring_linesep_dotsepNEWLINE_newlineord_set_rset_state seen_greeting extended_smtpr#clearsocketgetfqdnfqdn getpeernamepeerOSErrorcloseargserrnoZENOTCONNrrepr DEBUGSTREAMpush __version__) r Zserverr1r2r3r(r4 decode_dataerrr r r r/sL                     zSMTPChannel.__init__cCsA|j|_d|_g|_d|_d|_|jddS)NFrs )COMMAND smtp_statemailfromrcpttosrequire_SMTPUTF8 num_bytesset_terminator)r r r r _set_post_data_states      z SMTPChannel._set_post_data_statecCs |jd|_g|_dS)Nr)rW received_datareceived_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 __servers zSMTPChannel.__servercCstdtd||_dS)NzRSetting __server attribute on SMTPChannel is deprecated, set 'smtp_server' insteadr))rr5r0)r valuer r r rZs cCstdtd|jS)NzUAccess to __line attribute on SMTPChannel is deprecated, use 'received_lines' insteadr))rr5rY)r r r r __lines 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 __states 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 __greetings 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 __mailfroms 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 __rcpttoss 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%dnddS)Nz zutf-8ascii)r-r.rLbytesrT)r r r r r rL;szSMTPChannel.pushcCsd}|j|jkr$|j}n|j|jkr?|j}|rX|j|krXdS|rs|jt|7_|jr|jj t |dn|jj |dS)Nzutf-8) rQrPr'DATAr3rUlenr6rYappendstr)r datalimitr r r collect_incoming_data@s   z!SMTPChannel.collect_incoming_datac Cs|jj|j}tdt|dtg|_|j|jkrf|jd}|_|ss|j ddS|j st |d}|j d}|dkr|j }d}n0|d|j }||ddj}|jr|j|n|j}||kr'|j ddSt|d |d}|sX|j d |dS||dS|j|jkr|j d d|_dS|jr|j|jkr|j d d|_dSg}xZ|j|jD]F} | r| d|jkr|j| ddq|j| qW|jj||_|j|j|j|jf} i} |j sd |jd|ji} |j j!| | } |j"| s|j dn |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)#r7joinrYrrJrKrQrPrUrLr6rkfindupperstripr?r#r&getattrrhr3splitr8r9rjr;rXrErRrSrprqr0process_messagerW) r lineZszicommandargZmax_szmethodrltextrHkwargsstatusr r r found_terminatorPsd                zSMTPChannel.found_terminatorcCs\|s|jddS|jr1|jddS|j||_|jd|jdS)Nz501 Syntax: HELO hostnamez503 Duplicate HELO/EHLOz250 %s)rLr>r=rC)r r|r r r smtp_HELOs     zSMTPChannel.smtp_HELOcCs|s|jddS|jr1|jddS|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 %sMAILz 250-8BITMIMEz 250-SMTPUTF8 z250 HELP) rLr>r=r?rCr3r#r6r4)r r|r r r smtp_EHLOs&           zSMTPChannel.smtp_EHLOcCs'|r|jdn |jddS)Nz501 Syntax: NOOPz250 OK)rL)r r|r r r smtp_NOOPszSMTPChannel.smtp_NOOPcCs|jd|jdS)Nz221 Bye)rLZclose_when_done)r r|r r r smtp_QUITs zSMTPChannel.smtp_QUITcCs@t|}|d|j|kr<||djSdS)Nr)rirtru)r keywordr|Zkeylenr r r _strip_command_keywords z"SMTPChannel._strip_command_keywordcCsc|s dS|jjdr4t|\}}nt|\}}|sV||fS|j|fS)Nr<)rr)lstrip startswithrrZ addr_spec)r r|addressrestr r r _getaddrs zSMTPChannel._getaddrcCsgi}xZ|D]R}|jd\}}}|j sE|rI| rIdS|rU|nd||]ZEHLOz250 Syntax: EHLO hostnameZHELOz250 Syntax: HELO hostnamerz 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_HELPs:              zSMTPChannel.smtp_HELPcCsV|rE|j|\}}|r1|jdqR|jd|n |jddS)NzB252 Cannot VRFY user, but will accept message and attempt deliveryz502 Could not VRFY %sz501 Syntax: VRFY
)rrL)r r|rrr r r smtp_VRFYs zSMTPChannel.smtp_VRFYcCse|js|jddStd|dtd}|jrF|d7}|dkrc|j|dS|jd|}|j|\}}|s|j|dS|j r|r|j|dS|jr|jddS|jj |_ |j |j }|dkr |j|dS|j sX|j dd }|dkrX|jd dS|jr|j d d }|dkrd|_n|d k r|jddS|j dd}|r |js|j|dS|jr t||jkr |jddSt|jdkr5|jddS||_td|jdt|jddS)Nz503 Error: send HELO firstz ===> MAILrz 501 Syntax: MAIL FROM:
z [SP ]zFROM:z503 Error: nested MAIL commandZBODY7BIT8BITMIMEz1501 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)rr)r>rLrrKr?rrrRrtrwrprr6popr4rTisdigitr3intrikeys)r r| syntaxerrrrZbodysmtputf8sizer r r smtp_MAILsh                         zSMTPChannel.smtp_MAILcCs|js|jddStd|dt|jsG|jddSd}|jr`|d7}|dkr}|j|dS|jd|}|j|\}}|s|j|dS|j r|r|j|dS|jj |_ |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?rrrtrwrqrrirrSrj)r r|rrrr r r smtp_RCPT;s@             zSMTPChannel.smtp_RCPTcCs2|r|jddS|j|jddS)Nz501 Syntax: RSETz250 OK)rLr=)r r|r r r smtp_RSET^s   zSMTPChannel.smtp_RSETcCsu|js|jddS|js4|jddS|rK|jddS|j|_|jd|jddS)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|jddS)Nz502 EXPN not implemented)rL)r r|r r r smtp_EXPNtszSMTPChannel.smtp_EXPN),rrrrPrhr& collections defaultdictr#propertyr'DATA_SIZE_DEFAULTr/rWr=Z_SMTPChannel__serversetterZ_SMTPChannel__lineZ_SMTPChannel__stateZ_SMTPChannel__greetingZ_SMTPChannel__mailfromZ_SMTPChannel__rcpttosZ_SMTPChannel__dataZ_SMTPChannel__fqdnZ_SMTPChannel__peerZ_SMTPChannel__connZ_SMTPChannel__addrrLrnrrrrrrrrrrrrrrrr r r r rts` -    >     # 6 #  rc@sFeZdZeZedddddZddZddZdS) rNFc Cs4||_||_||_||_|rB|r<tdd}|dkrdtdtdd}||_tj j |d|y`t j |dt j }|j|dd|dd |j|j||jd Wn|jYn6Xtd |jjtjtj||fd tdS) 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(typerrz0%s started at %s Local addr: %s Remote addr:%sr)Z _localaddr _remoteaddrr3r4r%rr5r6asyncore dispatcherr/rA getaddrinfo SOCK_STREAMZ create_socketZset_reuse_addrbindlistenrGr __class__rtimectimerK)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_accepteds zSMTPServer.handle_acceptedcKs tdS)N)NotImplementedError)r rErRrSrlrr r r rxszSMTPServer.process_message) rrrrrrr/rrxr r r r rxs " c@s(eZdZddZddZdS)rcCsd}|j}x|D]z}|rn| rnd|d}t|ts^t|jd}t|d}t|tst|}t|qWdS)NrzX-Peer: rzutf-8) splitlines isinstancerkrJencoder)r rErlZ inheaderslinesryZ peerheaderr r r _print_message_contents     z&DebuggingServer._print_message_contentcKsptd|rR|jdr1td|d|jdrRtd|d|j||tddS)Nz%---------- MESSAGE FOLLOWS ----------rpzmail options: %srqzrcpt options: %s z%------------ END MESSAGE ------------)rgetr)r rErRrSrlrr r r rxs zDebuggingServer.process_messageN)rrrrrxr r r r rs  cs:eZdZfddZddZddZS)rcs?d|kr"|dr"tdtt|j||dS)Nr4z$PureProxy does not support SMTPUTF8.)r%superrr/)r rHr)rr r r/s zPureProxy.__init__c Cs|jd}d}x|D]}|s)P|d7}qW|j|d|dtj|}|j|||}td|dtdS)Nrrrz X-Peer: %szwe got some refusals:r)rwinsertr:rr_deliverrrK) r rErRrSrlrrzryrefusedr r r rxs zPureProxy.process_messagec Cs7ddl}i}yU|j}|j|jd|jdz|j|||}Wd|jXWn|jk r}ztddt|j }WYdd}~Xnt |j fk r2}z`td|j dtt |dd }t |dd} x|D]} || f|| Psp           U-S B    (