o
    ˜¨Êh-E  ã                   @   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    úJ/var/www/html/env/lib/python3.10/site-packages/django/core/mail/message.pyr   #   s    r   >   úreply-toú	resent-ccú	resent-toú
resent-bccúresent-fromúresent-senderÚccÚtoÚbccÚfromÚsenderc                    s¾   ˆ pt j‰ t|ƒ}d|v sd|v rtd|| f ƒ‚z| d¡ W n. tyN   |  ¡ tv r=d ‡ fdd„t	|fƒD ƒ¡}nt
|ˆ ƒ ¡ }Y | |fS Y | |fS w |  ¡ 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Úvalr6   r    r5   r!   Úforbid_multi_line_headers7   s*   

ÿ
ÿøörB   c           
   
   C   sD  d}t | tƒs=t| ƒ} z	t | ¡\}}W n tttfy$   td|  ƒ‚w |r/td|| f ƒ‚|jp3d}|j	}|j
p;d}n| \}}| dd¡\}}|| | }d|v sWd|v r[td	ƒ‚z| d
¡ t|ƒ ¡ }W n tyx   t||ƒ ¡ }Y nw z| d
¡ W n ty�   t||ƒ ¡ }Y nw 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
   Úget_mailboxr   Ú
ValueErrorÚ
IndexErrorÚdisplay_nameÚ
local_partrG   Úrsplitr;   r   r<   r   r	   r   Ú	addr_spec)
r4   r6   ÚaddressÚtokenÚrestÚnmÚ	localpartrG   Úaddress_partsÚparsed_addressr    r    r!   r2   N   sD   
ÿ
ÿ

