???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \                 @   sj  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 ddddddd	d
ddddgZdZdZdZdZdZej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'yd dl(Z(W n e)k
r   d(Z*Y nX d)Z*G d*d dZ+e*rG d+d, d,e+Z,ej-d, d-Z.G d.d/ d/e+Z/e0d0krfd1d2 Z1e1d3Z2e1d4j3d5Z4e5d6 d7Z6x ej7j8 Z9e9s P e6e9 Z6qW e5d8e:e6  e+d9Z;e;j<d: e;j=e2e4e6 e;j>  dS );    N)body_encodeSMTPExceptionSMTPServerDisconnectedSMTPResponseExceptionSMTPSenderRefusedSMTPRecipientsRefusedSMTPDataErrorSMTPConnectErrorSMTPHeloErrorSMTPAuthenticationError	quoteaddr	quotedataSMTP   i  z
s   
i    z	auth=(.*)c               @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   /usr/lib64/python3.6/smtplib.pyr   G   s   c               @   s   e Zd ZdS )SMTPNotSupportedErrorN)r   r   r   r   r   r   r   r   J   s   r   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r   Q   s   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__b   s    zSMTPResponseException.__init__N)r   r   r   r   r   r   r   r   r   Y   s   	c               @   s   e Zd Zdd ZdS )r   c             C   s"   || _ || _|| _|||f| _d S )N)r   r   senderr   )r   r   r   r   r   r   r   r   n   s    zSMTPSenderRefused.__init__N)r   r   r   r   r   r   r   r   r   g   s   c               @   s   e Zd Zdd ZdS )r   c             C   s   || _ |f| _d S )N)
recipientsr   )r   r   r   r   r   r   |   s    zSMTPRecipientsRefused.__init__N)r   r   r   r   r   r   r   r   r   t   s   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r      s   c               @   s   e Zd ZdS )r	   N)r   r   r   r   r   r   r   r	      s   c               @   s   e Zd ZdS )r
   N)r   r   r   r   r   r   r   r
      s   c               @   s   e Zd ZdS )r   N)r   r   r   r   r   r   r   r      s   c             C   s>   t jj| \}}||fdkr6| j jdr.| S d|  S d| S )N <z<%s>)r   r   )emailutils	parseaddrstrip
startswith)
addrstringdisplaynameaddrr   r   r   r      s    c             C   s$   t jj| \}}||fdkr | S |S )Nr   )r   r   )r!   r"   r#   )r&   r'   r(   r   r   r   
_addr_only   s    r)   c             C   s   t jddt jdt| S )Nz(?m)^\.z..z(?:\r\n|\n|\r(?!\n)))resubCRLF)datar   r   r   r      s    c             C   s   t jdd| S )Ns   (?m)^\.s   ..)r*   r+   )Zbindatar   r   r   _quote_periods   s    r.   c             C   s   t jdt| S )Nz(?:\r\n|\n|\r(?!\n)))r*   r+   r,   )r-   r   r   r   	_fix_eols   s    r/   FTc               @   s  e 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dLddZdd ZdMddZdd ZdNddZdOddZdPddZd d! ZdQd"d#Zd$d% Zd&d' Zd(d) Zf fd*d+Zf fd,d-Z d.d/ Z!d0d1 Z"e"Z#d2d3 Z$d4d5 Z%d6d7d8d9Z&dRd:d;Z'dSd<d=Z(dTd>d?Z)d6d7d@dAZ*dUdBdCZ+f f fdDdEZ,ddf f fdFdGZ-dHdI Z.dJdK Z/dS )Vr   r   Nehlor   c       
      C   s   || _ || _i | _d| _|| _|rL| j||\}}|dkrL| j  t|||d k	r\|| _nPt	j
 }d|krt|| _n8d}	yt	jt	j }	W n t	jk
r   Y nX d|	 | _d S )Nascii   .z	127.0.0.1z[%s])_hosttimeoutesmtp_featurescommand_encodingsource_addressconnectcloser	   local_hostnamesocketZgetfqdnZgethostbynameZgethostnameZgaierror)
r   hostportr;   r5   r8   r   r   Zfqdnr(   r   r   r   r      s*    
zSMTP.__init__c             C   s   | S )Nr   )r   r   r   r   	__enter__  s    zSMTP.__enter__c             G   sN   z>y$| j d\}}|dkr$t||W n tk
r:   Y nX W d | j  X d S )NZQUIT   )docmdr   r   r:   )r   r   r   messager   r   r   __exit__  s    
zSMTP.__exit__c             C   s
   || _ d S )N)
