a
    Qh5E                     @   s  d dl 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 d dlmZm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 d dlmZmZmZmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z) edZ*de*_+edZ,ej-e,_+dZ.dZ/G dd de0Z1h dZ2dd Z3dd Z4G dd dZ5G dd  d e5eZ6G d!d" d"e5eZ7G d#d$ d$e5eZ8G d%d& d&Z9G d'd( d(e9Z:dS ))    Ncharset)encoders)	generatormessage_from_string)HeaderParseError)Header)Addressparser)Message)MIMEBase)MIMEMessage)MIMEMultipart)MIMEText)
formataddr
formatdategetaddresses
make_msgid)BytesIOStringIO)Path)settings)DNS_NAME)	force_strpunycodeutf-8zapplication/octet-streami  c                   @   s   e Zd ZdS )BadHeaderErrorN)__name__
__module____qualname__ r    r    Q/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/core/mail/message.pyr   #   s   r   >   fromcczreply-tobcczresent-senderz
resent-bccz	resent-cctoz	resent-tosenderzresent-fromc                    s    pt j t|}d|v s"d|v r2td|| f z|d W nL ty   |  tv rzd fddt	|fD }nt
|  }Y n0 |  dkrt
| }| |fS )	z6Forbid multi-line headers to prevent header injection.
z;Header values can't contain newlines (got %r for header %r)ascii, c                 3   s   | ]}t | V  qd S N)sanitize_address).0addrencodingr    r!   	<genexpr>C   s   z,forbid_multi_line_headers.<locals>.<genexpr>subject)r   DEFAULT_CHARSETstrr   encodeUnicodeEncodeErrorlowerADDRESS_HEADERSjoinr   r   )namevalr0   r    r/   r!   forbid_multi_line_headers7   s"    


r<   c           
   
   C   sJ  d}t | ts~t| } zt| \}}W n$ tttfyL   td|  Y q0 |rbtd|| f |jpjd}|j	}|j
pzd}n| \}}|dd\}}|| | }d|v sd|v rtd	z|d
 t| }W n  ty   t|| }Y n0 z|d
 W n" ty&   t|| }Y n0 t|}t||d}	t||	jfS )zF
    Format a pair of (name, address) or an email address string.
    NzInvalid address "%s"z2Invalid address; only %s could be parsed from "%s" @   r'   r(   z7Invalid address; address parts cannot contain newlines.r)   )usernamedomain)
isinstancetupler   r
   Zget_mailboxr   
ValueError
IndexErrordisplay_nameZ
local_partrA   rsplitr5   r   r6   r   r	   r   Z	addr_spec)
r.   r0   addresstokenrestZnmZ	localpartrA   Zaddress_partsZparsed_addressr    r    r!   r,   N   s>    



r,   c                   @   s    e Zd ZdddZd	ddZdS )
	MIMEMixinFr'   c                 C   s,   t  }tj|dd}|j| ||d | S )a&  Return the entire formatted message as a string.
        Optional `unixfrom' when True, means include the Unix From_ envelope
        header.

        This overrides the default as_string() implementation to not mangle
        lines that begin with 'From '. See bug #13433 for details.
        Fmangle_from_unixfromlinesep)r   r   	GeneratorflattengetvalueselfrO   rP   fpgr    r    r!   	as_string{   s    zMIMEMixin.as_stringc                 C   s,   t  }tj|dd}|j| ||d | S )a"  Return the entire formatted message as bytes.
        Optional `unixfrom' when True, means include the Unix From_ envelope
        header.

        This overrides the default as_bytes() implementation to not mangle
        lines that begin with 'From '. See bug #13433 for details.
        FrL   rN   )r   r   BytesGeneratorrR   rS   rT   r    r    r!   as_bytes   s    zMIMEMixin.as_bytesN)Fr'   )Fr'   )r   r   r   rX   rZ   r    r    r    r!   rK   z   s   
