o
     JAfj                     @   sV  	 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Zd dl	Z	d dl
Z
d dlZd dlmZ g dZdZdZdZdZdZd	Zed
ejZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#dd  Z$d!d" Z%d#d$ Z&d%d& Z'd'd( Z(zd dl)Z)W n e*y   d)Z+Y nw d*Z+G d+d, d,Z,e+rG d-d. d.e,Z-e.d. d/Z/G d0d1 d1e,Z0e1d2kr)d3d4 Z2e2d5Z3e2d64d7Z5e6d8 d9Z7	 ej89 Z:e:sne7e: Z7qe6d;e;e7  e,d<Z<e<=d: e<>e3e5e7 e<?  dS dS )=    N)body_encode)SMTPExceptionSMTPNotSupportedErrorSMTPServerDisconnectedSMTPResponseExceptionSMTPSenderRefusedSMTPRecipientsRefusedSMTPDataErrorSMTPConnectErrorSMTPHeloErrorSMTPAuthenticationError	quoteaddr	quotedataSMTP   i  
s   
i       z	auth=(.*)c                   @      e Zd ZdS )r   N__name__
__module____qualname__ r   r   /usr/lib/python3.10/smtplib.pyr   H       r   c                   @   r   )r   Nr   r   r   r   r   r   K   r   r   c                   @   r   )r   Nr   r   r   r   r   r   R   r   r   c                   @      e Zd Z	 dd ZdS )r   c                 C   s   || _ || _||f| _d S N)	smtp_code
smtp_errorargs)selfcodemsgr   r   r   __init__c   s   zSMTPResponseException.__init__Nr   r   r   r#   r   r   r   r   r   Z   s    r   c                   @   r   )r   c                 C   s"   || _ || _|| _|||f| _d S r   )r   r   senderr   )r    r!   r"   r%   r   r   r   r#   o   s   zSMTPSenderRefused.__init__Nr$   r   r   r   r   r   h   s    r   c                   @   r   )r   c                 C   s   || _ |f| _d S r   )
recipientsr   )r    r&   r   r   r   r#   }   s   zSMTPRecipientsRefused.__init__Nr$   r   r   r   r   r   u   s    r   c                   @   r   )r	   Nr   r   r   r   r   r	      r   r	   c                   @   r   )r
   Nr   r   r   r   r   r
      r   r
   c                   @   r   )r   Nr   r   r   r   r   r      r   r   c                   @   r   )r   Nr   r   r   r   r   r      r   r   c                 C   s@   	 t j| \}}||fdkr|  dr| S d|  S d| S )N r(   <z<%s>)emailutils	parseaddrstrip
startswithZ
addrstringZdisplaynameaddrr   r   r   r      s   r   c                 C   s$   t j| \}}||fdkr| S |S )Nr'   )r*   r+   r,   r/   r   r   r   
_addr_only   s   r1   c              	   C   s   	 t ddt dt| S )Nz(?m)^\.z..(?:\r\n|\n|\r(?!\n))resubCRLFdatar   r   r   r      s   r   c                 C   s   t dd| S )Ns   (?m)^\.s   ..)r4   r5   )Zbindatar   r   r   _quote_periods      r9   c                 C   s   t dt| S )Nr2   r3   r7   r   r   r   	_fix_eols   r:   r;   FTc                   @   s  e Zd Z	 dZdZdZdZdZdZdZ	e
ZdddejdfddZdd	 Zd
d Zdd Zdd Zdd ZdNddZdd ZdOddZdd ZdOddZdOddZdOdd Zd!d" ZdOd#d$Zd%d& Zd'd( Zd)d* ZdPd,d-Z dPd.d/Z!d0d1 Z"d2d3 Z#e#Z$d4d5 Z%d6d7 Z&d8d9d:d;Z'dQd<d=Z(dQd>d?Z)dQd@dAZ*d8d9dBdCZ+dRdDdEZ,	+	+dSdFdGZ-		+dTdHdIZ.dJdK Z/dLdM Z0dS )Ur   r   NehloFr(   c           
      C   s   	 || _ || _i | _d| _|| _d| _|r*| ||\}}|dkr*|   t|||d ur3|| _	d S t
 }d|v r@|| _	d S d}	z	t
