a
    "h_                     @   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0 d*Z+G d+d, d,Z,e+rG d-d. d.e,Z-e.d. d/Z/G d0d1 d1e,Z0e1d2krRd3d4 Z2e2d5Z3e2d64d7Z5e6d8 d9Z7ej89 Z:e:sqe7e: Z7qe6d:e;e7  e,d;Z<e<=d< e<>e3e5e7 e<?  dS )=    N)body_encode)SMTPExceptionSMTPNotSupportedErrorSMTPServerDisconnectedSMTPResponseExceptionSMTPSenderRefusedSMTPRecipientsRefusedSMTPDataErrorSMTPConnectErrorSMTPHeloErrorSMTPAuthenticationError	quoteaddr	quotedataSMTP   i  
s   
i       z	auth=(.*)c                   @   s   e Zd ZdS )r   N__name__
__module____qualname__ r   r   //opt/python-3.9.21/usr/lib/python3.9/smtplib.pyr   H   s   r   c                   @   s   e Zd ZdS )r   Nr   r   r   r   r   r   K   s   r   c                   @   s   e Zd ZdS )r   Nr   r   r   r   r   r   R   s   r   c                   @   s   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                   @   s   e Zd Zdd ZdS )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                   @   s   e Zd Zdd ZdS )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                   @   s   e Zd ZdS )r	   Nr   r   r   r   r   r	      s   r	   c                   @   s   e Zd ZdS )r
   Nr   r   r   r   r   r
      s   r
   c                   @   s   e Zd ZdS )r   Nr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )r   Nr   r   r   r   r   r      s   r   c                 C   s>   t j| \}}||fdkr6|  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    r.   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   ..)r1   r2   )Zbindatar   r   r   _quote_periods   s    r6   c                 C   s   t dt| S )Nr/   r0   r4   r   r   r   	_fix_eols   s    r7   FTc                   @   sv  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dMddZdd ZdNddZdd ZdOddZdPddZdQddZd d! ZdRd"d#Zd$d% Zd&d' Zd(d) ZdSd+d,Z dTd-d.Z!d/d0 Z"d1d2 Z#e#Z$d3d4 Z%d5d6 Z&d7d8d9d:Z'dUd;d<Z(dVd=d>Z)dWd?d@Z*d7d8dAdBZ+dXdCdDZ,dYdEdFZ-dZdGdHZ.dIdJ Z/dKdL Z0dS )[r   r   Nehlor%   c           
      C   s   || _ || _i | _d| _|| _d| _|rR| ||\}}|dkrR|   t|||d urb|| _	nNt
 }d|v rz|| _	n6d}	zt
t
 }	W n t
jy   Y n0 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portrD   r=   r@   r   r   Zfqdnr-   r   r   r   r       s,    
zSMTP.__init__c                 C   s   | S r   r   r   r   r   r   	__enter__  s    zSMTP.__enter__c                 G   sT   zDz$|  d\}}|dkr$t||W n ty8   Y n0 W |   n
|   0 d S )NZQUIT   )docmdr   r   rC   )r   r   r   messager   r   r   __exit__  s    zSMTP.__exit__c                 C   s
   || _ d S r   )
debuglevel)r   rR   r   r   r   set_debuglevel"  s    zSMTP.set_debuglevelc                 G   sB   | j dkr.ttj  g|R dtji nt|dtji d S )N   file)rR   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r2| d||f| j t||f|| jS )N0Non-blocking socket (timeout=0) is not supportedr   zconnect: to)
ValueErrorrR   r\   r@   rE   create_connection)r   rJ   rK   r=   r   r   r   _get_socket1  s    
zSMTP._get_socket	localhostc                 C   s   |r
|| _ |sz|d|dkrz|d}|dkrz|d | ||d d   }}zt|}W n tyx   tdY n0 |s| j}td| || | 	||| j
| _d | _|  \}}| jdkr| dt| ||fS )N:r   rT   znonnumeric portzsmtplib.connectconnect:)r@   findrfindintr^   OSErrordefault_portrY   auditr`   r=   sockrU   getreplyrR   r\   repr)r   rJ   rK   r@   ir   r   r   r   r   rB   ;  s&    

zSMTP.connectc                 C   s   | j dkr| dt| | jrzt|tr6|| j}t	d| | z| j
| W q tyv   |   tdY q0 ntdd S )Nr   zsend:zsmtplib.sendServer not connectedzplease run connect() first)rR   r\   rl   rj   
isinstancestrencoder?   rY   ri   sendallrg   rC   r   )r   sr   r   r   send\  s    

z	SMTP.sendc                 C   sd   |dkr|}n| d| }d|v s,d|v rN| dd dd}td| | | t  d S )Nr%    
z\nz\rz=command and arguments contain prohibited newline characters: )replacer^   rt   r3   )r   cmdr   rs   r   r   r   putcmdo  s    zSMTP.putcmdc              
   C   sP  g }| j d u r| jd| _ z| j td }W n< tyl } z$|   tdt| W Y d }~n
d }~0 0 |s|   td| j	dkr| 
dt| t|tkr|   tdd||d	d  d
 |d d }zt|}W n ty   d}Y q Y n0 |dd	 dkrq qd|}| j	dkrH| 
d||f  ||fS )NrbrT   z Connection unexpectedly closed: zConnection unexpectedly closedr   zreply:i  zLine too long.   s    	
      -   
zreply: retcode (%s); Msg: %a)rU   rj   makefilereadline_MAXLINErg   rC   r   rp   rR   r\   rl   lenr   appendr*   rf   r^   join)r   resplineer   Zerrcodeerrmsgr   r   r   rk   |  s>    



zSMTP.getreplyc                 C   s   |  || |  S r   rz   rk   )r   ry   r   r   r   r   rO     s    z
SMTP.docmdc                 C   s,   |  d|p| j |  \}}|| _||fS )Nhelo)rz   rD   rk   	helo_resp)r   namer   r   r   r   r   r     s    z	SMTP.heloc           
      C   s.  i | _ | | j|p| j |  \}}|dkrJt|dkrJ|   td|| _|dkr`||fS d| _	| j