debuglevel)r   rD   r   r   r   set_debuglevel  s    zSMTP.set_debuglevelc             G   s@   | j dkr,ttjj j f|dtji nt|dtji d S )N   file)rD   printdatetimeZnowZtimesysstderr)r   r   r   r   r   _print_debug'  s    
"zSMTP._print_debugc             C   s2   | j dkr| jd||f| j tj||f|| jS )Nr   zconnect: to)rD   rL   r8   r<   create_connection)r   r=   r>   r5   r   r   r   _get_socket-  s    
zSMTP._get_socket	localhostc             C   s   |r
|| _ | r~|jd|jdkr~|jd}|dkr~|d | ||d d   }}yt|}W n tk
r|   tdY nX |s| j}| jdkr| jd||f | j	||| j
| _d | _| j \}}| jdkr| jdt| ||fS )N:r   rF   znonnumeric portzconnect:)r8   findrfindint
ValueErrorOSErrordefault_portrD   rL   rN   r5   sockrG   getreplyrepr)r   r=   r>   r8   ir   r   r   r   r   r9   5  s(    


zSMTP.connectc             C   s   | j dkr| jdt| t| drx| jrxt|tr@|j| j}y| jj	| W q t
k
rt   | j  tdY qX ntdd S )Nr   zsend:rW   zServer not connectedzplease run connect() first)rD   rL   rY   hasattrrW   
isinstancestrencoder7   ZsendallrU   r:   r   )r   sr   r   r   sendW  s    

z	SMTP.sendc             C   s2   |dkrd|t f }nd||t f }| j| d S )Nr   z%s%sz%s %s%s)r,   r`   )r   cmdr   r]   r   r   r   putcmdi  s    zSMTP.putcmdc             C   sP  g }| j d kr| jjd| _ x y| j jtd }W n: tk
rn } z| j  tdt| W Y d d }~X nX |s| j  td| j	dkr| j
dt| t|tkr| j  tdd|j|d	d  jd
 |d d }yt|}W n tk
r   d}P Y nX |dd	 dkr P q W dj|}| j	dkrH| j
d||f  ||fS )NrbrF   z Connection unexpectedly closed: zConnection unexpectedly closedr   zreply:i  zLine too long.   s    	
      -   
zreply: retcode (%s); Msg: %a)rG   rW   makefilereadline_MAXLINErU   r:   r   r]   rD   rL   rY   lenr   appendr$   rS   rT   join)r   resplineer   Zerrcodeerrmsgr   r   r   rX   q  s>    



zSMTP.getreplyc             C   s   | j || | j S )N)rb   rX   )r   ra   r   r   r   r   rA     s    z
SMTP.docmdc             C   s,   | j d|p| j | j \}}|| _||fS )Nhelo)rb   r;   rX   	helo_resp)r   namer   r   r   r   r   rs     s    z	SMTP.heloc       
      C   s2  i | _ | j| j|p| j | j \}}|dkrJt|dkrJ| j  td|| _|dkr`||fS d| _	| jj
djd}|d= x|D ]}tj|}|r| j jddd	 |jdd  | j d< qtjd
|}|r|jdj }|j|jdd  j }	|dkr| j j|dd	 |	 | j |< q|	| j |< qW ||fS )NrF   r   zServer not connected   zlatin-1
authr    z((?P<feature>[A-Za-z0-9][A-Za-z0-9\-]*) ?featurerh   )r6   rb   ehlo_msgr;   rX   rl   r:   r   	ehlo_resp
does_esmtpdecodesplitOLDSTYLE_AUTHmatchgetgroupsr*   grouplowerstringendr$   )
r   ru   r   r   ro   eachZ
auth_matchmrz   Zparamsr   r   r   r0     s2    

&
z	SMTP.ehloc             C   s   |j  | jkS )N)r   r6   )r   optr   r   r   has_extn  s    zSMTP.has_extnc             C   s   | j d| | j d S )NhelprF   )rb   rX   )r   r   r   r   r   r     s    z	SMTP.helpc             C   s   d| _ | jdS )Nr1   rset)r7   rA   )r   r   r   r   r     s    z	SMTP.rsetc             C   s&   y| j   W n tk
r    Y nX d S )N)r   r   )r   r   r   r   _rset  s    z
SMTP._rsetc             C   s
   | j dS )Nnoop)rA   )r   r   r   r   r      s    z	SMTP.noopc             C   sh   d}|rH| j rHtdd |D r:| jdr2d| _ntdddj| }| jdd	t||f  | j S )
Nr   c             s   s   | ]}|j  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   r7   r   rn   rb   r   rX   )r   r   options
optionlistr   r   r   r     s    	

z	SMTP.mailc             C   s<   d}|r| j rddj| }| jddt||f  | j S )Nr   ry   rcptzTO:%s%s)r}   rn   rb   r   rX   )r   Zrecipr   r   r   r   r   r     s
    