t
 }	W n
 t
jyU   Y nw d|	 | _	d S )Nasciir      .z	127.0.0.1z[%s])_hosttimeoutesmtp_featurescommand_encodingsource_address_auth_challenge_countconnectcloser
   local_hostnamesocketgetfqdngethostbynamegethostnamegaierror)
r    hostportrH   rA   rD   r!   r"   Zfqdnr0   r   r   r   r#      s0   


zSMTP.__init__c                 C   s   | S r   r   r    r   r   r   	__enter__  s   zSMTP.__enter__c                 G   s`   z*z|  d\}}|dkrt||W n	 ty   Y nw W |   d S W |   d S |   w )NZQUIT   )docmdr   r   rG   )r    r   r!   messager   r   r   __exit__  s   
zSMTP.__exit__c                 C   s   	 || _ d S r   )
debuglevel)r    rV   r   r   r   set_debuglevel"  s   
zSMTP.set_debuglevelc                 G   sD   | j dkrttj  g|R dtji d S t|dtji d S )N   file)rV   printdatetimeZnowtimesysstderrr    r   r   r   r   _print_debug+  s   
&zSMTP._print_debugc                 C   sF   |d ur
|s
t d| jdkr| d||f| j t||f|| jS )N0Non-blocking socket (timeout=0) is not supportedr   zconnect: to)
ValueErrorrV   r`   rD   rI   create_connection)r    rN   rO   rA   r   r   r   _get_socket1  s   
zSMTP._get_socket	localhostc                 C   s   	 |r|| _ |s<|d|dkr<|d}|dkr<|d | ||d d  }}zt|}W n ty;   tdw |sA| j}td| || | 	||| j
| _d | _|  \}}| jdkrh| dt| ||fS )N:r   rX   znonnumeric portzsmtplib.connectconnect:)rD   findrfindintrb   OSErrordefault_portr]   auditrd   rA   sockrY   getreplyrV   r`   repr)r    rN   rO   rD   ir!   r"   r   r   r   rF   ;  s*   

zSMTP.connectc                 C   s   	 | j dkr| dt| | jr<t|tr|| j}t	d| | z	| j
| W d S  ty;   |   tdw td)Nr   zsend:zsmtplib.sendServer not connectedzplease run connect() first)rV   r`   rp   rn   
isinstancestrencoderC   r]   rm   sendallrk   rG   r   )r    sr   r   r   send\  s   

z	SMTP.sendc                 C   sf   	 |dkr|}n| d| }d|v sd|v r(| dd dd}td| | | t  d S )Nr(    
z\nz\rz=command and arguments contain prohibited newline characters: )replacerb   rx   r6   )r    cmdr   rw   r   r   r   putcmdo  s   zSMTP.putcmdc              
   C   s<  	 g }| j d u r| jd| _ 	 z
| j td }W n ty2 } z|   tdt| d }~ww |s=|   td| j	dkrJ| 
dt| t|tkrY|   tdd||d	d  d
 |d d }zt|}W n ty|   d}Y nw |dd	 dkrnqd|}| j	dkr| 
d||f  ||fS )NrbrX   z Connection unexpectedly closed: zConnection unexpectedly closedr   zreply:i  zLine too long.   s    	
      -   