dd}|d= |D ]}t|}|r| j dd	d
 |dd  | j d< qtd|}|r|d }|j|dd   }	|dkr| j |d	d
 |	 | j |< q|	| j |< q||fS )Nr~   r   rn      rT   zlatin-1rw   authr%   ru   z((?P<feature>[A-Za-z0-9][A-Za-z0-9\-]*) ?feature)r>   rz   ehlo_msgrD   rk   r   rC   r   	ehlo_resp
does_esmtpdecodesplitOLDSTYLE_AUTHmatchgetgroupsr1   grouplowerstringendr*   )
r   r   r   r   r   eachZ
auth_matchmr   paramsr   r   r   r8     sB    


z	SMTP.ehloc                 C   s   |  | jv S r   )r   r>   )r   optr   r   r   has_extn  s    zSMTP.has_extnc                 C   s   |  d| |  d S )NhelprT   r   r[   r   r   r   r     s    z	SMTP.helpc                 C   s   d| _ | dS )Nr9   rset)r?   rO   rL   r   r   r   r     s    z	SMTP.rsetc                 C   s$   z|    W n ty   Y n0 d S r   )r   r   rL   r   r   r   _rset  s    z
SMTP._rsetc                 C   s
   |  dS )Nnoop)rO   rL   r   r   r   r     s    z	SMTP.noopr   c                 C   sh   d}|rH| j rHtdd |D r:| dr2d| _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>      zSMTP.mail.<locals>.<genexpr>r   zutf-8z SMTPUTF8 not supported by serverru   mailz	FROM:%s%s)	r   anyr   r?   r   r   rz   r   rk   )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%   ru   rcptzTO:%s%s)r   r   rz   r   rk   )r   Zrecipr   r   r   r   r   r   $  s
    
z	SMTP.rcptc                 C   s   |  d |  \}}| jdkr0| d||f |dkrDt||n|t|tr\t|d}t	|}|dd  t
kr||t
 }|d t
 }| | |  \}}| jdkr| d||f ||fS d S )Nr5   r   zdata:ib  r9      .)rz   rk   rR   r\   r	   ro   rp   r7   rq   r6   bCRLFrt   )r   r   r   replqr   r   r   r5   ,  s"    





z	SMTP.datac                 C   s   |  dt| |  S )Nvrfyrz   r.   rk   r   addressr   r   r   verifyI  s    zSMTP.verifyc                 C   s   |  dt| |  S )Nexpnr   r   r   r   r   r   P  s    z	SMTP.expnc                 C   sb   | j d u r^| jd u r^d|  d   kr0dks^n |  \}}d|  krRdks^n t||d S )N   r   i+  )r   r   r8   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rPt|ddd}| d|d | \}}d| _n| d|\}}d| _|dkr|  jd7  _t|}t||ddd}| |\}}| jtkrftd	t	||f qf|d
v r||fS t
||d S )Nr9   r%   )ZeolZAUTHru   rT   r   iN  z4Server AUTH mechanism infinite loop. Last response:    i  )upperencode_base64rq   rO   rA   base64Zdecodebytes_MAXCHALLENGEr   rl   r   )	r   Z	mechanismZ
authobjectr   Zinitial_responseresponser   r   	challenger   r   r   r   h  s0    


