a
    Lcòfl  ã                   @   sl   d 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 G dd	„ d	eƒZdS )
zSMTP email backend class.é    N)Úsettings)ÚBaseEmailBackend©Úsanitize_address)ÚDNS_NAME)Úcached_propertyc                
       sZ   e Zd ZdZd‡ fdd„	Zedd„ ƒZe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                    sÚ   t ƒ j|d� |ptj| _|p"tj| _|d u r4tjn|| _|d u rHtj	n|| _
|d u r\tjn|| _|d u rptjn|| _|d u r„tjn|| _|	d u r˜tjn|	| _|
d u r¬tjn|
| _| jrÆ| jrÆtdƒ‚d | _t ¡ | _d S )N)Úfail_silentlyz^EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusive, so only set one of those settings to True.)ÚsuperÚ__init__r   Z
EMAIL_HOSTÚhostZ
EMAIL_PORTÚportZEMAIL_HOST_USERÚusernameZEMAIL_HOST_PASSWORDÚpasswordZEMAIL_USE_TLSÚuse_tlsZEMAIL_USE_SSLÚuse_sslZEMAIL_TIMEOUTÚtimeoutZEMAIL_SSL_KEYFILEÚssl_keyfileZEMAIL_SSL_CERTFILEÚssl_certfileÚ
ValueErrorÚ
connectionÚ	threadingÚRLockÚ_lock)Úselfr   r   r   r   r   r	   r   r   r   r   Úkwargs©Ú	__class__© ú[/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/mail/backends/smtp.pyr      s$    ÿÿÿzEmailBackend.__init__c                 C   s   | j rtjS tjS )N)r   ÚsmtplibZSMTP_SSLÚSMTP©r   r   r   r   Úconnection_class6   s    zEmailBackend.connection_classc                 C   s:   | j s| jr.tjtjd�}| | j | j¡ |S t ¡ S d S )N)Úprotocol)r   r   ÚsslÚ
SSLContextÚPROTOCOL_TLS_CLIENTÚload_cert_chainÚcreate_default_context)r   Ússl_contextr   r   r   r*   :   s
    zEmailBackend.ssl_contextc                 C   s´   | j r
dS dt ¡ i}| jdur*| j|d< | jr:| j|d< zZ| j| j| jfi |¤Ž| _ | jsr| j	rr| j j
| jd� | jr�| jr�| j  | j| j¡ W dS  ty®   | jsª‚ Y n0 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.
        FZlocal_hostnameNr   Úcontext)r+   T)r   r   Zget_fqdnr   r   r*   r#   r   r   r   Ústarttlsr   r   ÚloginÚOSErrorr	   )r   Zconnection_paramsr   r   r   ÚopenC   s*    


ÿÿzEmailBackend.openc              	   C   s‚   | j du rdS zfz| j  ¡  W nL tjtjfyB   | j  ¡  Y n* tjyj   | jrdY W d| _ dS ‚ Y n0 W d| _ nd| _ 0 dS )z)Close the connection to the email server.N)	r   Úquitr%   ÚSSLErrorr    ZSMTPServerDisconnectedÚcloseÚSMTPExceptionr	   r"   r   r   r   r2   d   s    
ý
zEmailBackend.closec                 C   sˆ   |sdS | j �f |  ¡ }| jr&|du r6W d  ƒ dS d}|D ]}|  |¡}|r>|d7 }q>|rf|  ¡  W d  ƒ n1 sz0    Y  |S )zm
        Send one or more EmailMessage objects and return the number of email
        messages sent.
        r   Né   )r   r/   r   Ú_sendr2   )r   Zemail_messagesZnew_conn_createdZnum_sentÚmessageÚsentr   r   r   Úsend_messagesw   s    

&zEmailBackend.send_messagesc                    s‚   |  ¡ sdS |jptj‰ t|jˆ ƒ}‡ fdd„|  ¡ D ƒ}| ¡ }z| j |||j	dd�¡ W n t
jy|   | jsv‚ Y dS 0 dS )z-A helper method that does the actual sending.Fc                    s   g | ]}t |ˆ ƒ‘qS r   r   )Ú.0Úaddr©Úencodingr   r   Ú
<listcomp>“   s   z&EmailBackend._send.<locals>.<listcomp>z
)ÚlinesepT)Ú
recipientsr<   r   ÚDEFAULT_CHARSETr   Ú
from_emailr6   r   ZsendmailÚas_bytesr    r3   r	   )r   Zemail_messagerA   r?   r6   r   r;   r   r5   �   s"    
ÿÿzEmailBackend._send)
NNNNNFNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr#   r   r*   r/   r2   r8   r5   Ú__classcell__r   r   r   r   r      s(             õ$

!r   )rF   r    r%   r   Zdjango.confr   Zdjango.core.mail.backends.baser   Zdjango.core.mail.messager   Zdjango.core.mail.utilsr   Zdjango.utils.functionalr   r   r   r   r   r   Ú<module>   s   