zreply: retcode (%s); Msg: %a)rY   rn   makefilereadline_MAXLINErk   rG   r   rt   rV   r`   rp   lenr   appendr-   rj   rb   join)r    resplineer!   Zerrcodeerrmsgr   r   r   ro   |  sJ   




zSMTP.getreplyc                 C   s   	 |  || |  S r   r~   ro   )r    r}   r   r   r   r   rS     s   z
SMTP.docmdc                 C   s.   	 |  d|p| j |  \}}|| _||fS )Nhelo)r~   rH   ro   	helo_resp)r    namer!   r"   r   r   r   r     s
   z	SMTP.heloc           
      C   s.  	 i | _ | | j|p| j |  \}}|dkr&t|dkr&|   td|| _|dkr1||fS d| _	| j
dd}|d= |D ]P}t|}|r_| j dd	d
 |dd  | j d< qBtd|}|r|d }|j|dd   }	|dkr| j |d	d
 |	 | j |< qB|	| j |< qB||fS )Nr   r   rr      Tzlatin-1r{   authr(   ry   z((?P<feature>[A-Za-z0-9][A-Za-z0-9\-]*) ?feature)rB   r~   ehlo_msgrH   ro   r   rG   r   	ehlo_resp
does_esmtpdecodesplitOLDSTYLE_AUTHmatchgetgroupsr4   grouplowerstringendr-   )
r    r   r!   r"   r   eachZ
auth_matchmr   paramsr   r   r   r<     sF   


z	SMTP.ehloc                 C   s   	 |  | jv S r   )r   rB   )r    optr   r   r   has_extn  s   zSMTP.has_extnc                 C   s   	 |  d| |  d S )NhelprX   r   r_   r   r   r   r     s   z	SMTP.helpc                 C   s   	 d| _ | dS )Nr=   rset)rC   rS   rP   r   r   r   r     s   
z	SMTP.rsetc                 C   s&   	 z|    W d S  ty   Y d S w r   )r   r   rP   r   r   r   _rset  s   z
SMTP._rsetc                 C   s   	 |  dS )Nnoop)rS   rP   r   r   r   r     s   
z	SMTP.noopr   c                 C   sj   	 d}|r%| j r%tdd |D r| drd| _ntddd| }| dd	t||f  |  S )
Nr(   c                 s   s    | ]	}|  d kV  qdS )smtputf8N)r   ).0xr   r   r   	<genexpr>  s    zSMTP.mail.<locals>.<genexpr>r   zutf-8z SMTPUTF8 not supported by serverry   mailz	FROM:%s%s)	r   anyr   rC   r   r   r~   r   ro   )r    r%   options
optionlistr   r   r   r     s   

z	SMTP.mailc                 C   s>   	 d}|r| j rdd| }| ddt||f  |  S )Nr(   ry   rcptzTO:%s%s)r   r   r~   r   ro   )r    Zrecipr   r   r   r   r   r   $  s   
z	SMTP.rcptc                 C   s   	 |  d |  \}}| jdkr| d||f |dkr"t||t|tr.t|d}t	|}|dd  t
kr>|t
 }|d t
 }| | |  \}}| jdkr\| d||f ||fS )Nr8   r   zdata:ib  r=      .)r~   ro   rV   r`   r	   rs   rt   r;   ru   r9   bCRLFrx   )r    r"   r!   replqr   r   r   r8   ,  s$   
	




z	SMTP.datac                 C      	 |  dt| |  S )Nvrfyr~   r1   ro   r    addressr   r   r   verifyI     zSMTP.verifyc                 C   r   )Nexpnr   r   r   r   r   r   P  r   z	SMTP.expnc                 C   sp   	 | j d u r0| jd u r2d|  d   krdks4n |  \}}d|  kr*dks6n t||d S d S d S d S )N   r   i+  )r   r   r<   r   r   )r    r!   r   r   r   r   ehlo_or_helo_if_neededW  s   

zSMTP.ehlo_or_helo_if_neededTinitial_response_okc          	      C   s   	 |  }|r
| nd }|d ur)t|ddd}| d|d | \}}d| _n| d|\}}d| _|dkri|  jd7  _t|}t||ddd}| |\}}| jtkretd	t	||f |dks8|d
v rq||fS t
||)Nr=   r(   )ZeolZAUTHry   rX   r   iN  z4Server AUTH mechanism infinite loop. Last response:    i  )upperencode_base64ru   rS   rE   base64Zdecodebytes_MAXCHALLENGEr   rp   r   )	r    Z	mechanismZ
authobjectr   Zinitial_responseresponser!   r   	challenger   r   r   r   h  s4   



