o
    ˷e-                     @   s   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m	Z	 d dl
mZ zd dlmZ W n ey=   d dlZY nw eeZdZi Zg ae dZdd	d
Zdd ZG dd deZdS )    N)ResponseError)BaseEmailBackend)settings)datetime	timedelta)sleep)
SESBackend
django_sesc                 C   sJ   zddl }W n
 ty   Y | S w |r#|r#|j| ||||d}||  } | S )zGReturn signed email message if dkim package and settings are available.r   N)include_headers)dkimImportErrorsign)messagedkim_domaindkim_keydkim_selectordkim_headersr   sig r   J/var/www/ideatree/venv/lib/python3.10/site-packages/django_ses/__init__.py	dkim_sign    s   	r   c                 C   s   | sdS t | S )z:Cast nonzero number to float; on zero or None, return NoneN)float)valr   r   r   cast_nonzero_to_float1   s   r   c                       sL   e Zd ZdZ					d fdd	Zdd Zdd	 Zd
d Zdd Z  Z	S )r   zDA Django Email backend that uses Amazon's Simple Email Service.
    FNc                    s   t t| jdd|i| |ptj| _|ptj| _|ptj| _	|r#|ntj
| _|r+|ntj| _t|p4tj| _|p;tj| _|	pAtj| _|
pGtj| _|pMtj| _|pStj| _|pYtj| _|p_tj| _|petj| _ d | _!d S )Nfail_silentlyr   )"superr   __init__r   
ACCESS_KEY_access_key_id
SECRET_KEY_access_keySESSION_TOKEN_session_tokenAWS_SES_REGION_NAME_region_nameAWS_SES_REGION_ENDPOINT_URL_endpoint_urlr   AWS_SES_AUTO_THROTTLE	_throttleAWS_SES_CONFIG_configDKIM_DOMAINr   DKIM_PRIVATE_KEYr   DKIM_SELECTORr   DKIM_HEADERSr   AWS_SES_SOURCE_ARNses_source_arnAWS_SES_FROM_ARNses_from_arnAWS_SES_RETURN_PATH_ARNses_return_path_arn
connection)selfr   aws_access_keyaws_secret_keyaws_session_tokenaws_region_nameaws_region_endpointaws_auto_throttle
aws_configr   r   r   r   r0   r2   r4   kwargs	__class__r   r   r   <   s    
zSESBackend.__init__c              	   C   sT   | j rdS ztjd| j| j| j| j| j| jd| _ W dS  t	y)   | j
s& Y dS w )zkCreate a connection to the AWS API server. This can be reused for
        sending multiple emails.
        Fses)aws_access_key_idaws_secret_access_keyr9   region_nameendpoint_urlconfigN)r5   boto3clientr   r    r"   r$   r&   r*   	Exceptionr   r6   r   r   r   openW   s"   
zSESBackend.openc                 C   s
   d| _ dS )z;Close any open HTTP connections to the API server.
        N)r5   rJ   r   r   r   closem   s   
zSESBackend.closec                 C   s  |sdS |   }| jsdS d}tj}|D ]E}tjr<d|jvr<ttjr6tj|| j| j| j	| j
d|jd< ntj|jd< | jrt }|  }td| d}|t|d }	g }
tD ]}||	krg|
| q\|
at|
|| | j kr||
d  }|j|j|jd d	  d
  d
 }|| }|dkrt| t| t|p|j| dt|  | j| j| j	| j
did}| j r| j |d< | j!r| j!|d< | j"r| j"|d< z]| jj#di |}d|jd< |d |jd< |d d |jd< |d7 }d|jv rtd|jd$| |jd |jd |jd  ntd|jd$| |jd |jd  W q t%yZ } zg d}|D ]}t&||d|j|< q>| j'sP W Y d}~qd}~ww |rb| (  |S )zfSends one or more EmailMessage objects and returns the number of
        email messages sent.
        Nr   zX-SES-CONFIGURATION-SET)r   r   r   r   z&send_messages.throttle rate_limit='{}'g       @)seconds   i  i@B Data)r   r   r   r   )SourceDestinations
RawMessage	SourceArnFromArnReturnPathArn   status	MessageId
message_idResponseMetadata	RequestId
request_id   zgsend_messages.sent from='{}' recipients='{}' message_id='{}' request_id='{}' ses-configuration-set='{}'z, zLsend_messages.sent from='{}' recipients='{}' message_id='{}' request_id='{}')rW   reasonbodyr\   
error_codeerror_messager   ))rK   r5   r   AWS_SES_RETURN_PATHAWS_SES_CONFIGURATION_SETextra_headerscallabler   r   r   r   r(   r   nowget_rate_limitloggerdebugformatr   recent_send_timesappendlenmicrosecondsrM   daysr   dict
from_email
recipientsr   r   	as_stringr0   r2   r4   send_raw_emailjoinr   getattrr   rL   )r6   email_messagesnew_conn_creatednum_sentsourcer   rf   
rate_limitwindowwindow_startnew_send_timestimedeltatotal_secondsdelayr>   responseerr
error_keyskeyr   r   r   send_messagesr   s   



	







	zSESBackend.send_messagesc                 C   st   | j tv r
t| j  S |  }| jstdz| j }|d }t|}|t| j < |W |r1|   S S |r9|   w w )Nz;No connection is available to check current SES rate limit.MaxSendRate)r   cached_rate_limitsrK   r5   rI   get_send_quotar   rL   )r6   rx   
quota_dictmax_per_secondretr   r   r   rg      s$   





zSESBackend.get_rate_limit)FNNNNNNNNNNNNNN)
__name__
__module____qualname____doc__r   rK   rL   r   rg   __classcell__r   r   r?   r   r   8   s     r   )NNNN)loggingrG   6botocore.vendored.requests.packages.urllib3.exceptionsr   django.core.mail.backends.baser   r	   r   r   r   r   r   importlib.metadatametadataimportlib_metadataModuleNotFoundErrorversionr   __version____all__r   rk   	getLoggerrh   r   r   r   r   r   r   r   <module>   s(    


