o
    ›¨ÊhäC  ã                   @   sL  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
 ddlmZmZ dd	lmZ dd
lmZmZ zd dlZd dlmZ d dlmZmZmZ W n eyY   eddd�‚w eeefZeddd� ¡ dkrpdZdd„ ZnG dd„ deƒZdd„ 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"ej#dfd!d"„Z$dS )#é    )ÚHeader)ÚMIMEBase)ÚBadHeaderErroré   )ÚAnymailBaseBackendÚBasePayloadé   )Ú__version__)ÚAnymailAPIErrorÚAnymailImproperlyInstalled)ÚAnymailRecipientStatus)Úget_anymail_settingÚUNSETN)ÚConfig)ÚBotoCoreErrorÚClientErrorÚConnectionErrorÚboto3Ú
amazon_ses)Úmissing_packageÚbackendztest,Python2,header,comma,bugé   )Ú
maxlinelenc                 C   s   || |< d S ©N© ©ÚmessageÚnameÚvalr   r   úM/var/www/html/env/lib/python3.10/site-packages/anymail/backends/amazon_ses.pyÚ
add_header   s   r    c                   @   s   e Zd Zddd„ZdS )ÚHeaderBugWorkaroundú c                 K   s   t j| |fi |¤ŽS r   )r   Úencode)ÚselfÚ
splitcharsÚkwargsr   r   r   r#   &   ó   zHeaderBugWorkaround.encodeN)r"   )Ú__name__Ú
__module__Ú__qualname__r#   r   r   r   r   r!   %   s    r!   c                 C   sL   d|v sd|v rt d||f ƒ‚t||d�}t| tƒsJ ‚t | ||¡ d S )NÚ
úz;Header values can't contain newlines (got %r for header %r))Úheader_name)r   r!   Ú
isinstancer   Ú__setitem__r   r   r   r   r    )   s
   c                       sL   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
‡  ZS )ÚEmailBackendz0
    Amazon SES Email Backend (using boto3)
    z
Amazon SESc                    s^   t t| ƒjdi |¤Ž t|d�\| _| _td| j|ddd�| _td| j|ddd�| _	d| _
dS )z!Init options from Django settings)r&   Úconfiguration_set_nameFN)Úesp_namer&   Ú
allow_bareÚdefaultÚmessage_tag_namer   )Úsuperr0   Ú__init__Ú_get_anymail_boto3_paramsÚsession_paramsÚclient_paramsr   r2   r1   r5   Úclient)r$   r&   ©Ú	__class__r   r   r7   ;   s   ÿÿ
zEmailBackend.__init__c                 C   sR   | j rdS ztjjdi | j¤Žj di | j¤Ž| _ W d S  ty(   | js%‚ Y d S w )NFÚsesr   )r>   )r;   r   ÚsessionÚSessionr9   r:   ÚBOTO_BASE_ERRORSÚfail_silently©r$   r   r   r   ÚopenF   s   *ÿÿzEmailBackend.openc                 C   s   | j d u rd S d | _ d S r   )r;   rC   r   r   r   ÚcloseO   s   

zEmailBackend.closec                 C   s(   t |dtƒturt||| ƒS t||| ƒS )NÚtemplate_id)Úgetattrr   Ú&AmazonSESSendBulkTemplatedEmailPayloadÚAmazonSESSendRawEmailPayload)r$   r   Údefaultsr   r   r   Úbuild_message_payloadU   s   z"EmailBackend.build_message_payloadc                 C   sL   z	|  | j¡}W |S  ty% } ztt|ƒ| ||t|dd ƒ|d�‚d }~ww )NÚresponse)r   Úemail_messageÚpayloadrL   Úraised_from)Úcall_send_apir;   rA   r
   ÚstrrG   )r$   rN   r   rL   Úerrr   r   r   Úpost_to_esp]   s   üÿ€þzEmailBackend.post_to_espc                 C   s
   |  |¡S r   )Úparse_recipient_status)r$   rL   rN   r   r   r   r   rT   f   s   