z	SMTP.rcptc             C   s   | j d | j \}}| jdkr0| jd||f |dkrDt||n|t|tr\t|jd}t	|}|dd  t
kr||t
 }|d t
 }| j| | j \}}| jdkr| jd||f ||fS d S )	Nr-   r   zdata:ib  r1         .)rb   rX   rD   rL   r   r\   r]   r/   r^   r.   bCRLFr`   )r   r   r   replqr   r   r   r-   !  s"    





z	SMTP.datac             C   s   | j dt| | j S )Nvrfy)rb   r)   rX   )r   addressr   r   r   verify>  s    zSMTP.verifyc             C   s   | j dt| | j S )Nexpn)rb   r)   rX   )r   r   r   r   r   r   E  s    z	SMTP.expnc             C   sf   | j d krb| jd krbd| j d   ko.dkn  sb| j \}}d|  koRdkn  sbt||d S )N   r   i+  )rt   r|   r0   rs   r
   )r   r   ro   r   r   r   ehlo_or_helo_if_neededL  s
     zSMTP.ehlo_or_helo_if_neededT)initial_response_okc      	      C   s   |j  }|r| nd }|d k	rJt|jddd}| jd|d | \}}n| jd|\}}|dkrtj|}t||jddd}| j|\}}|d	kr||fS t||d S )
Nr1   r   )ZeolZAUTHry   iN       )r   r   )upperencode_base64r^   rA   base64Zdecodebytesr   )	r   Z	mechanismZ
authobjectr   Zinitial_responseZresponser   ro   	challenger   r   r   rx   ]  s    
z	SMTP.authc             C   s0   |d krd S | j d tj| jjd|dj  S )Nry   r1   Zmd5)userhmacZHMACpasswordr^   Z	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   r   
auth_plain  s    zSMTP.auth_plainc             C   s   |d kr| j S | jS d S )N)r   r   )r   r   r   r   r   
auth_login  s    zSMTP.auth_loginc               s   | j   | jdstd| jd j  dddg} fdd|D }|sPtd|| | _| _xv|D ]n}d	|j j	d
d }y.| j
|t| ||d\}}	|dkr||	fS W qd tk
r }
 z
|
}W Y d d }
~
X qdX qdW |d S )Nrx   z,SMTP AUTH extension not supported by server.zCRAM-MD5ZPLAINZLOGINc                s   g | ]}| kr|qS r   r   )r   rx   )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   r6   r   r   r   r   r   replacerx   getattrr   )r   r   r   r   Zpreferred_authsZauthlistZ
authmethodZmethod_namer   ro   rq   Zlast_exceptionr   )r   r   login  s*    



z
SMTP.loginc             C   s   | j   | jdstd| jd\}}|dkrts<td|d k	rT|d k	rTtd|d k	rl|d k	rltd|d k	s||d k	rdd l}|jd	t	d
 |d k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STARTTLSr2   z&No SSL support included in this Pythonz4context and keyfile arguments are mutually exclusivez5context and certfile arguments are mutually exclusiver   zAkeyfile and certfile are deprecated, use a custom context insteadr   )certfilekeyfile)server_hostname)r   r   r   rA   	_have_sslRuntimeErrorrT   warningswarnDeprecationWarningssl_create_stdlib_contextwrap_socketrW   r4   rG   rt   r|   r6   r}   r   )r   r   r   contextro   Zreplyr   r   r   r   r     s8    

zSMTP.starttlsc             C   sf  | j   g }t|tr$t|jd}| jr^| jdrF|jdt|  x|D ]}|j| qLW | j	||\}}	|dkr|dkr| j
  n| j  t||	|i }
t|tr|g}xP|D ]H}| j||\}}	|dkr|dkr||	f|
|< |dkr| j
  t|
qW t|
t|kr$| j  t|
| j|\}}	|dkrb|dkrP| j
  n| j  t||	|
S )Nr1   sizezsize=%drv   i     )r   r\   r]   r/   r^   r}   r   rm   rl   r   r:   r   r   r   r   r-   r   )r   	from_addrto_addrsr   mail_optionsrcpt_optionsZ
esmtp_optsZoptionr   ro   Zsenderrsr   r   r   r   sendmail  sF    @









zSMTP.sendmailc             C   s  | j   |jd}|d kr d}nt|dkr2d}ntd|d kr||d |krZ||d  n
||d  }tjj|gd d }|d krd	d
 ||d  ||d  ||d  fD }dd
 tjj|D }tj|}	|	d= |	d= d}
ydj|f|j	d W n. t
k
r(   | jds tdd}
Y nX tj R}|
r^tjj||jjddd}|d}ntjj|}|j|	dd |j }W d Q R X | j|||||S )NzResent-Dater   rF   zResent-z0message has more than one 'Resent-' header blockZSenderFromr   c             S   s   g | ]}|d k	r|qS )Nr   )r   fr   r   r   r     s    z%SMTP.send_message.<locals>.<listcomp>ToZBccZCcc             S   s   g | ]}|d  qS )rF   r   )r   ar   r   r   r     s    z
Resent-BccFr1   r   zOne or more source or delivery addresses require internationalized email support, but the server does not advertise the required SMTPUTF8 capabilityT)utf8)policySMTPUTF8BODY=8BITMIMEz
)linesep)r   r   )r   Zget_allrl   rT   r!   r"   Zgetaddressescopyrn   r^   UnicodeEncodeErrorr   r   ioBytesIO	generatorZBytesGeneratorr   ZcloneZflattengetvaluer   )r   r   r   r   r   r   ZresentZheader_prefixZaddr_fieldsZmsg_copyZinternationalZbytesmsggZflatmsgr   r   r   send_message|  sJ    





zSMTP.send_messagec             C   s<   z| j }d | _ |r|j  W d | j}d | _|r6|j  X d S )N)rG   r:   rW   )r   rG   rW   r   r   r   r:     s    z
SMTP.closec             C   s.   | j d}d  | _| _i | _d| _| j  |S )NquitF)rA   r|   rt   r6   r}   r:   )r   resr   r   r   r     s    
z	SMTP.quit)rO   r   N)r   )r   )r   )r   )r   )N)N)N)NNN)0r   r   r   rD   rG   rt   r{   r|   r}   	SMTP_PORTrV   r<   _GLOBAL_DEFAULT_TIMEOUTr   r?   rC   rE   rL   rN   r9   r`   rb   rX   rA   rs   r0   r   r   r   r   r   r   r   r-   r   r   r   r   rx   r   r   r   r   r   r   r   r:   r   r   r   r   r   r      s\   -
	