z	SMTP.authc                 C   s0   |d u rd S | j d t| jd|d  S )Nru   r9   md5)userhmacZHMACpasswordrq   	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 d S )N   )rA   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 }|sNtd|| | _| _|D ]v}d| 	dd	 }z4| j
|t| ||d
\}}	|dv r||	fW   S W q` ty }
 z|
}W Y d }
~
q`d }
~
0 0 q`|d S )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   r>   r   r   r   r   r   rx   r   getattrr   )r   r   r   r   Zpreferred_authsZauthlistZ
authmethodZmethod_namer   r   r   Zlast_exceptionr   r   r   login  s.    


z
SMTP.loginc                 C   s   |    | dstd| d\}}|dkrts<td|d urT|d urTtd|d url|d urltd|d us||d urdd l}|d	t	d
 |d u rt
j||d}|j| j| jd| _d | _d | _d | _i | _d| _n
t||||fS )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_hostname)r   r   r   rO   	_have_sslRuntimeErrorr^   warningswarnDeprecationWarningssl_create_stdlib_contextwrap_socketrj   r<   rU   r   r   r>   r   r   )r   r   r   contextr   Zreplyr   r   r   r   r     s@    

zSMTP.starttlsc                 C   s^  |    g }t|tr$t|d}| jrZ| drF|dt|  |D ]}|| qJ| 	||\}}	|dkr|dkr| 
  n|   t||	|i }
t|tr|g}|D ]H}| ||\}}	|dkr|dkr||	f|
|< |dkr| 
  t|
qt|
t|kr|   t|
| |\}}	|dkrZ|dkrH| 
  n|   t||	|
S )Nr9   sizezsize=%dr   i     )r   ro   rp   r7   rq   r   r   r   r   r   rC   r   r   r   r   r5   r	   )r   	from_addrto_addrsr   mail_optionsrcpt_optionsZ
esmtp_optsoptionr   r   Zsenderrsr   r   r   r   sendmail(  sF    @








zSMTP.sendmailc                 C   s  |    |d}|d u r d}nt|dkr2d}ntd|d u r||d |v rZ||d  n
||d  }tj|gd d }|d u rd	d
 ||d  ||d  ||d  fD }dd
 tj|D }t|}	|	d= |	d= d}
zd|g|	d W n, t
y&   | dstdd}
Y n0 t f}|
rftjj||jjddd}g |ddR }ntj|}|j|	dd | }W d    n1 s0    Y  | |||||S )NzResent-Dater%   rT   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 )rT   r   )r   ar   r   r   r     r   z
Resent-BccFr9   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   r^   r'   r(   Zgetaddressescopyr   rq   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  sV    







(zSMTP.send_messagec                 C   sT   z4| j }d | _ |r|  W | j}d | _|rP|  n| j}d | _|rN|  0 d S r   )rU   rC   rj   )r   rU   rj   r   r   r   rC     s    

z
SMTP.closec                 C   s.   |  d}d  | _| _i | _d| _|   |S )NquitF)rO   r   r   r>   r   rC   )r   resr   r   r   r    s    
z	SMTP.quit)ra   r   N)r%   )r%   )r%   )r%   )r%   )r   )r   )N)N)N)NNN)r   r   )NNr   r   )1r   r   r   rR   rj   rU   r   r   r   r   	SMTP_PORTrh   rE   _GLOBAL_DEFAULT_TIMEOUTr    rM   rQ   rS   r\   r`   rB   rt   rz   rk   rO   r   r8   r   r   r   r   r   r   r   r5   r   r   r   r   r   r   r   r   r   r   r   r  rC   r  r   r   r   r   r      sd   
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r0|d ur0t d|d us@|d urVdd l}	|	dtd || _|| _|d u rxtj||d}|| _t	
| ||||| d S )Nr   r   r   r   r   r   )r^   r   r   r   r   r   r   r   r   r   r    )
r   rJ   rK   rD   r   r   r=   r@   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   rc   r   )rR   r\   superr`   r   r   r<   )r   rJ   rK   r=   Z
new_socket	__class__r   r   r`     s    
zSMTP_SSL._get_socket)
r   r   r   SMTP_SSL_PORTrh   rE   r  r    r`   __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)rD   r@   r=   )r  r    )r   rJ   rK   rD   r@   r=   r  r   r   r    <  s    zLMTP.__init__ra   r   c                    s   |d dkrt  j|||dS | jd ur6| js6tdzBttjtj| _| jtjurd| j	| j d | _
| j| W n@ ty   | jdkr| d| | jr| j  d | _ Y n0 |  \}}| jdkr| d| ||fS )Nr   /)r@   r]   zconnect fail:rc   )r  rB   r=   r^   rE   AF_UNIXSOCK_STREAMrj   r  
settimeoutrU   rg   rR   r\   rC   rk   )r   rJ   rK   r@   r   r   r  r   r   rB   B  s*    


zLMTP.connect)ra   r   N)
r   r   r   r   	LMTP_PORTrE   r  r    rB   r  r   r   r  r   r  ,  s
   r  __main__c                 C   s(   t j| d  t j  t j  S )Nz: )rY   stdoutwriteflushstdinr   r*   )promptr   r   r   r  a  s    
r  r   r   ,zEnter message, end with ^D:r%   zMessage length is %dra   rT   )@rE   r   r1   Zemail.utilsr'   Zemail.messageZemail.generatorr   r   r   rW   rY   Zemail.base64mimer   r   __all__r  r
  r3   r   r   r   compileIr   rg   r   r   r   r   r   r   r	   r
   r   r   r   r.   r   r6   r7   r   ImportErrorr   r   r  r   r  r  r   r  Zfromaddrr   ZtoaddrsrV   r   r  r   r   r   ZserverrS   r   r  r   r   r   r   <module>,   s   	
      </
4