z#EmailBackend.parse_recipient_status)r(   r)   r*   Ú__doc__r2   r7   rD   rE   rK   rS   rT   Ú__classcell__r   r   r<   r   r0   4   s    		r0   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚAmazonSESBasePayloadc                 C   s(   i | _ | jjd ur| jj| j d< d S d S )NÚConfigurationSetName)Úparamsr   r1   rC   r   r   r   Úinit_payloadk   s   ÿz!AmazonSESBasePayload.init_payloadc                 C   ó   t ƒ ‚r   ©ÚNotImplementedError©r$   Ú
ses_clientr   r   r   rP   p   s   z"AmazonSESBasePayload.call_send_apic                 C   r[   r   r\   )r$   rL   r   r   r   rT   s   s   z+AmazonSESBasePayload.parse_recipient_statusc                 C   s   | j  |¡ d S r   )rY   Úupdate)r$   Úextrar   r   r   Úset_esp_extraw   s   z"AmazonSESBasePayload.set_esp_extraN)r(   r)   r*   rZ   rP   rT   rb   r   r   r   r   rW   j   s
    rW   c                       s´   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Z‡  ZS ))rI   c                    sP   t t| ƒ ¡  g | _| j ¡ | _tr$d| jv r&| j dt| jjƒ¡ d S d S d S )NÚSubject)	r6   rI   rZ   Úall_recipientsr   Úmime_messager!   Úreplace_headerÚsubjectrC   r<   r   r   rZ   }   s   þz)AmazonSESSendRawEmailPayload.init_payloadc                 C   s&   d| j  ¡ i| jd< |jdi | j¤ŽS )NÚDataÚ
RawMessager   )re   Úas_bytesrY   Úsend_raw_emailr^   r   r   r   rP   …   s   

ýz*AmazonSESSendRawEmailPayload.call_send_apic              
      sj   z|d }W n t tfy$ } ztdt|ƒ|f | j| j| d�‚d }~ww t|dd�‰ ‡ fdd„| jD ƒS )NÚ	MessageIdú$%s parsing Amazon SES send result %r©r   rM   rN   Úqueued©Ú
message_idÚstatusc                    s   i | ]}|j ˆ “qS r   ©Ú	addr_spec)Ú.0Ú	recipient©Úrecipient_statusr   r   Ú
<dictcomp>–   s    zGAmazonSESSendRawEmailPayload.parse_recipient_status.<locals>.<dictcomp>)ÚKeyErrorÚ	TypeErrorr
   rQ   r   r   r   rd   )r$   rL   rq   rR   r   rw   r   rT   �   s   
