B
    ©0H[C  ã               @   sª  d dl Z d dl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 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' e d¡Z(de(_)e d¡Z*ej+e*_)dZ,dZ-G dd„ de.ƒZ/dddddddddddhZ0d d!„ Z1d"d#„ Z2d$d%„ Z3G d&d'„ d'ƒZ4G d(d)„ d)e4eƒZ5G d*d+„ d+e4eƒZ6G d,d-„ d-e4eƒZ7G d.d/„ d/ƒZ8G d0d1„ d1e8ƒZ9dS )2é    N)ÚcharsetÚencodersÚ	generatorÚmessage_from_string)ÚInvalidHeaderDefectÚNonASCIILocalPartDefect)ÚHeader)ÚAddress)ÚMessage)ÚMIMEBase)ÚMIMEMessage)ÚMIMEMultipart)ÚMIMEText)Ú
formatdateÚgetaddressesÚ
make_msgidÚ	parseaddr)ÚBytesIOÚStringIO)Úsettings)ÚDNS_NAME)Ú
force_textzutf-8zapplication/octet-streamiæ  c               @   s   e Zd ZdS )ÚBadHeaderErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú\C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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| d¡ W nN tk
rŽ   |  ¡ tkr|d ‡ fdd„t	|fƒD ƒ¡}nt
|ˆ ƒ ¡ }Y nX |  ¡ 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)Ú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    
 r4   c             C   sv   d| kr\|   dd¡\}}y| d¡ W n" tk
rH   t||ƒ ¡ }Y nX | d¡ d¡}nt| |ƒ ¡ }d}||fS )zõ
    Split the address into local part and domain and encode them.

    When non-ascii characters are present in the local part, it must be
    MIME-word encoded. The domain name must be idna-encoded if it contains
    non-ascii characters.
    ú@é   r$   ÚidnaÚ )Úsplitr-   r.   r   Údecode)r'   r(   Ú	localpartÚdomainr   r   r   Ú
