3
gB                 @   s  d dl Z d dlmZmZ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jdZ*de*_+ejdZ,ej-e,_+dZ.dZ/G dd de0Z1ddddddddddd h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/d0 d0e9Z:dS )1    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punycodezutf-8zapplication/octet-streami  c               @   s   e Zd ZdS )BadHeaderErrorN)__name__
__module____qualname__ r   r   V/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/core/mail/message.pyr   #   s   r   fromZsenderzreply-totoccbcczresent-fromzresent-senderz	resent-toz	resent-ccz
resent-bccc                s    pt j t|}d|ks"d|kr2td|| f y|jd W nN tk
r   | j tkr|dj fddt	|fD }nt
| j }Y nX | j dkrt
|j }| |fS )	z6Forbid multi-line headers to prevent header injection.
z;Header values can't contain newlines (got %r for header %r)asciiz, c             3   s   | ]}t | V  qd S )N)sanitize_address).0addr)encodingr   r   	<genexpr>A   s    z,forbid_multi_line_headers.<locals>.<genexpr>subject)r   DEFAULT_CHARSETstrr   encodeUnicodeEncodeErrorlowerADDRESS_HEADERSjoinr   r   )namevalr*   r   )r*   r   forbid_multi_line_headers7   s    
 r6   c       
      C   sP  d}t | tst| } ytj| \}}W n& tttfk
rN   td|  Y qX |rdtd|| f |jpld}|j	}|j
p|d}n| \}}|jdd\}}|| | }d|ksd|krtd	y|jd
 t|j }W n" tk
r   t||j }Y nX y|jd
 W n$ tk
r,   t||j }Y nX 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
IndexErrorZdisplay_nameZ
local_partr;   rsplitr/   r   r0   r   r   r   Z	addr_spec)
r)   r*   addresstokenrestnmZ	localpartr;   Zaddress_partsZparsed_addressr   r   r   r'   J   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 |j 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)selfrG   rH   fpgr   r   r   	as_stringx   s    zMIMEMixin.as_stringc             C   s,   t  }tj|dd}|j| ||d |j 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.
        F)rF   )rG   rH   )r   r   BytesGeneratorrJ   rK   )rL   rG   rH   rM   rN   r   r   r   as_bytes   s    zMIMEMixin.as_bytesN)Fr$   )Fr$   )r   r   r   rO   rQ   r   r   r   r   rE   w   s   
rE   c               @   s   e Zd Zdd ZdS )SafeMIMEMessagec             C   s"   t ||d\}}tj| || d S )Nr&   )r6   r   __setitem__)rL   r4   r5   r   r   r   rS      s    zSafeMIMEMessage.__setitem__N)r   r   r   rS   r   r   r   r   rR      s   rR   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)r*   r   __init__)rL   Z_textrV   rW   r   r   r   rX      s    zSafeMIMEText.__init__c             C   s$   t ||| j\}}tj| || d S )N)r6   r*   r   rS   )rL   r4   r5   r   r   r   rS      s    zSafeMIMEText.__setitem__c             C   sL   |dkr8t |tj r8tdd |j D }|r4tnt}tj| ||d d S )Nzutf-8c             s   s   | ]}t |j tkV  qd S )N)lenr/   RFC5322_EMAIL_LINE_LENGTH_LIMIT)r(   liner   r   r   r+      s   z+SafeMIMEText.set_payload.<locals>.<genexpr>)r   )r<   Charsetany
splitlinesutf8_charset_qputf8_charsetr   set_payload)rL   payloadr   Zhas_long_linesr   r   r   ra      s    zSafeMIMEText.set_payload)rU   N)N)r   r   r   rX   rS   ra   r   r   r   r   rT      s   
rT   c               @   s   e Zd ZdddZdd ZdS )SafeMIMEMultipartmixedNc             K   s   || _ tj| |||f| d S )N)r*   r   rX   )rL   rV   boundaryZ	_subpartsr*   _paramsr   r   r   rX      s    zSafeMIMEMultipart.__init__c             C   s$   t ||| j\}}tj| || d S )N)r6   r*   r   rS   )rL   r4   r5   r   r   r   rS      s    zSafeMIMEMultipart.__setitem__)rd   NNN)r   r   r   rX   rS   r   r   r   r   rc      s   
rc   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.rU   rd   Nr7   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 | _|rx,|D ]$}t |tr| j| q| j|  qW |pi | _|| _dS )zg
        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 tupler7   N)r<   r.   	TypeErrorlistr!   r"   r#   reply_tor   ZDEFAULT_FROM_EMAIL
from_emailr,   bodyattachmentsr   attachextra_headers
connection)rL   r,   rl   rk   r!   r#   rp   rm   headersr"   rj   
attachmentr   r   r   rX      s>    