ÿÿr2   c                   @   s    e Zd Zddd„Zddd„ZdS )	Ú	MIMEMixinFr-   c                 C   ó,   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©Úselfr]   r^   ÚfpÚgr    r    r!   Ú	as_string{   ó   zMIMEMixin.as_stringc                 C   rY   )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.
        FrZ   r\   )r   r   ÚBytesGeneratorr`   ra   rb   r    r    r!   Úas_bytesˆ   rg   zMIMEMixin.as_bytesN)Fr-   )r   r   r   rf   ri   r    r    r    r!   rX   z   s    
rX   c                   @   s   e Zd Zdd„ ZdS )ÚSafeMIMEMessagec                 C   s"   t ||dƒ\}}t | ||¡ d S )Nr/   )rB   r   Ú__setitem__©rc   r@   rA   r    r    r!   rk   —   s   zSafeMIMEMessage.__setitem__N)r   r   r   rk   r    r    r    r!   rj   –   s    rj   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)r6   r   Ú__init__)rc   Ú_textro   rp   r    r    r!   rq   ž   s   zSafeMIMEText.__init__c                 C   ó$   t ||| jƒ\}}t | ||¡ d S r1   )rB   r6   r   rk   rl   r    r    r!   rk   ¢   ó   zSafeMIMEText.__setitem__c                 C   sJ   |dkrt |tjƒstdd„ | ¡ D ƒƒ}|rtnt}tj| ||d� d S )Nr   c                 s   s    � | ]}t | ¡ ƒtkV  qd S r1   )Úlenr;   ÚRFC5322_EMAIL_LINE_LENGTH_LIMIT)r3   Úliner    r    r!   r7   ¨   s
   € ÿ
ÿz+SafeMIMEText.set_payload.<locals>.<genexpr>r   )rH   ÚCharsetÚanyÚ
splitlinesÚutf8_charset_qpÚutf8_charsetr   Úset_payload)rc   Úpayloadr   Úhas_long_linesr    r    r!   r}   ¦   s   þzSafeMIMEText.set_payload)rn   Nr1   )r   r   r   rq   rk   r}   r    r    r    r!   rm   �   s    
rm   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 r1   )r6   r   rq   )rc   ro   ÚboundaryÚ	_subpartsr6   Ú_paramsr    r    r!   rq   ³   s   zSafeMIMEMultipart.__init__c                 C   rs   r1   )rB   r6   r   rk   rl   r    r    r!   rk   ¹   rt   zSafeMIMEMultipart.__setitem__)r�   NNN)r   r   r   rq   rk   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d„ ZdS )#ÚEmailMessagez"A container for email information.rn   r�   NrC   c                 C   s  |rt |tƒrtdƒ‚t|ƒ| _ng | _|	r%t |	tƒrtdƒ‚t|	ƒ| _ng | _|r9t |tƒr3tdƒ‚t|ƒ| _ng | _|
rMt |
tƒrGtdƒ‚t|
ƒ| _ng | _|pTtj	| _
|| _|p\d| _g | _|rx|D ]}t |tƒrr|  |¡ qe| j|Ž  qe|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 tuplerC   N)rH   r:   Ú	TypeErrorÚlistr)   r(   r*   Úreply_tor   ÚDEFAULT_FROM_EMAILÚ
from_emailr8   ÚbodyÚattachmentsr   ÚattachÚextra_headersÚ
connection)rc   r8   rŒ   r‹   r)   r*   r�   r�   Úheadersr(   r‰   Ú
attachmentr    r    r!   rq   Å   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�   )rc   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rNttjd	�|d
< d|vrYttd�|d< | j ¡ D ]\}}| ¡ dkrl|||< q^|S )NÚSubjectÚFromÚToÚCczReply-Toc                 S   s   g | ]}|  ¡ ‘qS r    )r=   )r3   Úkeyr    r    r!   Ú
<listcomp>  ó    z(EmailMessage.message.<locals>.<listcomp>Údate)Ú	localtimeÚDatez
message-id)rG   z
Message-IDr+   )r6   r   r9   rm   rŒ   Úcontent_subtypeÚ_create_messager8   r�   Úgetr‹   Ú_set_list_header_if_not_emptyr)   r(   r‰   r   ÚEMAIL_USE_LOCALTIMEr   r   Úitemsr=   )rc   r6   Ú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    )r3   Úemailr    r    r!   r›   "  rœ   z+EmailMessage.recipients.<locals>.<listcomp>)r)   r(   r*   )rc   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)rc   r”   r    r    r!   Úsend$  s   zEmailMessage.sendc                 C   s´   t |tƒr|dus|durtdƒ‚| j |¡ dS |du r!tdƒ‚|p+t |¡d p+t}| dd¡\}}|dkrOt |t	ƒrOz| 
¡ }W n tyN   t}Y nw | 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   ú/rE   Útext)rH   r   rK   r�   ÚappendÚ	mimetypesÚ
guess_typeÚDEFAULT_ATTACHMENT_MIME_TYPEÚsplitÚbytesÚdecodeÚUnicodeDecodeError)rc   ÚfilenameÚcontentÚmimetypeÚbasetypeÚsubtyper    r    r!   rŽ   ,  s,   
ÿÿý
ýzEmailMessage.attachc                 C   sP   t |ƒ}| d¡�}| ¡ }|  |j||¡ W d  ƒ dS 1 s!w   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ÚreadrŽ   r@   )rc   Úpathrº   Úfiler¹   r    r    r!   Úattach_fileT  s
   "þzEmailMessage.attach_filec                 C   s
   |   |¡S r1   )Ú_create_attachments©rc   r¦   r    r    r!   r¡   d  s   
zEmailMessage._create_messagec                 C   sr   | j r7| jptj}|}t| j|d�}| js| ¡ r| |¡ | j D ]}t	|t
ƒr.| |¡ q!| | j|Ž ¡ q!|S ©N)ro   r6   )r�   r6   r   r9   r€   Úmixed_subtyperŒ   Úis_multipartrŽ   rH   r   Ú_create_attachment)rc   r¦   r6   Úbody_msgr’   r    r    r!   rÃ   g  s   


z EmailMessage._create_attachmentsc                 C   sž   |  dd¡\}}|dkr| jptj}t|||ƒ}|S |dkr>|dkr>t|tƒr,| ¡ }nt|tƒs7t	t
|ƒƒ}t||ƒ}|S 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®   rE   r¯   r©   Úrfc822)r´   r6   r   r9   rm   rH   r…   r©   r   r   r   rj   r   r}   ÚEncodersÚencode_base64)rc   r¹   rº   r»   r¼   r6   r’   r    r    r!   Ú_create_mime_attachmentu  s    ï




ý

z$EmailMessage._create_mime_attachmentc                 C   sP   |   ||¡}|r&z| d¡ W n ty   dd|f}Y nw |jdd|d� |S )zg
        Convert the filename, content, mimetype triple into a MIME attachment
        object.
        r/   r   rC   zContent-Dispositionr’   )r¸   )rÍ   r;   r<   Ú
add_header)rc   r¸   r¹   rº   r’   r    r    r!   rÈ   “  s   ÿÿzEmailMessage._create_attachmentc                 C   sJ   |r#z| j | }W n ty   d dd„ |D ƒ¡}Y nw |||< dS dS )zt
        Set msg's header, either from self.extra_headers, if present, or from
        the values argument.
        r0   c                 s   s   � | ]}t |ƒV  qd S r1   )r:   )r3   Úvr    r    r!   r7   ¬  s   € z=EmailMessage._set_list_header_if_not_empty.<locals>.<genexpr>N)r�   ÚKeyErrorr?   )rc   r¦   ÚheaderÚvaluesr¨   r    r    r!   r£   £  s   ÿûz*EmailMessage._set_list_header_if_not_empty)
rC   rC   NNNNNNNN)F)NNNr1   )r   r   r   Ú__doc__r    rÆ   r6   rq   r“   r©   r«   r­   rŽ   rÂ   r¡   rÃ   rÍ   rÈ   r£   r    r    r    r!   r…   ¾   s6    
õ
6


(
r…   c                       sT   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.
    ÚalternativerC   Nc                    s,   t ƒ  |||||||||
|¡
 |	pg | _dS )r†   N)Úsuperrq   Úalternatives)rc   r8   rŒ   r‹   r)   r*   r�   r�   r‘   r×   r(   r‰   ©Ú	__class__r    r!   rq   ¹  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.)rK   r×   r°   )rc   r¹   rº   r    r    r!   Úattach_alternativeÙ  s   z)EmailMultiAlternatives.attach_alternativec                 C   s   |   |  |¡¡S r1   )rÃ   Ú_create_alternativesrÄ   r    r    r!   r¡   ß  s   z&EmailMultiAlternatives._create_messagec                 C   sT   | j ptj}| jr(|}t| j|d�}| jr| |¡ | jD ]
}| | j|Ž ¡ q|S rÅ   )	r6   r   r9   r×   r€   Úalternative_subtyperŒ   rŽ   rÍ   )rc   r¦   r6   rÉ   rÕ   r    r    r!   rÛ   â  s   ÿ

z+EmailMultiAlternatives._create_alternatives)rC   rC   NNNNNNNNN)
r   r   r   rÓ   rÜ   rq   rÚ   r¡   rÛ   Ú__classcell__r    r    rØ   r!   rÔ   °  s$    ô rÔ   );r±   rª   r   rx   r   rË   r   r   Úemail.errorsr   Úemail.headerr   Úemail.headerregistryr	   r
   Úemail.messager   Úemail.mime.baser   Úemail.mime.messager   Úemail.mime.multipartr   Úemail.mime.textr   Úemail.utilsr   r   r   r   Úior   r   Úpathlibr   Údjango.confr   Údjango.core.mail.utilsr   Údjango.utils.encodingr   r   r|   Úbody_encodingr{   ÚQPr³   rv   rK   r   r>   rB   r2   rX   rj   rm   r€   r…   rÔ   r    r    r    r!   Ú<module>   sF    

, s