split_addrJ   s    r=   c          	   C   sÎ   t | tƒst| ƒ} | \}} d\}}t||ƒ ¡ }y|  d¡ W n" tk
r`   t| |ƒ\}}Y nX |r€|r€t|||d�}t|ƒS yt|| d�}W n4 t	t
fk
rÄ   t| |ƒ\}}t|||d�}Y nX t|ƒS )zF
    Format a pair of (name, address) or an email address string.
    )NNr$   )Úusernamer<   )Z	addr_spec)Ú
isinstanceÚtupler   r   r-   r.   r=   r	   r,   r   r   )r'   r(   Únmr;   r<   Úaddressr   r   r   r%   b   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)ÚselfrE   rF   Ú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.
        F)rD   )rE   rF   )r   r   ÚBytesGeneratorrH   rI   )rJ   rE   rF   rK   rL   r   r   r   Úas_bytesŒ   s    zMIMEMixin.as_bytesN)Fr"   )Fr"   )r   r   r   rM   rO   r   r   r   r   rC   ~   s   
rC   c               @   s   e Zd Zdd„ ZdS )ÚSafeMIMEMessagec             C   s"   t ||dƒ\}}t | ||¡ d S )Nr$   )r4   r   Ú__setitem__)rJ   r2   r3   r   r   r   rQ   œ   s    zSafeMIMEMessage.__setitem__N)r   r   r   rQ   r   r   r   r   rP   š   s   rP   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__)rJ   Z_textrT   rU   r   r   r   rV   ¤   s    zSafeMIMEText.__init__c             C   s$   t ||| jƒ\}}t | ||¡ d S )N)r4   r(   r   rQ   )rJ   r2   r3   r   r   r   rQ   ¨   s    zSafeMIMEText.__setitem__c             C   s>   |dkr*t dd„ | ¡ D ƒƒ}|r&tnt}tj| ||d� d S )Nzutf-8c             s   s   | ]}t | ¡ ƒtkV  qd S )N)Úlenr-   ÚRFC5322_EMAIL_LINE_LENGTH_LIMIT)r&   Úlr   r   r   r)   ¯   s   z+SafeMIMEText.set_payload.<locals>.<genexpr>)r   )ÚanyÚ
splitlinesÚutf8_charset_qpÚutf8_charsetr   Úset_payload)rJ   Úpayloadr   Zhas_long_linesr   r   r   r^   ¬   s    zSafeMIMEText.set_payload)rS   N)N)r   r   r   rV   rQ   r^   r   r   r   r   rR   ¢   s   
rR   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   rV   )rJ   rT   ÚboundaryZ	_subpartsr(   Ú_paramsr   r   r   rV   º   s    zSafeMIMEMultipart.__init__c             C   s$   t ||| jƒ\}}t | ||¡ d S )N)r4   r(   r   rQ   )rJ   r2   r3   r   r   r   rQ   ¾   s    zSafeMIMEMultipart.__setitem__)ra   NNN)r   r   r   rV   rQ   r   r   r   r   r`   ¸   s   
r`   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S )#ÚEmailMessagez"A container for email information.rS   ra   Nr8   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	| _
|| _|| _g | _|rðx,|D ]$}t |tƒrâ|  |¡ qÈ| j|Ž  qÈW |pöi | _|| _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 tupleN)r?   r,   Ú	TypeErrorÚlistr   r    r!   Úreply_tor   ZDEFAULT_FROM_EMAILÚ
from_emailr*   ÚbodyÚattachmentsr   ÚattachÚextra_headersÚ
connection)rJ   r*   ri   rh   r   r!   rm   rj   Úheadersr    rg   Ú
attachmentr   r   r   rV   É   s>    






zEmailMessage.__init__Fc             C   s$   ddl m} | js||d�| _| jS )Nr   )Úget_connection)Úfail_silently)Zdjango.core.mailrp   rm   )rJ   rq   rp   r   r   r   rp   õ   s    zEmailMessage.get_connectionc             C   s   | j p
tj}t| j| j|ƒ}|  |¡}| j|d< | j 	d| j
¡|d< | j 	dd tt| jƒ¡¡|d< | jr„d dd„ | jD ƒ¡|d< | jr®| j 	dd d	d„ | jD ƒ¡¡|d< d
d„ | jD ƒ}d|krÖttjd�|d< d|krìttd�|d< x.| j ¡ D ] \}}| ¡ dk�rqø|||< qøW |S )NÚSubjectÚFromÚToz, c             s   s   | ]}t |ƒV  qd S )N)r,   )r&   r    r   r   r   r)     s    z'EmailMessage.message.<locals>.<genexpr>ÚCczReply-Toc             s   s   | ]}t |ƒV  qd S )N)r,   )r&   Úrr   r   r   r)     s    c             S   s   g | ]}|  ¡ ‘qS r   )r/   )r&   Úkeyr   r   r   ú
<listcomp>	  s    z(EmailMessage.message.<locals>.<listcomp>Údate)Ú	localtimeÚDatez
message-id)r<   z
Message-ID)r   r   )r(   r   r+   rR   ri   Úcontent_subtypeÚ_create_messager*   rl   Úgetrh   r1   Úmapr,   r   r    rg   r   ZEMAIL_USE_LOCALTIMEr   r   Úitemsr/   )rJ   r(   ÚmsgÚheader_namesr2   Ú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   rx     s    z+EmailMessage.recipients.<locals>.<listcomp>)r   r    r!   )rJ   r   r   r   Ú
recipients  s    zEmailMessage.recipientsc             C   s   |   ¡ sdS |  |¡ | g¡S )zSend the email message.r   )r†   rp   Zsend_messages)rJ   rq   r   r   r   Úsend   s    zEmailMessage.sendc             C   s´   t |tƒr0|dkst‚|dks"t‚| j |¡ n€|dk	s<t‚|sVt |¡\}}|sVt}| dd¡\}}|dkržt |t	ƒržy| 
¡ }W n tk
rœ   t}Y nX | 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.
        Nú/r6   Útext)r?   r   ÚAssertionErrorrj   ÚappendÚ	mimetypesÚ
guess_typeÚDEFAULT_ATTACHMENT_MIME_TYPEr9   Úbytesr:   ÚUnicodeDecodeError)rJ   ÚfilenameÚcontentÚmimetypeÚ_ÚbasetypeÚsubtyper   r   r   rk   (  s"    


zEmailMessage.attachc          	   C   s<   t j |¡}t|dƒ�}| ¡ }|  |||¡ 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)ÚosÚpathÚbasenameÚopenÚreadrk   )rJ   r™   r“   r‘   Úfiler’   r   r   r   Úattach_fileL  s    zEmailMessage.attach_filec             C   s
   |   |¡S )N)Ú_create_attachments)rJ   r�   r   r   r   r}   ]  s    zEmailMessage._create_messagec             C   sv   | j rr| jptj}|}t| j|d�}| js2| ¡ r<| |¡ x4| j D ]*}t	|t
ƒr^| |¡ qD| | j|Ž ¡ qDW |S )N)rT   r(   )rj   r(   r   r+   r`   Úmixed_subtyperi   Úis_multipartrk   r?   r   Ú_create_attachment)rJ   r�   r(   Úbody_msgro   r   r   r   rŸ   `  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ˆ   r6   r‰   r„   Zrfc822)r9   r(   r   r+   rR   r?   rd   r„   r
   r   r   rP   r   r^   ÚEncodersÚencode_base64)rJ   r’   r“   r•   r–   r(   ro   r   r   r   Ú_create_mime_attachmentn  s    





z$EmailMessage._create_mime_attachmentc             C   sR   |   ||¡}|rNy| 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-8r8   zContent-Dispositionro   )r‘   )r¦   r-   r.   Ú
add_header)rJ   r‘   r’   r“   ro   r   r   r   r¢   Œ  s    zEmailMessage._create_attachment)
r8   r8   NNNNNNNN)F)F)NNN)N)N)r   r   r   Ú__doc__r|   r    r(   rV   rp   r„   r†   r‡   rk   rž   r}   rŸ   r¦   r¢   r   r   r   r   rd   Ã   s"     
*


$
rd   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.
    Úalternativer8   Nc                s,   t ƒ  |||||||||
|¡
 |	p$g | _dS )zg
        Initialize a single email message (which can be sent to multiple
        recipients).
        N)ÚsuperrV   Úalternatives)rJ   r*   ri   rh   r   r!   rm   rj   rn   r¬   r    rg   )Ú	__class__r   r   rV   ¤  s    
zEmailMultiAlternatives.__init__c             C   s,   |dk	st ‚|dk	st ‚| j ||f¡ dS )z-Attach an alternative content representation.N)rŠ   r¬   r‹   )rJ   r’   r“   r   r   r   Úattach_alternative±  s    z)EmailMultiAlternatives.attach_alternativec             C   s   |   |  |¡¡S )N)rŸ   Ú_create_alternatives)rJ   r�   r   r   r   r}   ·  s    z&EmailMultiAlternatives._create_messagec             C   sX   | j p
tj}| jrT|}t| j|d�}| jr4| |¡ x| jD ]}| | j|Ž ¡ q<W |S )N)rT   r(   )	r(   r   r+   r¬   r`   Úalternative_subtyperi   rk   r¦   )rJ   r�   r(   r£   rª   r   r   r   r¯   º  s    
z+EmailMultiAlternatives._create_alternatives)r8   r8   NNNNNNNNN)
r   r   r   r¨   r°   rV   r®   r}   r¯   Ú__classcell__r   r   )r­   r   r©   œ  s     r©   ):rŒ   r˜   r…   r   ÚCharsetr   r¤   r   r   Zemail.errorsr   r   Zemail.headerr   Zemail.headerregistryr	   Ú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   Zdjango.confr   Zdjango.core.mail.utilsr   Zdjango.utils.encodingr   r]   Úbody_encodingr\   ÚQPrŽ   rX   Ú
ValueErrorr   r0   r4   r=   r%   rC   rP   rR   r`   rd   r©   r   r   r   r   Ú<module>   sV   

 Z