
    hE                     $   S SK r S SKJr  S SKJr  S SKJrJr  S SKJ	r	  S SK
Jr  S SKJrJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJrJrJrJr  S SKJrJ r   S SK!J"r"  S SK#J$r$  S SK%J&r&  S SK'J(r(J)r)  \R                  " S5      r*S\*l+        \R                  " S5      r,\RZ                  \,l+        Sr.Sr/ " S S\05      r11 Skr2S r3S r4 " S S5      r5 " S S\5\5      r6 " S S \5\5      r7 " S! S"\5\5      r8 " S# S$5      r9 " S% S&\95      r:g)'    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                       \ rS rSrSrg)BadHeaderError#    N)__name__
__module____qualname____firstlineno____static_attributes__r        J/var/www/html/env/lib/python3.13/site-packages/django/core/mail/message.pyr   r   #   s    r&   r   >   cctobccfromsenderreply-to	resent-cc	resent-to
resent-bccresent-fromresent-senderc                   ^ T=(       d    [         R                  m[        U5      nSU;   d  SU;   a  [        SU< SU < S35      e UR	                  S5        U R                  5       S:X  a  [        U5      R	                  5       nX4$ ! [         a`    U R                  5       [        ;   a)  SR                  U4S	 j[        U45       5       5      n X4$ [        UT5      R	                  5       n X4$ f = f)
z6Forbid multi-line headers to prevent header injection.
z*Header values can't contain newlines (got z for header )asciisubject, c              3   <   >#    U  H  n[        UT5      v   M     g 7fN)sanitize_address).0addrencodings     r'   	<genexpr>,forbid_multi_line_headers.<locals>.<genexpr>C   s       =QT x00=Qs   )r   DEFAULT_CHARSETstrr   encodelowerr	   UnicodeEncodeErrorADDRESS_HEADERSjoinr   )namevalr?   s     `r'   forbid_multi_line_headersrK   7   s    3833H
c(Cs{dckMPRVW
 	
'

7 ::<9$+$$&C9  1::<?*)) =I3&=Q C 9	 h'..0C 91s   B AC2C21C2c                 r   Sn[        U [        5      (       dv  [        U 5      n  [        R                  " U 5      u  p4U(       a  [        SU< SU < S35      eUR                  =(       d    SnUR                  nUR                  =(       d    SnO-U u  pRSU;  a  [        SU S35      eUR                  SS	5      u  pgXV-   U-   nS
U;   d  SU;   a  [        S5      e UR                  S5        [        U5      R                  5       n UR                  S5        [        U5      n[!        XgS9n	[#        XYR$                  45      $ ! [        [
        [        4 a    [        SU -  5      ef = f! [         a    [        XQ5      R                  5       n Nf = f! [         a    [        Xa5      R                  5       n Nf = f)z>
Format a pair of (name, address) or an email address string.
NzInvalid address; only z could be parsed from "" zInvalid address "%s"@zInvalid address "   r4   r5   z7Invalid address; address parts cannot contain newlines.r7   )usernamedomain)
isinstancetupler   r   get_mailbox
ValueErrordisplay_name
local_partrR   r   
IndexErrorrsplitrD   r	   rF   r   r
   r   	addr_spec)
r>   r?   addresstokenrestnm	localpartrR   address_partsparsed_addresss
             r'   r<   r<   N   s    GdE""	( ,,T2KE  LQSWX  ##)rB((I\\'RFg0	;<<#NN32	NV+M} 5RSS+
		'BZ 9! fFi?Nr33455E !*j9 	<3d:;;	<2  +B!((*+  99/668	9s/   E  *E' F  $E$'#FF#F65F6c                   (    \ rS rSrSS jrSS jrSrg)	MIMEMixin|   c                     [        5       n[        R                  " USS9nUR                  XUS9  UR	                  5       $ )zReturn 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selfrj   rk   fpgs        r'   	as_stringMIMEMixin.as_string}   s9     Z7			$7	;{{}r&   c                     [        5       n[        R                  " USS9nUR                  XUS9  UR	                  5       $ )zReturn 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.
Frg   ri   )r   r   BytesGeneratorrm   rn   ro   s        r'   as_bytesMIMEMixin.as_bytes   s9     Y$$Re<			$7	;{{}r&   r    N)Fr4   )r!   r"   r#   r$   rs   rw   r%   r    r&   r'   rd   rd   |   s    r&   rd   c                       \ rS rSrS rSrg)SafeMIMEMessage   c                 N    [        XS5      u  p[        R                  " XU5        g )Nr7   )rK   r   __setitem__rp   rI   rJ   s      r'   r}   SafeMIMEMessage.__setitem__   s     -dA	C0r&   r    N)r!   r"   r#   r$   r}   r%   r    r&   r'   rz   rz      s    1r&   rz   c                   .    \ rS rSrSS jrS rSS jrSrg)	SafeMIMEText   Nc                 :    X0l         [        R                  " XX#S9  g )N)_subtype_charset)r?   r   __init__)rp   _textr   r   s       r'   r   SafeMIMEText.__init__   s     $Lr&   c                 b    [        XU R                  5      u  p[        R                  " XU5        g r;   )rK   r?   r   r}   r~   s      r'   r}   SafeMIMEText.__setitem__   s$    -dG	T-r&   c                     US:X  aR  [        U[        R                  5      (       d3  [        S UR                  5        5       5      nU(       a  [        O[
        n[        R                  " XUS9  g )Nr   c              3   `   #    U  H$  n[        UR                  S S95      [        :  v   M&     g7f)surrogateescape)errorsN)lenrD   RFC5322_EMAIL_LINE_LENGTH_LIMIT)r=   lines     r'   r@   +SafeMIMEText.set_payload.<locals>.<genexpr>   s2      ! 1D DKK'8K9:120s   ,.r   )rS   Charsetany
splitlinesutf8_charset_qputf8_charsetr   set_payload)rp   payloadr   has_long_liness       r'   r   SafeMIMEText.set_payload   sW    gj'//&J&J  ! $..0! N *8o\GTG<r&   r?   )plainNr;   )r!   r"   r#   r$   r   r}   r   r%   r    r&   r'   r   r      s    M.
=r&   r   c                   &    \ rS rSr SS jrS rSrg)SafeMIMEMultipart   Nc                 @    X@l         [        R                  " XX#40 UD6  g r;   )r?   r   r   )rp   r   boundary	_subpartsr?   _paramss         r'   r   SafeMIMEMultipart.__init__   s     !txNgNr&   c                 b    [        XU R                  5      u  p[        R                  " XU5        g r;   )rK   r?   r   r}   r~   s      r'   r}   SafeMIMEMultipart.__setitem__   s$    -dG	!!$c2r&   r   )mixedNNN)r!   r"   r#   r$   r   r}   r%   r    r&   r'   r   r      s    HLO3r&   r   c                       \ rS rSrSrSrSrSr          SS jrSS jr	S r
S	 rSS
 jrSS jrSS jrS rS rS rSS jrS rSrg)EmailMessage   z"A container for email information.r   r   Nc                 ,   U(       a1  [        U[        5      (       a  [        S5      e[        U5      U l        O/ U l        U	(       a1  [        U	[        5      (       a  [        S5      e[        U	5      U l        O/ U l        U(       a1  [        U[        5      (       a  [        S5      e[        U5      U l        O/ U l        U
(       a1  [        U
[        5      (       a  [        S5      e[        U
5      U l        O/ U l        U=(       d    [        R                  U l
        Xl        U=(       d    SU l        / U l        U(       a@  U H:  n[        U[        5      (       a  U R                  U5        M+  U R                  " U6   M<     U=(       d    0 U l        X`l        g)O
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 tuplerN   N)rS   rC   	TypeErrorlistr)   r(   r*   reply_tor   DEFAULT_FROM_EMAIL
from_emailr8   bodyattachmentsr   attachextra_headers
connection)rp   r8   r   r   r)   r*   r   r   headersr(   r   
attachments               r'   r   EmailMessage.__init__   s+   " "c"" GHH2hDGDG"c"" GHH2hDGDG#s## HIICyDHDH(C(( MNN NDMDM$C(C(CJB	)
j(33KK
+KK,	 *
 %]$r&   c                 ^    SSK Jn  U R                  (       d  U" US9U l        U R                  $ )Nr   )get_connection)fail_silently)django.core.mailr   r   )rp   r   r   s      r'   r   EmailMessage.get_connection   s"    3,=IDOr&   c                    U R                   =(       d    [        R                  n[        U R                  U R
                  U5      nU R                  U5      nU R                  US'   U R                  R                  SU R                  5      US'   U R                  USU R                  5        U R                  USU R                  5        U R                  USU R                  5        U R                   Vs/ s H  o3R                  5       PM     nnSU;  a  [!        [        R"                  S9US'   S	U;  a  [%        [&        S
9US'   U R                  R)                  5        H  u  pVUR                  5       S:w  d  M  XbU'   M!     U$ s  snf )NSubjectFromToCczReply-Todate)	localtimeDatez
message-id)rR   z
Message-IDr+   )r?   r   rB   r   r   content_subtype_create_messager8   r   getr   _set_list_header_if_not_emptyr)   r(   r   rE   r   EMAIL_USE_LOCALTIMEr   r   items)rp   r?   msgkeyheader_namesrI   values          r'   messageEmailMessage.message  sA   ==<H$<$<499d&:&:HE""3'I((,,VT__EF**3dgg>**3dgg>**3
DMMJ 04/A/AB/A		/AB%
 %x/K/KLCK|+ *( ;C--335KDzz|v%!D	 6 
 Cs   3Fc                     U R                   U R                  -   U R                  -    Vs/ s H  o(       d  M  UPM     sn$ s  snf )zj
Return a list of all recipients of the email (includes direct
addressees as well as Cc and Bcc entries).
)r)   r(   r*   )rp   emails     r'   
recipientsEmailMessage.recipients   s6    
 %)GGdgg$5$@K$@%U$@KKKs
   
A A c                 p    U R                  5       (       d  gU R                  U5      R                  U /5      $ )zSend the email message.r   )r   r   send_messages)rp   r   s     r'   sendEmailMessage.send'  s2       ""=1??GGr&   c                    [        U[        5      (       a-  Uc  Ub  [        S5      eU R                  R	                  U5        gUc  [        S5      eU=(       d&    [
        R                  " U5      S   =(       d    [        nUR                  SS5      u  pEUS:X  a&  [        U[        5      (       a   UR                  5       nU R                  R	                  XU45        g! [         a	    [        n N0f = f)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   /rP   text)rS   r   rV   r   append	mimetypes
guess_typeDEFAULT_ATTACHMENT_MIME_TYPEsplitbytesdecodeUnicodeDecodeError)rp   filenamecontentmimetypebasetypesubtypes         r'   r   EmailMessage.attach/  s     h))"h&: ,  ##H-_899  0''1!40/ 
 !)sA 6H6!gu--@").."2 ##X$AB . @ $@@s   0C C10C1c                     [        U5      nUR                  S5       nUR                  5       nU R                  UR                  XB5        SSS5        g! , (       d  f       g= f)a4  
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   rI   )rp   pathr   filer   s        r'   attach_fileEmailMessage.attach_fileW  sA     DzYYt_iikGKK		75 __s   -A
A!c                 $    U R                  U5      $ r;   )_create_attachmentsrp   r   s     r'   r   EmailMessage._create_messageg  s    '',,r&   c                    U R                   (       a  U R                  =(       d    [        R                  nUn[	        U R
                  US9nU R                  (       d  UR                  5       (       a  UR                  U5        U R                    HI  n[        U[        5      (       a  UR                  U5        M+  UR                  U R                  " U6 5        MK     U$ N)r   r?   )r   r?   r   rB   r   mixed_subtyper   is_multipartr   rS   r   _create_attachment)rp   r   r?   body_msgr   s        r'   r    EmailMessage._create_attachmentsj  s    }}@(@(@HH#T-?-?(SCyyH1133

8$"..
j(33JJz*JJt66
CD	 /
 
r&   c                    UR                  SS5      u  p4US:X  a1  U R                  =(       d    [        R                  n[	        XU5      nU$ US:X  ab  US:X  a\  [        U[        5      (       a  UR                  5       nO)[        U[        5      (       d  [        [        U5      5      n[        X5      nU$ [        X45      nUR                  U5        [        R                  " U5        U$ )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   rP   r   r   rfc822)r   r?   r   rB   r   rS   r   r   r   r   r   rz   r   r   Encodersencode_base64)rp   r   r   r   r   r?   r   s          r'   _create_mime_attachment$EmailMessage._create_mime_attachmentx  s     %NN32v}}@(@(@H%gAJ$ # "w(': '<00!//+11 .i.@A(:J  "(4J""7+"":.r&   c                     U R                  X#5      nU(       a#   UR                  S5        UR                  SSUS9  U$ ! [         a    SSU4n N$f = f)zO
Convert the filename, content, mimetype triple into a MIME attachment
object.
r7   r   rN   zContent-Dispositionr   )r   )r  rD   rF   
add_header)rp   r   r   r   r   s        r'   r   EmailMessage._create_attachment  si    
 11'D
3( !!%|h "   & 3#R23s   > AAc                     U(       a   U R                   U   nXAU'   gg! [         a    SR                  S U 5       5      n N*f = f)z\
Set msg's header, either from self.extra_headers, if present, or from
the values argument.
r9   c              3   8   #    U  H  n[        U5      v   M     g 7fr;   )rC   )r=   vs     r'   r@   =EmailMessage._set_list_header_if_not_empty.<locals>.<genexpr>  s     !9&Q#a&&&s   N)r   KeyErrorrH   )rp   r   headervaluesr   s        r'   r   *EmailMessage._set_list_header_if_not_empty  sO    
 :**62  K   :		!9&!99:s    "AA)
r   r*   r   r(   r   r   r   r   r8   r)   )
rN   rN   NNNNNNNN)F)NNNr;   )r!   r"   r#   r$   __doc__r   r   r?   r   r   r   r   r   r   r   r   r   r  r   r   r%   r    r&   r'   r   r      su    ,OMH 4%l6LH&CP6 -< 
 r&   r   c                   \   ^  \ rS rSrSrSr           S	U 4S jjrS rS rS r	Sr
U =r$ )
EmailMultiAlternativesi  z
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.
alternativec                 V   > [         TU ]  UUUUUUUUU
U5
        U	=(       d    / U l        g)r   N)superr   alternatives)rp   r8   r   r   r)   r*   r   r   r   r  r(   r   	__class__s               r'   r   EmailMultiAlternatives.__init__  s?    $ 		
 ).Br&   c                 ^    Ub  Uc  [        S5      eU R                  R                  X45        g)z-Attach an alternative content representation.Nz+Both content and mimetype must be provided.)rV   r  r   )rp   r   r   s      r'   attach_alternative)EmailMultiAlternatives.attach_alternative  s/    ?h.JKK  '!45r&   c                 B    U R                  U R                  U5      5      $ r;   )r   _create_alternativesr   s     r'   r   &EmailMultiAlternatives._create_message  s    ''(A(A#(FGGr&   c                 @   U R                   =(       d    [        R                  nU R                  (       ai  Un[	        U R
                  US9nU R                  (       a  UR                  U5        U R                   H!  nUR                  U R                  " U6 5        M#     U$ r   )	r?   r   rB   r  r   alternative_subtyper   r   r  )rp   r   r?   r   r  s        r'   r  +EmailMultiAlternatives._create_alternatives  sz    ==<H$<$<H#11HC yy

8$#00

477EF  1
r&   )r  )rN   rN   NNNNNNNNN)r!   r"   r#   r$   r  r!  r   r  r   r  r%   __classcell__)r  s   @r'   r  r    sN     ( /@6H r&   r  );r   r   r   r   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   r   rV   r   rG   rK   r<   rd   rz   r   r   r   r  r    r&   r'   <module>r4     s     $ & 0 )  0 ! $ * . $ H H      + 5 w'! //'* '

   : "% 	Z 	
.+6\ 81i 1=9h =,	3	= 	3o  o d=\ =r&   