þ€ÿz3AmazonSESSendRawEmailPayload.parse_recipient_statusc                 C   s    || j v r|  d| ¡ d S d S )Nz.Anymail send defaults for '%s' with Amazon SES)rJ   Úunsupported_feature)r$   Úattrr   r   r   Ú_no_send_defaults›   s   
ÿz.AmazonSESSendRawEmailPayload._no_send_defaultsc                 C   s$   t |ƒdkr|d j| jd< d S d S )Nr   r   ÚSource)Úlenrt   rY   ©r$   Úemailsr   r   r   Úset_from_email_list¡   s   ÿz0AmazonSESSendRawEmailPayload.set_from_email_listc                 C   s(   |  j |7  _ |dv sJ ‚|  |¡ d S ©N)ÚtoÚccÚbcc)rd   r~   ©r$   Úrecipient_typer‚   r   r   r   Úset_recipients¨   s   z+AmazonSESSendRawEmailPayload.set_recipientsc                 C   ó   |   d¡ d S )Nrg   ©r~   ©r$   rg   r   r   r   Úset_subject®   ó   z(AmazonSESSendRawEmailPayload.set_subjectc                 C   r‹   )NÚreply_torŒ   r�   r   r   r   Úset_reply_to²   r�   z)AmazonSESSendRawEmailPayload.set_reply_toc                 C   r‹   )NÚextra_headersrŒ   ©r$   Úheadersr   r   r   Úset_extra_headers¶   r�   z.AmazonSESSendRawEmailPayload.set_extra_headersc                 C   r‹   ©NÚbodyrŒ   ©r$   r—   r   r   r   Úset_text_bodyº   r�   z*AmazonSESSendRawEmailPayload.set_text_bodyc                 C   r‹   r–   rŒ   r˜   r   r   r   Úset_html_body¾   r�   z*AmazonSESSendRawEmailPayload.set_html_bodyc                 C   r‹   )NÚalternativesrŒ   )r$   r›   r   r   r   Úset_alternativesÂ   r�   z-AmazonSESSendRawEmailPayload.set_alternativesc                 C   r‹   )NÚattachmentsrŒ   ©r$   r�   r   r   r   Úset_attachmentsÆ   r�   z,AmazonSESSendRawEmailPayload.set_attachmentsc                 C   ó   |j | jd< d S ©Nr   ©rt   rY   ©r$   Úemailr   r   r   Úset_envelope_senderË   ó   z0AmazonSESSendRawEmailPayload.set_envelope_senderc                 C   s   dd„ | j D ƒ| jd< d S )Nc                 S   ó   g | ]}|j ‘qS r   rs   ©ru   r¤   r   r   r   Ú
<listcomp>Ò   ó    zFAmazonSESSendRawEmailPayload.set_spoofed_to_header.<locals>.<listcomp>ÚDestinations)rd   rY   )r$   Ú	header_tor   r   r   Úset_spoofed_to_headerÎ   s   z2AmazonSESSendRawEmailPayload.set_spoofed_to_headerc                 C   s   t | jd|  |¡ƒ d S )Nz
X-Metadata)r    re   Úserialize_json©r$   Úmetadatar   r   r   Úset_metadataÔ   s   z)AmazonSESSendRawEmailPayload.set_metadatac                 C   sl   |D ]	}t | jd|ƒ q|r2| jjd ur4t|ƒdkr|  d¡ | j dg ¡ | jj|d dœ¡ d S d S d S )NzX-Tagr   ú:multiple tags with the AMAZON_SES_MESSAGE_TAG_NAME settingÚTagsr   ©ÚNameÚValue)	r    re   r   r5   r€   r|   rY   Ú
setdefaultÚappend)r$   ÚtagsÚtagr   r   r   Úset_tagsâ   s   
ÿýz%AmazonSESSendRawEmailPayload.set_tagsc                 C   s   t dƒ‚)NzGAmazonSESSendRawEmailPayload should not have been used with template_idr\   ©r$   rF   r   r   r   Úset_template_idò   s   z,AmazonSESSendRawEmailPayload.set_template_idc                 C   r‹   )Nzmerge_data without template_id©r|   ©r$   Ú
merge_datar   r   r   Úset_merge_dataõ   ó   z+AmazonSESSendRawEmailPayload.set_merge_datac                 C   r‹   )Nz%global_merge_data without template_idr¾   ©r$   Úmerge_global_datar   r   r   Úset_merge_global_dataø   rÂ   z2AmazonSESSendRawEmailPayload.set_merge_global_data)r(   r)   r*   rZ   rP   rT   r~   rƒ   rŠ   rŽ   r‘   r•   r™   rš   rœ   rŸ   r¥   r­   r±   r»   r½   rÁ   rÅ   rV   r   r   r<   r   rI   |   s*    rI   c                       sœ   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Z‡  ZS )#rH   c                    s&   t t| ƒ ¡  g g g dœ| _i | _d S r„   )r6   rH   rZ   Ú
recipientsrÀ   rC   r<   r   r   rZ   ý   s   
z3AmazonSESSendBulkTemplatedEmailPayload.init_payloadc                    sz   i ‰ ˆj d rdd„ ˆj d D ƒˆ d< ˆj d r$dd„ ˆj d D ƒˆ d< ‡ ‡fdd„ˆj d	 D ƒˆjd
< |jdi ˆj¤ŽS )Nr†   c                 S   r§   r   ©Úaddress)ru   r†   r   r   r   r©     rª   zHAmazonSESSendBulkTemplatedEmailPayload.call_send_api.<locals>.<listcomp>ÚCcAddressesr‡   c                 S   r§   r   rÇ   )ru   r‡   r   r   r   r©   	  rª   ÚBccAddressesc              	      s:   g | ]}t dd |jgiˆ ¤Žˆ ˆj |ji ¡¡dœ‘qS )ÚToAddresses)ÚDestinationÚReplacementTemplateDatar   )ÚdictrÈ   r®   rÀ   Úgetrt   ©ru   r…   ©Úcc_and_bcc_addressesr$   r   r   r©     s
    þ
þr…   r«   r   )rÆ   rY   Úsend_bulk_templated_emailr^   r   rÑ   r   rP     s   

ýz4AmazonSESSendBulkTemplatedEmailPayload.call_send_apic              
   C   s¬   zdd„ |d D ƒ}W n t tfy) } ztdt|ƒ|f | j| j| d�‚d }~ww dd„ | jd D ƒ}t|ƒt|ƒkrOtdt|ƒt|ƒ|f | j| j| d�‚tt	||ƒƒS )	Nc                 S   s2   g | ]}t | d d¡| d¡dkrdndd�‘qS )rl   NÚStatusÚSuccessro   Úfailedrp   )r   rÏ   )ru   rr   r   r   r   r©     s    ý