zEmailMessage.__init__Fc             C   s$   ddl m} | js||d| _| jS )Nr   )get_connection)fail_silently)Zdjango.core.mailrs   rp   )rL   rt   rs   r   r   r   rs      s    zEmailMessage.get_connectionc             C   s   | j p
tj}t| j| j|}| j|}| j|d< | jj	d| j
|d< | j|d| j | j|d| j | j|d| j dd | jD }d|krttjd	|d
< d|krttd|d< x*| jj D ]\}}|j dkr|||< qW |S )NSubjectFromToCczReply-Toc             S   s   g | ]}|j  qS r   )r1   )r(   keyr   r   r   
<listcomp>   s    z(EmailMessage.message.<locals>.<listcomp>date)	localtimeDatez
message-id)r;   z
Message-IDr    )r*   r   r-   rT   rl   content_subtype_create_messager,   ro   getrk   _set_list_header_if_not_emptyr!   r"   rj   r   ZEMAIL_USE_LOCALTIMEr   r   itemsr1   )rL   r*   msgheader_namesr4   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   rz     s    z+EmailMessage.recipients.<locals>.<listcomp>)r!   r"   r#   )rL   r   r   r   
recipients  s    zEmailMessage.recipientsc             C   s   | j  sdS | j|j| gS )zSend the email message.r   )r   rs   Zsend_messages)rL   rt   r   r   r   send  s    zEmailMessage.sendc             C   s   t |tr0|dkst|dks"t| jj| n||dk	s<t|pPtj|d pPt}|jdd\}}|dkrt |t	ry|j
 }W n tk
r   t}Y nX | j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.
        Nr   /r9   text)r<   r   AssertionErrorrm   append	mimetypes
guess_typeDEFAULT_ATTACHMENT_MIME_TYPEsplitbytesdecodeUnicodeDecodeError)rL   filenamecontentmimetypebasetypesubtyper   r   r   rn     s    


zEmailMessage.attachc             C   s:   t |}|jd}|j }| j|j|| W dQ R X 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readrn   r4   )rL   pathr   filer   r   r   r   attach_file>  s    zEmailMessage.attach_filec             C   s
   | j |S )N)_create_attachments)rL   r   r   r   r   r   N  s    zEmailMessage._create_messagec             C   sv   | j rr| jptj}|}t| j|d}| js2|j r<|j| x4| j D ]*}t	|t
r^|j| qD|j| j|  qDW |S )N)rV   r*   )rm   r*   r   r-   rc   mixed_subtyperl   is_multipartrn   r<   r   _create_attachment)rL   r   r*   body_msgrr   r   r   r   r   Q  s    

z EmailMessage._create_attachmentsc             C   s   |j dd\}}|dkr2| jp"tj}t|||}nd|dkrx|dkrxt|trV|j }nt|tslt	t
|}t||}nt||}|j| tj| |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   r9   r   r   Zrfc822)r   r*   r   r-   rT   r<   rg   r   r
   r   r   rR   r   ra   Encodersencode_base64)rL   r   r   r   r   r*   rr   r   r   r   _create_mime_attachment_  s    





z$EmailMessage._create_mime_attachmentc             C   sR   | j ||}|rNy|jd W n tk
r<   dd|f}Y nX |jdd|d |S )zg
        Convert the filename, content, mimetype triple into a MIME attachment
        object.
        r&   zutf-8r7   zContent-Dispositionrr   )r   )r   r/   r0   
add_header)rL   r   r   r   rr   r   r   r   r   }  s    zEmailMessage._create_attachmentc             C   sH   |rDy| j | }W n( tk
r:   djdd |D }Y nX |||< dS )zt
        Set msg's header, either from self.extra_headers, if present, or from
        the values argument.
        z, c             s   s   | ]}t |V  qd S )N)r.   )r(   vr   r   r   r+     s    z=EmailMessage._set_list_header_if_not_empty.<locals>.<genexpr>N)ro   KeyErrorr3   )rL   r   headervaluesr   r   r   r   r     s    z*EmailMessage._set_list_header_if_not_empty)
r7   r7   NNNNNNNN)F)F)NNN)N)N)r   r   r   __doc__r~   r   r*   rX   rs   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   rg      s$     
*


 

rg   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.
    alternativer7   Nc                s,   t  j|||||||||
|
 |	p$g | _dS )zg
        Initialize a single email message (which can be sent to multiple
        recipients).
        N)superrX   alternatives)rL   r,   rl   rk   r!   r#   rp   rm   rq   r   r"   rj   )	__class__r   r   rX     s    
zEmailMultiAlternatives.__init__c             C   s,   |dk	st |dk	st | jj||f dS )z-Attach an alternative content representation.N)r   r   r   )rL   r   r   r   r   r   attach_alternative  s    z)EmailMultiAlternatives.attach_alternativec             C   s   | j | j|S )N)r   _create_alternatives)rL   r   r   r   r   r     s    z&EmailMultiAlternatives._create_messagec             C   sX   | j p
tj}| jrT|}t| j|d}| jr4|j| x| jD ]}|j| j|  q<W |S )N)rV   r*   )	r*   r   r-   r   rc   alternative_subtyperl   rn   r   )rL   r   r*   r   r   r   r   r   r     s    
z+EmailMultiAlternatives._create_alternatives)r7   r7   NNNNNNNNN)
r   r   r   r   r   rX   r   r   r   __classcell__r   r   )r   r   r     s     r   );r   r   r   r\   r   r   r   r   Zemail.errorsr   Z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   Zdjango.confr   Zdjango.core.mail.utilsr   Zdjango.utils.encodingr   r   r`   body_encodingr_   QPr   rZ   r>   r   r2   r6   r'   rE   rR   rT   rc   rg   r   r   r   r   r   <module>   sT   

- ]