a
    ¥Q•h5E  ã                   @   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r¦t
|ƒ ¡ }| |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 q–0 |rbtd|| f ƒ‚|jpjd}|j	}|j
pzd}n| \}}| dd¡\}}|| | }d|v s²d|v rºt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 | _|
ršt |
tƒrŽtdƒ‚t|
ƒ| _ng | _|p¨tj	| _
|| _|p¸d| _g | _|rð|D ]$}t |tƒrä|  |¡ qÊ| j|Ž  qÊ|pöi | _|| _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rœttjd	�|d
< d|vr²t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ržt |t	ƒržz| 
¡ }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