þÿzQAmazonSESSendBulkTemplatedEmailPayload.parse_recipient_status.<locals>.<listcomp>rÔ   rm   rn   c                 S   r§   r   rs   rÐ   r   r   r   r©   !  rª   r…   zJSent to %d destinations, but only %d statuses in Amazon SES send result %r)
rz   r{   r
   rQ   r   r   rÆ   r€   rÎ   Úzip)r$   rL   Úanymail_statusesrR   Úto_addrsr   r   r   rT     s(   
ü
þ€ÿÿ
ýz=AmazonSESSendBulkTemplatedEmailPayload.parse_recipient_statusc                 C   r    r¡   )rÈ   rY   r£   r   r   r   Úset_from_email*  r¦   z5AmazonSESSendBulkTemplatedEmailPayload.set_from_emailc                 C   s   |dv sJ ‚|| j |< d S r„   )rÆ   rˆ   r   r   r   rŠ   -  s   z5AmazonSESSendBulkTemplatedEmailPayload.set_recipientsc                 C   ó   |r	|   d¡ d S d S )Nzoverriding template subjectr¾   r�   r   r   r   rŽ   2  s   ÿz2AmazonSESSendBulkTemplatedEmailPayload.set_subjectc                 C   s    |rdd„ |D ƒ| j d< d S d S )Nc                 S   r§   r   rÇ   r¨   r   r   r   r©   9  rª   zGAmazonSESSendBulkTemplatedEmailPayload.set_reply_to.<locals>.<listcomp>ÚReplyToAddresses©rY   r�   r   r   r   r‘   7  s   ÿz3AmazonSESSendBulkTemplatedEmailPayload.set_reply_toc                 C   r‹   )Nzextra_headers with templater¾   r“   r   r   r   r•   ;  rÂ   z8AmazonSESSendBulkTemplatedEmailPayload.set_extra_headersc                 C   rÛ   ©Nz overriding template body contentr¾   r˜   r   r   r   r™   >  ó   ÿz4AmazonSESSendBulkTemplatedEmailPayload.set_text_bodyc                 C   rÛ   rÞ   r¾   r˜   r   r   r   rš   B  rß   z4AmazonSESSendBulkTemplatedEmailPayload.set_html_bodyc                 C   rÛ   )Nzattachments with templater¾   rž   r   r   r   rŸ   F  rß   z6AmazonSESSendBulkTemplatedEmailPayload.set_attachmentsc                 C   r    )NÚ
ReturnPathr¢   r£   r   r   r   r¥   K  r¦   z:AmazonSESSendBulkTemplatedEmailPayload.set_envelope_senderc                 C   r‹   )Nzmetadata with templater¾   r¯   r   r   r   r±   N  r�   z3AmazonSESSendBulkTemplatedEmailPayload.set_metadatac                 C   sV   |r)| j jd ur"t|ƒdkr|  d¡ | j j|d dœg| jd< d S |  d¡ d S d S )Nr   r²   r   r´   ÚDefaultTagszItags with template (unless using the AMAZON_SES_MESSAGE_TAG_NAME setting))r   r5   r€   r|   rY   )r$   r¹   r   r   r   r»   R  s   
ÿúz/AmazonSESSendBulkTemplatedEmailPayload.set_tagsc                 C   s   || j d< d S )NÚTemplaterÝ   r¼   r   r   r   r½   ^  rÂ   z6AmazonSESSendBulkTemplatedEmailPayload.set_template_idc                 C   s
   || _ d S r   )rÀ   r¿   r   r   r   rÁ   a  s   
z5AmazonSESSendBulkTemplatedEmailPayload.set_merge_datac                 C   s   |   |¡| jd< d S )NÚDefaultTemplateData)r®   rY   rÃ   r   r   r   rÅ   e  r'   z<AmazonSESSendBulkTemplatedEmailPayload.set_merge_global_data)r(   r)   r*   rZ   rP   rT   rÚ   rŠ   rŽ   r‘   r•   r™   rš   rŸ   r¥   r±   r»   r½   rÁ   rÅ   rV   r   r   r<   r   rH   ü   s$    rH   c                 C   sŠ   t d| |i d�}t d| |i d�}| ¡ }tdj|  ¡  dd¡td�d�}d	|v r=|d	 }t|tƒs8tdi |¤Ž}| |¡}||d	< ||fS )a8  Returns 2 dicts of params for boto3.session.Session() and .client()

    Incorporates ANYMAIL["AMAZON_SES_SESSION_PARAMS"] and
    ANYMAIL["AMAZON_SES_CLIENT_PARAMS"] settings.

    Converts config dict to botocore.client.Config if needed

    May remove keys from kwargs, but won't modify original settings
    r9   )r2   r&   r4   r:   zdjango-anymail/{version}-{esp}r"   ú-)ÚespÚversion)Úuser_agent_extraÚconfigNr   )	r   Úcopyr   ÚformatÚlowerÚreplacer	   r.   Úmerge)r2   r&   r9   r:   rè   Úclient_params_configr   r   r   r8   i  s   
ÿ

r8   )%Úemail.headerr   Úemail.mime.baser   Údjango.core.mailr   Úbaser   r   Ú_versionr	   Ú
exceptionsr
   r   r   r   Úutilsr   r   r   Úbotocore.clientr   Úbotocore.exceptionsr   r   r   ÚImportErrorrA   r#   r!   r    r0   rW   rI   rH   r2   r8   r   r   r   r   Ú<module>   s6    ÿ

6 m