rK   c                   @   s   e Zd Zdd ZdS )SafeMIMEMessagec                 C   s"   t ||d\}}t| || d S )Nr)   )r<   r   __setitem__rU   r:   r;   r    r    r!   r\      s    zSafeMIMEMessage.__setitem__N)r   r   r   r\   r    r    r    r!   r[      s   r[   c                   @   s(   e Zd Zd	ddZdd Zd
ddZdS )SafeMIMETextplainNc                 C   s   || _ tj| |||d d S )N)_subtype_charset)r0   r   __init__)rU   Z_textr`   ra   r    r    r!   rb      s    zSafeMIMEText.__init__c                 C   s$   t ||| j\}}t| || d S r+   )r<   r0   r   r\   r]   r    r    r!   r\      s    zSafeMIMEText.__setitem__c                 C   sJ   |dkr6t |tjs6tdd | D }|r2tnt}tj| ||d d S )Nr   c                 s   s   | ]}t | tkV  qd S r+   )lenr5   RFC5322_EMAIL_LINE_LENGTH_LIMIT)r-   liner    r    r!   r1      s   z+SafeMIMEText.set_payload.<locals>.<genexpr>r   )rB   Charsetany
splitlinesutf8_charset_qputf8_charsetr   set_payload)rU   payloadr   Zhas_long_linesr    r    r!   rk      s    zSafeMIMEText.set_payload)r_   N)N)r   r   r   rb   r\   rk   r    r    r    r!   r^      s   
r^   c                   @   s   e Zd ZdddZdd ZdS )SafeMIMEMultipartmixedNc                 K   s"   || _ tj| |||fi | d S r+   )r0   r   rb   )rU   r`   boundaryZ	_subpartsr0   _paramsr    r    r!   rb      s    zSafeMIMEMultipart.__init__c                 C   s$   t ||| j\}}t| || d S r+   )r<   r0   r   r\   r]   r    r    r!   r\      s    zSafeMIMEMultipart.__setitem__)rn   NNN)r   r   r   rb   r\   r    r    r    r!   rm      s    
rm   c                
   @   s   e Zd ZdZdZdZdZdddZd d	d
Zdd Z	dd Z
d!ddZd"ddZd#ddZdd Zdd Zdd Zd$ddZdd ZdS )%EmailMessagez"A container for email information.r_   rn   Nr=   c                 C   s  |r"t |trtdt|| _ng | _|	rJt |	tr>tdt|	| _ng | _|rrt |trftdt|| _ng | _|
rt |
trtdt|
| _ng | _|ptj	| _
|| _|pd| _g | _|r|D ]$}t |tr| | q| j|  q|pi | _|| _dS )g
        Initialize a single email message (which can be sent to multiple
        recipients).
        z%"to" argument must be a list or tuplez%"cc" argument must be a list or tuplez&"bcc" argument must be a list or tuplez+"reply_to" argument must be a list or tupler=   N)rB   r4   	TypeErrorlistr%   r#   r$   reply_tor   DEFAULT_FROM_EMAIL
from_emailr2   bodyattachmentsr   attachextra_headers
connection)rU   r2   rx   rw   r%   r$   r|   ry   headersr#   ru   
attachmentr    r    r!   rb      s>    






zEmailMessage.__init__Fc                 C   s$   ddl m} | js||d| _| jS )Nr   )get_connection)fail_silently)django.core.mailr   r|   )rU   r   r   r    r    r!   r      s    zEmailMessage.get_connectionc                 C   s   | j p
tj}t| j| j|}| |}| j|d< | j	d| j
|d< | |d| j | |d| j | |d| j dd | jD }d|vrttjd	|d
< d|vrttd|d< | j D ]\}}| dkr|||< q|S )NSubjectFromToZCczReply-Toc                 S   s   g | ]}|  qS r    )r7   )r-   keyr    r    r!   
<listcomp>      z(EmailMessage.message.<locals>.<listcomp>date)	localtimeDatez
message-id)rA   z
Message-IDr"   )r0   r   r3   r^   rx   content_subtype_create_messager2   r{   getrw   _set_list_header_if_not_emptyr%   r#   ru   r   EMAIL_USE_LOCALTIMEr   r   itemsr7   )rU   r0   msgheader_namesr:   valuer    r    r!   message  s"    


zEmailMessage.messagec                 C   s   dd | j | j | j D S )z
        Return a list of all recipients of the email (includes direct
        addressees as well as Cc and Bcc entries).
        c                 S   s   g | ]}|r|qS r    r    )r-   emailr    r    r!   r   "  r   z+EmailMessage.recipients.<locals>.<listcomp>)r%   r#   r$   )rU   r    r    r!   