z	SMTP.authc                 C   s2   	 |d u rd S | j d t| jd|d  S )Nry   r=   md5)userhmacZHMACpasswordru   	hexdigestr    r   r   r   r   auth_cram_md5  s   zSMTP.auth_cram_md5c                 C   s   	 d| j | jf S )Nz %s %s)r   r   r   r   r   r   
auth_plain  s   zSMTP.auth_plainc                 C   s    	 |d u s
| j dk r| jS | jS )N   )rE   r   r   r   r   r   r   
auth_login  s   zSMTP.auth_loginc                   s   	 |    | dstd| jd   g d} fdd|D }|s(td||| _| _|D ]:}d| 	dd	 }z| j
|t| ||d
\}}	|dv rV||	fW   S W q1 tyk }
 z|
}W Y d }
~
q1d }
~
ww |)Nr   z,SMTP AUTH extension not supported by server.)zCRAM-MD5ZPLAINZLOGINc                    s   g | ]}| v r|qS r   r   )r   r   Zadvertised_authlistr   r   
<listcomp>  s    zSMTP.login.<locals>.<listcomp>z(No suitable authentication method found.Zauth_-_r   r   )r   r   r   rB   r   r   r   r   r   r|   r   getattrr   )r    r   r   r   Zpreferred_authsZauthlistZ
authmethodZmethod_namer!   r   r   Zlast_exceptionr   r   r   login  s6   


z
SMTP.loginc                 C   s   	 |    | dstd| d\}}|dkrrtstd|d ur+|d ur+td|d ur7|d ur7td|d us?|d urJdd l}|d	t	d
 |d u rUt
j||d}|j| j| jd| _d | _d | _d | _i | _d| _||fS t||)Nstarttlsz+STARTTLS extension not supported by server.ZSTARTTLSr>   z&No SSL support included in this Python4context and keyfile arguments are mutually exclusive5context and certfile arguments are mutually exclusiver   Akeyfile and certfile are deprecated, use a custom context insteadr   certfilekeyfileZserver_hostnameF)r   r   r   rS   	_have_sslRuntimeErrorrb   warningswarnDeprecationWarningssl_create_stdlib_contextwrap_socketrn   r@   rY   r   r   rB   r   r   )r    r   r   contextr   Zreplyr   r   r   r   r     sB   

zSMTP.starttlsc                 C   sZ  	 |    g }t|trt|d}| jr.| dr$|dt|  |D ]}|| q&| 	||\}}	|dkrM|dkrC| 
  n|   t||	|i }
t|trW|g}|D ]$}| ||\}}	|dkrq|dkrq||	f|
|< |dkr}| 
  t|
qYt|
t|kr|   t|
| |\}}	|dkr|dkr| 
  n|   t||	|
S )Nr=   sizezsize=%dr   i     )r   rs   rt   r;   ru   r   r   r   r   r   rG   r   r   r   r   r8   r	   )r    	from_addrto_addrsr"   mail_optionsrcpt_optionsZ
esmtp_optsoptionr!   r   Zsenderrsr   r   r   r   sendmail(  sJ   >





zSMTP.sendmailc                 C   s  	 |    |d}|d u rd}nt|dkrd}ntd|d u r?|d |v r.||d  n||d  }tj|gd d }|d u rdd	d
 ||d  ||d  ||d  fD }dd
 tj|D }t|}	|	d= |	d= d}
zd|g|	d W n t
y   | dstdd}
Y nw t 2}|
rtjj||jjddd}g |ddR }ntj|}|j|	dd | }W d    n1 sw   Y  | |||||S )NzResent-Dater(   rX   zResent-z0message has more than one 'Resent-' header blockZSenderFromr   c                 S   s   g | ]}|d ur|qS r   r   )r   fr   r   r   r     s    z%SMTP.send_message.<locals>.<listcomp>ToZBccZCcc                 S   s   g | ]}|d  qS )rX   r   )r   ar   r   r   r     s    z
Resent-BccFr=   r   zOne or more source or delivery addresses require internationalized email support, but the server does not advertise the required SMTPUTF8 capabilityT)utf8)policyZSMTPUTF8zBODY=8BITMIMEr   )linesep)r   Zget_allr   rb   r*   r+   Zgetaddressescopyr   ru   UnicodeEncodeErrorr   r   ioBytesIO	generatorZBytesGeneratorr   ZcloneZflattengetvaluer   )r    r"   r   r   r   r   ZresentZheader_prefixZaddr_fieldsZmsg_copyinternationalZbytesmsggZflatmsgr   r   r   send_message  s\   







	zSMTP.send_messagec                 C   sZ   	 z| j }d | _ |r|  W | j}d | _|r|  d S d S | j}d | _|r,|  w w r   )rY   rG   rn   )r    rY   rn   r   r   r   rG     s"   
