o
    ›¨Êhá!  ã                   @   sl   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
mZ G dd	„ d	e
ƒZG d
d„ deƒZdS )é    )Údatetimeé   )ÚAnymailRequestsAPIErrorÚAnymailError)ÚAnymailRecipientStatus)Úget_anymail_settingÚrfc2822dateé   )ÚAnymailRequestsBackendÚRequestsPayloadc                       s4   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )	ÚEmailBackendz#
    Mailgun API Email Backend
    ÚMailgunc                    sj   | j }td||dd�| _td||ddd�| _td||dd	�}| d
¡s'|d
7 }tt| ƒj|fi |¤Ž dS )z!Init options from Django settingsÚapi_keyT)Úesp_nameÚkwargsÚ
allow_bareÚsender_domainN)r   r   r   ÚdefaultÚapi_urlzhttps://api.mailgun.net/v3)r   r   r   ú/)r   r   r   r   ÚendswithÚsuperr   Ú__init__)Úselfr   r   r   ©Ú	__class__© úJ/var/www/html/env/lib/python3.10/site-packages/anymail/backends/mailgun.pyr      s   ÿÿ
zEmailBackend.__init__c                 C   s   t ||| ƒS ©N)ÚMailgunPayload)r   ÚmessageÚdefaultsr   r   r   Úbuild_message_payload   s   z"EmailBackend.build_message_payloadc              
      sˆ   |   |||¡}z
|d }|d }W n ttfy#   td|||| d�‚w | d¡s4td| |||| d�‚t|dd�‰ ‡ fd	d
„|jD ƒS )NÚidr    z#Invalid Mailgun API response format)Úemail_messageÚpayloadÚresponseÚbackendÚQueuedz%Unrecognized Mailgun API message '%s'Úqueued)Ú
message_idÚstatusc                    s   i | ]}|j ˆ “qS r   ©Ú	addr_spec)Ú.0Ú	recipient©r+   r   r   Ú
<dictcomp>8   ó    z7EmailBackend.parse_recipient_status.<locals>.<dictcomp>)Údeserialize_json_responseÚKeyErrorÚ	TypeErrorr   Ú
startswithr   Úall_recipients)r   r&   r%   r    Úparsed_responser*   Úmailgun_messager   r0   r   Úparse_recipient_status    s"   
þÿ
þz#EmailBackend.parse_recipient_status)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r"   r:   Ú__classcell__r   r   r   r   r   
   s    r   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d)d*„ Zd+d,„ Z‡  ZS )-r   c                    sT   d|j f}|j| _g | _d | _d | _g | _tt| ƒj|||g|¢R d|i|¤Ž d S )NÚapiÚauth)	r   r   r7   Ú
merge_dataÚmerge_global_dataÚ	to_emailsr   r   r   )r   r    r!   r'   Úargsr   rA   r   r   r   r   =   s   
*zMailgunPayload.__init__c                 C   s(   | j d u rtd| j| j| d�‚d| j  S )Nz‰Cannot call Mailgun unknown sender domain. Either provide valid `from_email`, or set `message.esp_extra={'sender_domain': 'example.com'}`)r'   r$   r%   z%s/messages)r   r   r'   r    ©r   r   r   r   Úget_api_endpointI   s
   

ý
zMailgunPayload.get_api_endpointc                 C   s   |   ¡  | jS r   )Úpopulate_recipient_variablesÚdatarF   r   r   r   Úserialize_dataQ   s   zMailgunPayload.serialize_datac              	   C   s˜   | j }| jdur<|dur| ¡ }ni }| jD ]%}z|| }W n ty,   | j||< Y qw | j ¡ ||< ||  |¡ q|durJ|  |¡| jd< dS dS )z;Populate Mailgun recipient-variables header from merge dataNzrecipient-variables)rB   rC   ÚcopyrD   r4   ÚupdateÚserialize_jsonrI   )r   rB   ÚemailÚrecipient_datar   r   r   rH   U   s    