"
1



3
'
	

B
8gLc               @   s4   e Zd ZeZdddddejddfddZdd ZdS )SMTP_SSLr   r   Nc	       
      C   s   |d k	r|d k	rt d|d k	r0|d k	r0t d|d k	s@|d k	rVdd l}	|	jdtd || _|| _|d krxtj||d}|| _t	j
| ||||| d S )Nz4context and keyfile arguments are mutually exclusivez5context and certfile arguments are mutually exclusiver   zAkeyfile and certfile are deprecated, use a custom context insteadr   )r   r   )rT   r   r   r   r   r   r   r   r   r   r   )
r   r=   r>   r;   r   r   r5   r8   r   r   r   r   r   r     s     zSMTP_SSL.__init__c             C   sD   | j dkr| jd||f tj||f|| j}| jj|| jd}|S )Nr   zconnect:)r   )rD   rL   r<   rM   r8   r   r   r4   )r   r=   r>   r5   Z
new_socketr   r   r   rN   	  s    

zSMTP_SSL._get_socket)	r   r   r   SMTP_SSL_PORTrV   r<   r   r   rN   r   r   r   r   r     s   r   i  c               @   s,   e Zd ZdZdeddfddZd
dd	ZdS )LMTPZlhlor   Nc             C   s   t j| ||||d d S )N)r;   r8   )r   r   )r   r=   r>   r;   r8   r   r   r   r   )  s    zLMTP.__init__rO   r   c             C   s   |d dkrt j| |||dS y(tjtjtj| _d | _| jj| W nB tk
r   | jdkrl| j	d| | jr|| jj
  d | _ Y nX | j \}}| jdkr| j	d| ||fS )Nr   /)r8   zconnect fail:zconnect:)r   r9   r<   ZAF_UNIXZSOCK_STREAMrW   rG   rU   rD   rL   r:   rX   )r   r=   r>   r8   r   r   r   r   r   r9   /  s"    


zLMTP.connect)rO   r   N)r   r   r   r{   	LMTP_PORTr   r9   r   r   r   r   r     s   r   __main__c             C   s(   t jj| d  t jj  t jj j S )Nz: )rJ   stdoutwriteflushstdinrj   r$   )promptr   r   r   r   I  s    
r   r   r   ,zEnter message, end with ^D:r   zMessage length is %drO   rF   )?r<   r   r*   Zemail.utilsr!   Zemail.messageZemail.generatorr   r   r   rI   rJ   Zemail.base64mimer   r   __all__r   r   r,   r   rk   compileIr   rU   r   r   r   r   r   r   r   r	   r
   r   r   r)   r   r.   r/   r   ImportErrorr   r   r   rm   r   r   r   r   Zfromaddrr   ZtoaddrsrH   r   r   rj   rp   rl   ZserverrE   r   r   r   r   r   r   <module>,   s   
	
      )0
/


