B
    CDb  ã               @   sˆ   d 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lm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ G d	d
„ d
e	ƒZdS )zSMTP email backend class.é    N)Úsettings)ÚBaseEmailBackend)Úsanitize_address)Ú	force_str)Údb_const)Úaes_decryptc                   sJ   e Zd ZdZd‡ fdd„	Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	‡  Z
S )ÚEmailBackendz=
    A wrapper that manages the SMTP network connection.
    NFc	       
         sx   t t| ƒj|d || _|| _|| _|| _|| _|| _|| _	|	 
dd¡| _t| jtƒs\d| _|  ¡  d | _t ¡ | _d S )N)Úfail_silentlyÚverboseF)Úsuperr   Ú__init__ÚhostÚportÚusernameÚpasswordÚuse_tlsÚuse_sslÚtimeoutÚgetÚ_verboseÚ
isinstanceÚboolÚ_get_email_settingÚ
connectionÚ	threadingÚRLockÚ_lock)
Úselfr   r   r   r   r   r	   r   r   Úkwargs)Ú	__class__© ú8G:\easytimepro\master/mysite/base\backends\email_smtp.pyr      s    zEmailBackend.__init__c          
   C   sŒ  ddl m} ddlm} | ¡ }|d k	r>|jjd|d ¡ }n|jjdd ¡ }|d k	r®t 	|j
¡}d|kr²yt|d ƒ|d< W q² tk
rª } zt|ƒ W d d }~X Y q²X ni }tj}x¶|D ]®}t| |d ƒ}|d k	rØq¾| |¡}	|	j|	j|	j  }
}}t|
ƒdkrN| |
d ¡}|
d k	rB|r4t|ƒr4||ƒ}t| ||ƒ q¾t| ||ƒ | jr¾tjr¾t|d	t| |ƒƒ q¾W | jrˆ| jrˆtd
ƒ‚d S )Nr   )ÚSystemSetting)ÚthreadlocalsZemail_setting)ÚnameÚ
company_idZzklicense_email)r$   Zemail_passwordú=z^EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusive, so only set one of those settings to True.)Zmysite.base.modelsr"   Úmysite.baser#   Zget_current_company_idZobjectsÚfilterÚfirstÚjsonÚloadsÚvaluer   Ú	ExceptionÚprintr   ZSMTP_NECESSARY_FIELDÚgetattrr   ÚfieldÚdefaultÚsentryÚlenÚcallableÚsetattrr   r   ÚDEBUGr   r   Ú
ValueError)r   r"   r#   r%   ZesÚeZ	necessaryr0   Zvalue_from_argsÚmappingZdb_fieldZdefault_valuer2   Zdb_valuer    r    r!   r   ,   sF    


zEmailBackend._get_email_settingc          	   C   s    | j r
dS yl| jr&t | j| j¡| _ nt | j| j¡| _ | jsN| jrN| j  ¡  | j	rt| j
rt| j  t| j	ƒt| j
ƒ¡ dS  tjtjfk
rš   | js–‚ Y nX dS )z½
        Ensure an open connection to the email server. Return whether or not a
        new connection was required (True or False) or None if an exception
        passed silently.
        FTN)r   r   ÚsmtplibZSMTP_SSLr   r   ZSMTPr   Zstarttlsr   r   Zloginr   ÚSMTPExceptionÚsocketÚerrorr	   )r   r    r    r!   Úopen_   s    
zEmailBackend.openc          	   C   sv   | j dkrdS zZy| j  ¡  W nF tjtjfk
rD   | j  ¡  Y n" tjk
rd   | jr^dS ‚ Y nX W dd| _ X dS )z*Closes the connection to the email server.N)	r   ÚquitÚsslZSSLErrorr:   ZSMTPServerDisconnectedÚcloser;   r	   )r   r    r    r!   rA   …   s    
zEmailBackend.closec          	   C   sl   |sdS | j T |  ¡ }| jr&|dkr*dS d}x"|D ]}|  |¡}|r4|d7 }q4W |r^|  ¡  W dQ R X |S )zo
        Sends one or more EmailMessage objects and returns the number of email
        messages sent.
        Nr   é   )r   r>   r   Ú_sendrA   )r   Zemail_messagesZnew_conn_createdZnum_sentÚmessageZsentr    r    r!   Úsend_messages˜   s    

zEmailBackend.send_messagesc                s‚   |  ¡ sdS |jptj‰ t|jˆ ƒ}‡ fdd„|  ¡ D ƒ}| ¡ }y| j |||j	dd¡ W n t
jk
r|   | jsx‚ dS X dS )z-A helper method that does the actual sending.Fc                s   g | ]}t |ˆ ƒ‘qS r    )r   )Ú.0Zaddr)Úencodingr    r!   ú
<listcomp>´   s    z&EmailBackend._send.<locals>.<listcomp>z
)ÚlinesepT)Ú
recipientsrG   r   ZDEFAULT_CHARSETr   Ú
from_emailrD   r   ZsendmailZas_bytesr:   r;   r	   )r   Zemail_messagerK   rJ   rD   r    )rG   r!   rC   ®   s    zEmailBackend._send)NNNNNFNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r>   rA   rE   rC   Ú__classcell__r    r    )r   r!   r      s    3&r   )rO   r*   r:   r<   r@   r   Zdjango.confr   Zdjango.core.mail.backends.baser   Zdjango.core.mail.messager   Zdjango.utils.encodingr   r'   r   Zmysite.tools.encryption_utilsr   r   r    r    r    r!   Ú<module>   s   