ÿÿz+MailgunPayload.populate_recipient_variablesc                 C   s   i | _ g | _d S r   )rI   ÚfilesrF   r   r   r   Úinit_payloadq   s   
zMailgunPayload.init_payloadc                 C   sF   dd„ |D ƒ| j d< | jd u rt|ƒdkr!|d jpd | _d S d S d S )Nc                 S   ó   g | ]}|j ‘qS r   ©Úaddress©r.   rN   r   r   r   Ú
<listcomp>w   ó    z6MailgunPayload.set_from_email_list.<locals>.<listcomp>Úfromr   )rI   r   ÚlenÚdomain)r   Úemailsr   r   r   Úset_from_email_listu   s   þz"MailgunPayload.set_from_email_listc                 C   sR   |dv sJ ‚|rdd„ |D ƒ| j |< |  j|7  _|dkr'dd„ |D ƒ| _d S d S )N)ÚtoÚccÚbccc                 S   rR   r   rS   rU   r   r   r   rV      rW   z1MailgunPayload.set_recipients.<locals>.<listcomp>r]   c                 S   rR   r   r,   rU   r   r   r   rV   ‚   rW   )rI   r7   rD   )r   Úrecipient_typer[   r   r   r   Úset_recipients|   s   ÿzMailgunPayload.set_recipientsc                 C   ó   || j d< d S )NÚsubject©rI   )r   rc   r   r   r   Úset_subject„   ó   zMailgunPayload.set_subjectc                 C   s*   |rd  dd„ |D ƒ¡}|| jd< d S d S )Nz, c                 S   s   g | ]}t |ƒ‘qS r   )ÚstrrU   r   r   r   rV   ‰   r2   z/MailgunPayload.set_reply_to.<locals>.<listcomp>z
h:Reply-To)ÚjoinrI   )r   r[   Úreply_tor   r   r   Úset_reply_to‡   s   þzMailgunPayload.set_reply_toc                 C   ó$   |  ¡ D ]\}}|| jd| < qd S )Nzh:%s©ÚitemsrI   )r   ÚheadersÚkeyÚvaluer   r   r   Úset_extra_headersŒ   ó   ÿz MailgunPayload.set_extra_headersc                 C   rb   )NÚtextrd   ©r   Úbodyr   r   r   Úset_text_body�   rf   zMailgunPayload.set_text_bodyc                 C   s"   d| j v r
|  d¡ || j d< d S )NÚhtmlzmultiple html parts)rI   Úunsupported_featurert   r   r   r   Úset_html_body“   s   

zMailgunPayload.set_html_bodyc                 C   s:   |j r	d}|j}nd}|j}| j |||j|jff¡ d S )NÚinlineÚ
attachment)rz   ÚcidÚnamerP   ÚappendÚcontentÚmimetype)r   r{   Úfieldr}   r   r   r   Úadd_attachment™   s   ÿzMailgunPayload.add_attachmentc                 C   s   |j | _d S r   )rZ   r   )r   rN   r   r   r   Úset_envelope_sender¥   s   z"MailgunPayload.set_envelope_senderc                 C   rk   )Nzv:%srl   )r   Úmetadataro   rp   r   r   r   Úset_metadata©   rr   zMailgunPayload.set_metadatac                 C   s    t |tƒr	t|ƒ}|| jd< d S )Nzo:deliverytime)Ú
isinstancer   r   rI   )r   Úsend_atr   r   r   Úset_send_at­   s   
zMailgunPayload.set_send_atc                 C   rb   )Nzo:tagrd   )r   Útagsr   r   r   Úset_tagsµ   rf   zMailgunPayload.set_tagsc                 C   ó   |rdnd| j d< d S )NÚyesÚnozo:tracking-clicksrd   )r   Útrack_clicksr   r   r   Úset_track_clicks¸   s   zMailgunPayload.set_track_clicksc                 C   r‹   )NrŒ   r�   zo:tracking-opensrd   )r   Útrack_opensr   r   r   Úset_track_opens¼   s   zMailgunPayload.set_track_opensc                 C   ó
   || _ d S r   )rB   )r   rB   r   r   r   Úset_merge_dataÂ   ó   
zMailgunPayload.set_merge_datac                 C   r’   r   )rC   )r   rC   r   r   r   Úset_merge_global_dataÆ   r”   z$MailgunPayload.set_merge_global_datac                 C   s"   | j  |¡ | j  d| j¡| _d S )Nr   )rI   rL   Úpopr   )r   Úextrar   r   r   Úset_esp_extraÊ   s   zMailgunPayload.set_esp_extra)r;   r<   r=   r   rG   rJ   rH   rQ   r\   ra   re   rj   rq   rv   ry   r‚   rƒ   r…   rˆ   rŠ   r�   r‘   r“   r•   r˜   r?   r   r   r   r   r   ;   s.    r   N)r   Ú
exceptionsr   r   r    r   Úutilsr   r   Úbase_requestsr
   r   r   r   r   r   r   r   Ú<module>   s    1