
    Vh                     r    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	e      Zy)
zSMTP email backend class.    N)settings)BaseEmailBackend)sanitize_address)DNS_NAME)cached_propertyc                   p     e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d	 fd	Zed        Zed        Zd Z	d Z
d Zd Z xZS )
EmailBackendz=
    A wrapper that manages the SMTP network connection.
    c                 n   t         |   |       |xs t        j                  | _        |xs t        j
                  | _        |t        j                  n|| _        |t        j                  n|| _
        |t        j                  n|| _        |t        j                  n|| _        |t        j                  n|| _        |	t        j"                  n|	| _        |
t        j&                  n|
| _        | j                  r| j                  rt+        d      d | _        t/        j0                         | _        y )N)fail_silentlyz^EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusive, so only set one of those settings to True.)super__init__r   
EMAIL_HOSThost
EMAIL_PORTportEMAIL_HOST_USERusernameEMAIL_HOST_PASSWORDpasswordEMAIL_USE_TLSuse_tlsEMAIL_USE_SSLuse_sslEMAIL_TIMEOUTtimeoutEMAIL_SSL_KEYFILEssl_keyfileEMAIL_SSL_CERTFILEssl_certfile
ValueError
connection	threadingRLock_lock)selfr   r   r   r   r   r   r   r   r   r   kwargs	__class__s               N/home/dcms/DCMS/lib/python3.12/site-packages/django/core/mail/backends/smtp.pyr   zEmailBackend.__init__   s    	}5/H//	/H//	4<4D00(8@8H44h18x--g18x--g18x--g*5*=H&&; 	 ,8+?H''\ 	 <<DLL1  __&
    c                 Z    | j                   rt        j                  S t        j                  S )N)r   smtplibSMTP_SSLSMTPr%   s    r(   connection_classzEmailBackend.connection_class7   s    #'<<wAW\\Ar)   c                     | j                   s| j                  rLt        j                  t        j                        }|j                  | j                   | j                         |S t        j                         S )N)protocol)r   r   ssl
SSLContextPROTOCOL_TLS_CLIENTload_cert_chaincreate_default_context)r%   ssl_contexts     r(   r7   zEmailBackend.ssl_context;   sX     0 0..#2I2IJK''(9(94;K;KL--//r)   c                 V   | j                   rydt        j                         i}| j                  | j                  |d<   | j                  r| j
                  |d<   	  | j                  | j                  | j                  fi || _         | j                  s2| j                  r&| j                   j                  | j
                         | j                  r<| j                  r0| j                   j                  | j                  | j                         y# t        $ r | j                  s Y yw xY w)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.
        Flocal_hostnameNr   context)r:   T)r!   r   get_fqdnr   r   r7   r/   r   r   r   starttlsr   r   loginOSErrorr   )r%   connection_paramss     r(   openzEmailBackend.openD   s     ?? .x/@/@/BC<<#+/<<i(<<+/+;+;i(	3d33		499(9DO <<DLL((1A1A(B}}%%dmmT]]C 	%% &	s   B3D D('D(c                 R   | j                   y	 	 | j                   j                          d| _         y# t        j                  t        j
                  f$ r | j                   j                          Y Gt        j                  $ r | j                  r	Y d| _         y w xY w# d| _         w xY w)z)Close the connection to the email server.N)	r!   quitr2   SSLErrorr+   SMTPServerDisconnectedcloseSMTPExceptionr   r.   s    r(   rE   zEmailBackend.closee   s    ??"	#
$$& #DO LL'"@"@A ( %%'(( %% #DO 
 #DOs-   2 =B/B 1BB BB 	B&c                 >   |sy| j                   5  | j                         }| j                  r|
	 ddd       yd}	 |D ]  }| j                  |      }|s|dz  } 	 |r| j	                          	 ddd       |S # |r| j	                          w w xY w# 1 sw Y   S xY w)zm
        Send one or more EmailMessage objects and return the number of email
        messages sent.
        r   N   )r$   r@   r!   _sendrE   )r%   email_messagesnew_conn_creatednum_sentmessagesents         r(   send_messageszEmailBackend.send_messagesx   s    
 ZZ 	!#yy{??&6&> 	! 	! H!- &G::g.D A&
 $JJL	!  $JJL $	! s-    BBA:A:B:BBBc                    |j                         sy|j                  xs t        j                  }t	        |j
                  |      }|j                         D cg c]  }t	        ||       }}|j                         }	 | j                  j                  |||j                  d             yc c}w # t        j                  $ r | j                  s Y yw xY w)z-A helper method that does the actual sending.Fz
)linesepT)
recipientsencodingr   DEFAULT_CHARSETr   
from_emailrM   r!   sendmailas_bytesr+   rF   r   )r%   email_messagerS   rU   addrrR   rM   s          r(   rI   zEmailBackend._send   s    '') ))EX-E-E%m&>&>I
9F9Q9Q9S
15T8,

 
  '')	OO$$J(8(8(8(H 
 $$ 	%%	s   B,>-B1 1 CC)
NNNNNFNNNN)__name__
__module____qualname____doc__r   propertyr/   r   r7   r@   rE   rO   rI   __classcell__)r'   s   @r(   r	   r	      sm     "'H B B 0 0B#&0r)   r	   )r]   r+   r2   r"   django.confr   django.core.mail.backends.baser   django.core.mail.messager   django.core.mail.utilsr   django.utils.functionalr   r	    r)   r(   <module>rf      s/      
    ; 5 + 3T# Tr)   