z
SMTP.closec                 C   s0   	 |  d}d  | _| _i | _d| _|   |S )NquitF)rS   r   r   rB   r   rG   )r    resr   r   r   r    s   
z	SMTP.quitre   r   N)r(   )r   r   )NNN)r   r   )NNr   r   )1r   r   r   rV   rn   rY   r   r   r   r   	SMTP_PORTrl   rI   _GLOBAL_DEFAULT_TIMEOUTr#   rQ   rU   rW   r`   rd   rF   rx   r~   ro   rS   r   r<   r   r   r   r   r   r   r   r8   r   r   r   r   r   r   r   r   r   r   r   r  rG   r  r   r   r   r   r      sh    
0
	

!

1


3



0
	

B8
h
Mr   c                       s>   e Zd Z	 eZdddddejddfddZ fddZ  Z	S )SMTP_SSLr(   r   Nc	           
      C   s   |d ur|d urt d|d ur|d urt d|d us |d ur+dd l}	|	dtd || _|| _|d u r<tj||d}|| _t	
| ||||| d S )Nr   r   r   r   r   r   )rb   r   r   r   r   r   r   r   r   r   r#   )
r    rN   rO   rH   r   r   rA   rD   r   r   r   r   r   r#     s&   zSMTP_SSL.__init__c                    s@   | j dkr| d||f t |||}| jj|| jd}|S )Nr   rg   r   )rV   r`   superrd   r   r   r@   )r    rN   rO   rA   Z
new_socket	__class__r   r   rd     s   
zSMTP_SSL._get_socket)
r   r   r   SMTP_SSL_PORTrl   rI   r  r#   rd   __classcell__r   r   r  r   r    s    
r  i  c                       s>   e Zd Z	 dZdeddejf fdd	Zd
 fdd		Z  Z	S )LMTPZlhlor(   Nc                    s   	 t  j|||||d d S )N)rH   rD   rA   )r  r#   )r    rN   rO   rH   rD   rA   r  r   r   r#   <  s   
zLMTP.__init__re   r   c                    s   	 |d dkrt  j|||dS | jd ur| jstdz!ttjtj| _| jtjur3| j	| j d | _
| j| W n ty[   | jdkrO| d| | jrW| j  d | _ w |  \}}| jdkrm| d| ||fS )Nr   /)rD   ra   zconnect fail:rg   )r  rF   rA   rb   rI   AF_UNIXSOCK_STREAMrn   r  
settimeoutrY   rk   rV   r`   rG   ro   )r    rN   rO   rD   r!   r"   r  r   r   rF   B  s.   


zLMTP.connectr	  )
r   r   r   r   	LMTP_PORTrI   r  r#   rF   r  r   r   r  r   r  ,  s    r  __main__c                 C   s(   t j| d  t j  t j  S )Nz: )r]   stdoutwriteflushstdinr   r-   )promptr   r   r   r  a  s   
r  r   r   ,zEnter message, end with ^D:r(   rX   zMessage length is %dre   )@rI   r   r4   Zemail.utilsr*   Zemail.messageZemail.generatorr   r   r   r[   r]   Zemail.base64mimer   r   __all__r
  r  r6   r   r   r   compileIr   rk   r   r   r   r   r   r   r	   r
   r   r   r   r1   r   r9   r;   r   ImportErrorr   r   r  r   r  r  r   r  Zfromaddrr   ZtoaddrsrZ   r"   r  r   r   r   ZserverrW   r   r  r   r   r   r   <module>   s   )	      <
/
4