recipients  s    zEmailMessage.recipientsc                 C   s   |   sdS | || gS )zSend the email message.r   )r   r   send_messages)rU   r   r    r    r!   send$  s    zEmailMessage.sendc                 C   s   t |tr0|dus|dur"td| j| n|du rBtdnn|pVt|d pVt}|dd\}}|dkrt |t	rz|
 }W n ty   t}Y n0 | j|||f dS )a  
        Attach a file with the given filename and content. The filename can
        be omitted and the mimetype is guessed, if not provided.

        If the first parameter is a MIMEBase subclass, insert it directly
        into the resulting message attachments.

        For a text/* mimetype (guessed or specified), when a bytes object is
        specified as content, decode it as UTF-8. If that fails, set the
        mimetype to DEFAULT_ATTACHMENT_MIME_TYPE and don't decode the content.
        NzLcontent and mimetype must not be given when a MIMEBase instance is provided.zcontent must be provided.r   /r?   text)rB   r   rD   ry   append	mimetypes
guess_typeDEFAULT_ATTACHMENT_MIME_TYPEsplitbytesdecodeUnicodeDecodeError)rU   filenamecontentmimetypebasetypesubtyper    r    r!   rz   ,  s*    



zEmailMessage.attachc                 C   sN   t |}|d(}| }| |j|| W d   n1 s@0    Y  dS )al  
        Attach a file from the filesystem.

        Set the mimetype to DEFAULT_ATTACHMENT_MIME_TYPE if it isn't specified
        and cannot be guessed.

        For a text/* mimetype (guessed or specified), decode the file's content
        as UTF-8. If that fails, set the mimetype to
        DEFAULT_ATTACHMENT_MIME_TYPE and don't decode the content.
        rbN)r   openreadrz   r:   )rU   pathr   filer   r    r    r!   attach_fileT  s    zEmailMessage.attach_filec                 C   s
   |  |S r+   )_create_attachmentsrU   r   r    r    r!   r   d  s    zEmailMessage._create_messagec                 C   sr   | j rn| jptj}|}t| j|d}| js2| r<|| | j D ]*}t	|t
r\|| qB|| j|  qB|S N)r`   r0   )ry   r0   r   r3   rm   mixed_subtyperx   is_multipartrz   rB   r   _create_attachment)rU   r   r0   body_msgr~   r    r    r!   r   g  s    


z EmailMessage._create_attachmentsc                 C   s   | dd\}}|dkr2| jp"tj}t|||}nd|dkrx|dkrxt|trV| }nt|tslt	t
|}t||}nt||}|| t| |S )z
        Convert the content, mimetype pair into a MIME attachment object.

        If the mimetype is message/rfc822, content may be an
        email.Message or EmailMessage object, as well as a str.
        r   r?   r   r   Zrfc822)r   r0   r   r3   r^   rB   rq   r   r   r   r   r[   r   rk   Encodersencode_base64)rU   r   r   r   r   r0   r~   r    r    r!   _create_mime_attachmentu  s    





z$EmailMessage._create_mime_attachmentc                 C   sP   |  ||}|rLz|d W n ty:   dd|f}Y n0 |jdd|d |S )zg
        Convert the filename, content, mimetype triple into a MIME attachment
        object.
        r)   r   r=   zContent-Dispositionr~   )r   )r   r5   r6   
add_header)rU   r   r   r   r~   r    r    r!   r     s    zEmailMessage._create_attachmentc                 C   sF   |rBz| j | }W n& ty8   ddd |D }Y n0 |||< dS )zt
        Set msg's header, either from self.extra_headers, if present, or from
        the values argument.
        r*   c                 s   s   | ]}t |V  qd S r+   )r4   )r-   vr    r    r!   r1     r   z=EmailMessage._set_list_header_if_not_empty.<locals>.<genexpr>N)r{   KeyErrorr9   )rU   r   headervaluesr   r    r    r!   r     s    z*EmailMessage._set_list_header_if_not_empty)
r=   r=   NNNNNNNN)F)F)NNN)N)N)r   r   r   __doc__r   r   r0   rb   r   r   r   r   rz   r   r   r   r   r   r   r    r    r    r!   rq      s4             
6


(

rq   c                       s>   e Zd ZdZdZd fdd	Zdd Zd	d
 Zdd Z  Z	S )EmailMultiAlternativesz
    A version of EmailMessage that makes it easy to send multipart/alternative
    messages. For example, including text and HTML versions of the text is
    made easier.
    alternativer=   Nc                    s,   t  |||||||||
|
 |	p$g | _dS )rr   N)superrb   alternatives)rU   r2   rx   rw   r%   r$   r|   ry   r}   r   r#   ru   	__class__r    r!   rb     s    zEmailMultiAlternatives.__init__c                 C   s,   |du s|du rt d| j||f dS )z-Attach an alternative content representation.Nz+Both content and mimetype must be provided.)rD   r   r   )rU   r   r   r    r    r!   attach_alternative  s    z)EmailMultiAlternatives.attach_alternativec                 C   s   |  | |S r+   )r   _create_alternativesr   r    r    r!   r     s    z&EmailMultiAlternatives._create_messagec                 C   sT   | j p
tj}| jrP|}t| j|d}| jr4|| | jD ]}|| j|  q:|S r   )	r0   r   r3   r   rm   alternative_subtyperx   rz   r   )rU   r   r0   r   r   r    r    r!   r     s    

z+EmailMultiAlternatives._create_alternatives)r=   r=   NNNNNNNNN)
r   r   r   r   r   rb   r   r   r   __classcell__r    r    r   r!   r     s"               r   );r   r   r   rf   r   r   r   r   Zemail.errorsr   email.headerr   Zemail.headerregistryr	   r
   email.messager   Zemail.mime.baser   Zemail.mime.messager   Zemail.mime.multipartr   Zemail.mime.textr   email.utilsr   r   r   r   ior   r   pathlibr   django.confr   django.core.mail.utilsr   django.utils.encodingr   r   rj   body_encodingri   QPr   rd   rD   r   r8   r<   r,   rK   r[   r^   rm   rq   r   r    r    r    r!   <module>   sD   

, s