
    +{Bi\                     v   d dl Zd dlZd dlZd dl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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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+ d dl,m-Z-m.Z.m/Z/ d dl0m1Z1  e
j                  d      Z2de2_3         e
j                  d      Z4e
jj                  e4_3        dZ6dZ7e8Z9h dZ:d Z;d Z< G d d      Z= G d de=e      Z> G d d e=e      Z? G d! d"e=e      Z@ ed#d$d%g      ZA ed&g d'      ZB G d( d)      ZC G d* d+eC      ZDy),    N)
namedtuple)datetimetimezonecharset)	generator)HeaderParseError)Header)AddressAddressHeaderparser)MIMEBase)MIMEMessage)MIMEMultipart)MIMEText)
formataddrgetaddresses
make_msgid)BytesIOStringIO)Path)settings)DNS_NAME)RemovedInDjango70Warningdeprecate_posargs)force_bytes	force_strpunycode)get_current_timezoneutf-8zapplication/octet-streami  >   	resent-cc	resent-to
resent-bccresent-fromresent-sendercctobccfromsenderreply-toc                    t        j                  dt               xs t        j                  t        |      }d|v sd|v rt        d|d| d      	 |j                  d       | j                         dk(  rt        |      j                         }| |fS # t        $ r[ | j                         t        v r%d	j                  fd
t        |f      D              }nt        |      j                         }Y | |fS w xY w)z6Forbid multi-line headers to prevent header injection.zThe internal API forbid_multi_line_headers() is deprecated. Python's modern email API (with email.message.EmailMessage or email.policy.default) will reject multi-line headers.
z*Header values can't contain newlines (got z for header )asciisubject, c              3   6   K   | ]  }t        |        y wN)sanitize_address).0addrencodings     M/var/www/python/venv/lib/python3.12/site-packages/django/core/mail/message.py	<genexpr>z,forbid_multi_line_headers.<locals>.<genexpr>U   s      59 x0s   )warningswarnr   r   DEFAULT_CHARSETstrBadHeaderErrorencodelowerr
   UnicodeEncodeErrorADDRESS_HEADERSjoinr   )namevalr8   s     `r9   forbid_multi_line_headersrG   B   s    MM	A 	!	 3833H
c(Cs{dckMPRVW
 	
'

7 ::<9$+$$&C9  1::<?*)) =I3&=Q C h'..0C 91s   B AC;:C;c                 |   t        j                  dt               d}t        | t              set        |       } 	 t        j                  |       \  }}|rt        d|d| d      |j                  xs d}|j                  }|j                  xs d}n-| \  }}d|vrt        d	| d      |j                  dd
      \  }}||z   |z   }d|v sd|v rt        d      	 |j                  d       t!        |      j                         }	 |j                  d       t%        |      }t'        ||      }	t)        ||	j*                  f      S # t        t        t        f$ r t        d| z        w xY w# t"        $ r t!        ||      j                         }Y w xY w# t"        $ r t!        ||      j                         }Y w xY w)zF
    Format a pair of (name, address) or an email address string.
    a  The internal API sanitize_address() is deprecated. Python's modern email API (with email.message.EmailMessage or email.policy.default) will handle most required validation and encoding. Use Python's email.headerregistry.Address to construct formatted addresses from component parts.NzInvalid address; only z could be parsed from "" zInvalid address "%s"@zInvalid address "   r-   r.   z7Invalid address; address parts cannot contain newlines.r0   )usernamedomain)r;   r<   r   
isinstancetupler   r   get_mailbox
ValueErrordisplay_name
local_partrN   r	   
IndexErrorrsplitr@   r
   rB   r   r   r   	addr_spec)
r7   r8   addresstokenrestnm	localpartrN   address_partsparsed_addresss
             r9   r5   r5   a   s    MM	5
 	! GdE"	( ,,T2KE4  LQSWX  ##)rB((I\\'RFGg0	;<<#NN32	6NV+M} 5RSS+
		'BZ 9! fFi?Nr>33455E !*j9 	<3d:;;	<2  +B!((*+  99h/668	9s/   E *E, F #E),#FF#F;:F;c                       e Zd ZddZddZy)	MIMEMixinc                     t               }t        j                  |d      }|j                  | ||       |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selfre   rf   fpgs        r9   	as_stringzMIMEMixin.as_string   s;     Z7			$7	;{{}    c                     t               }t        j                  |d      }|j                  | ||       |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.
        Frb   rd   )r   r   BytesGeneratorrh   ri   rj   s        r9   as_byteszMIMEMixin.as_bytes   s;     Y$$Re<			$7	;{{}ro   N)Fr-   )__name__
__module____qualname__rn   rr    ro   r9   r`   r`      s    ro   r`   c                       e Zd Zd Zy)SafeMIMEMessagec                 R    t        ||d      \  }}t        j                  | ||       y )Nr0   )rG   r   __setitem__rk   rE   rF   s      r9   rz   zSafeMIMEMessage.__setitem__   s(     .dCA	cdC0ro   N)rs   rt   ru   rz   rv   ro   r9   rx   rx      s    1ro   rx   c                   "    e Zd ZddZd ZddZy)SafeMIMETextNc                 D    || _         t        j                  | |||       y )N)_subtype_charset)r8   r   __init__)rk   _textr   r   s       r9   r   zSafeMIMEText.__init__   s     $8Lro   c                 f    t        ||| j                        \  }}t        j                  | ||       y r4   )rG   r8   r   rz   r{   s      r9   rz   zSafeMIMEText.__setitem__   s*    -dCG	cT4-ro   c                     |dk(  rHt        |t        j                        s.t        d |j                         D              }|rt        nt
        }t        j                  | ||       y )Nr    c              3   `   K   | ]&  }t        |j                  d             t        kD   ( yw)surrogateescape)errorsN)lenr@   RFC5322_EMAIL_LINE_LENGTH_LIMIT)r6   lines     r9   r:   z+SafeMIMEText.set_payload.<locals>.<genexpr>   s3      !  DKK'8K9:12!s   ,.r   )rO   Charsetany
splitlinesutf8_charset_qputf8_charsetr   set_payload)rk   payloadr   has_long_liness       r9   r   zSafeMIMEText.set_payload   sV    gj'//&J  ! $..0! N *8o\GT7G<ro   )plainNr4   )rs   rt   ru   r   rz   r   rv   ro   r9   r}   r}      s    M.
=ro   r}   c                       e Zd Z	 ddZd Zy)SafeMIMEMultipartNc                 D    || _         t        j                  | |||fi | y r4   )r8   r   r   )rk   r   boundary	_subpartsr8   _paramss         r9   r   zSafeMIMEMultipart.__init__   s$     !tXxNgNro   c                 f    t        ||| j                        \  }}t        j                  | ||       y r4   )rG   r8   r   rz   r{   s      r9   rz   zSafeMIMEMultipart.__setitem__   s*    -dCG	c!!$c2ro   )mixedNNN)rs   rt   ru   r   rz   rv   ro   r9   r   r      s    HLO3ro   r   EmailAlternativecontentmimetypeEmailAttachment)filenamer   r   c            	           e Zd ZdZdZdZ eeg d      	 	 	 	 ddddddddd       ZddZ	e
j                  j                  ddZd	 Zdd
ZddZddZd Zd Zd Zd Zd Zy)EmailMessagez"A container for email information.r   Nr(   
connectionattachmentsheadersr&   reply_toc                   |r,t        |t              rt        d      t        |      | _        ng | _        |	r,t        |	t              rt        d      t        |	      | _        ng | _        |r,t        |t              rt        d      t        |      | _        ng | _        |
r,t        |
t              rt        d      t        |
      | _        ng | _        |xs t        j                  | _
        || _        |xs d| _        g | _        |rn|D ]i  }t        |t        j                  j                         r| j#                  |       9t        |t$              r| j#                  |       [ | j"                  |  k |xs i | _        || _        y)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 tuplerJ   N)rO   r>   	TypeErrorlistr'   r&   r(   r   r   DEFAULT_FROM_EMAIL
from_emailr1   bodyr   emailmessageMIMEPartattachr   extra_headersr   )rk   r1   r   r   r'   r(   r   r   r   r&   r   
attachments               r9   r   zEmailMessage.__init__   sG   : "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%--*@*@AKK
+
H5KK
+DKK,- %]$ro   c                 Z    ddl m} | j                  s ||      | _        | j                  S )Nr   )get_connection)fail_silently)django.core.mailr   r   )rk   r   r   s      r9   r   zEmailMessage.get_connection4  s"    3,=IDOro   policyc                   t         j                  j                  |      }| j                  |       | j	                  |       t        | j                        |d<   t        | j                  j                  d| j                              |d<   | j                  |d| j                         | j                  |d| j                         | j                  |d| j                         | j                  D cg c]  }|j                          }}d|vrCt        j                   rt#               }nt$        j&                  }t)        j*                  |      |d<   d	|vrt-        t.        
      |d<   | j                  j1                         D ](  \  }}|j                         dvst3        |d      ||<   * | j5                  |       |S c c}w )Nr   SubjectFromToCczReply-TodateDatez
message-id)rN   z
Message-ID>   r&   r'   r)   r+   T)strings_only)r   r   r   _add_bodies_add_attachmentsr>   r1   r   getr   _set_list_header_if_not_emptyr'   r&   r   rA   r   EMAIL_USE_LOCALTIMEr   r   utcr   nowr   r   itemsr   #_idna_encode_address_header_domains)rk   r   msgkeyheader_namestzrE   values           r9   r   zEmailMessage.message;  sx   mm(((7c"T\\*I$,,00IJF**3dgg>**3dgg>**3
DMMJ 04/A/AB		BB%++)+\\",,r*CK|+ *( ;C--335 	@KD%zz|#CC%e$?D		@ 	005
 Cs   2Gc                 z    | j                   | j                  z   | j                  z   D cg c]  }|s|	 c}S c c}w )z
        Return a list of all recipients of the email (includes direct
        addressees as well as Cc and Bcc entries).
        )r'   r&   r(   )rk   r   s     r9   
recipientszEmailMessage.recipientsY  s0    
 %)GGdgg$5$@K%UKKKs   88c                 f    | j                         sy| j                  |      j                  | g      S )zSend the email message.r   )r   r   send_messages)rk   r   s     r9   sendzEmailMessage.send`  s/      ""=1??GGro   c                    t        |t        j                  j                        r+||t	        d      | j
                  j                  |       yt        |t              rEt        j                  dt               ||t	        d      | j
                  j                  |       y|t	        d      |xs  t        j                  |      d   xs t        }|j                  dd      \  }}|d	k(  r!t        |t              r	 |j!                         }| j
                  j                  t%        |||             y# t"        $ r	 t        }Y 8w xY w)
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 MIMEPart instance is provided.zKMIMEBase attachments are deprecated. Use an email.message.MIMEPart instead.zLcontent and mimetype must not be given when a MIMEBase instance is provided.zcontent must be provided.r   /rL   text)rO   r   r   r   rR   r   appendr   r;   r<   r   	mimetypes
guess_typeDEFAULT_ATTACHMENT_MIME_TYPEsplitbytesdecodeUnicodeDecodeErrorr   )rk   r   r   r   basetypesubtypes         r9   r   zEmailMessage.attachh  sN    h 6 67"h&: ,  ##H-(+MM:(
 "h&: ,  ##H-_899  0''1!40/ 
 !)sA 6Hg6!gu-@").."2 ##OHgx$PQ . @ $@@s   D8 8E
	E
c                     t        |      }|j                  d      5 }|j                         }| j                  |j                  ||       ddd       y# 1 sw Y   yxY w)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   rE   )rk   pathr   filer   s        r9   attach_filezEmailMessage.attach_file  sN     DzYYt_ 	6iikGKK		7H5	6 	6 	6s   .AAc                     | j                   s| j                  sY| j                  xs t        j                  }t        | j                   xs d|d      }|j                  || j                  |       y y )NrJ   r   )r8   r   r   r   )r   r   r8   r   r=   r   set_contentcontent_subtype)rk   r   r8   r   s       r9   r   zEmailMessage._add_bodies  s^    99D,,}}@(@(@H		R(;LD OOD$*>*>OQ -ro   c                 d   | j                   rt        | d      rt        d      |j                          | j                   D ]m  }t	        |t
        j                  j                        r|j                  |       9t	        |t              r|j                  |       [ | j                  |g|  o y y )Nmixed_subtypezJEmailMessage no longer supports the undocumented `mixed_subtype` attribute)r   hasattrAttributeError
make_mixedrO   r   r   r   r   r   _add_attachment)rk   r   r   s      r9   r   zEmailMessage._add_attachments  s    t_-$>  NN".. ;
j%--*@*@AJJz*
H5JJz*(D((:z:; ro   c                    | j                   xs t        j                  }|j                  dd      \  }}|dk(  r!t	        |t
              r	 |j                         }|dk(  r|j                  ||||       y |dk(  rt	        |t              r|j                  |j                        }nht	        |t        j                  j                  t        j                  j                  f      s*t        j                  t!        |      |j                        }|j                  |||       y t	        |t
        t"        t$        f      st!        |      }|j                  ||||       y # t        $ r t        }|j                  dd      \  }}Y -w xY w)	Nr   rL   r   )r   r   r   r   r   )r   r   )maintyper   r   )r8   r   r=   r   rO   r   r   r   r   add_attachmentr   r   r   r   Messagemessage_from_bytesr   	bytearray
memoryview)rk   r   r   r   r   r8   r   r   s           r9   r   zEmailMessage._add_attachment  sa   ==<H$<$<$NN32'v*We"<;!..* v8X   " '<0!///<%--44emm6K6KL  22( w(K gy*'EF%g.!!	  9 & ;7$,NN3$:!';s   
E   $FFc                     	 | j                   |   ||<   y# t        $ r" |rdj                  d |D              ||<   Y yY yw xY w)z
        Set msg's header, either from self.extra_headers, if present, or from
        the values argument if not empty.
        r2   c              3   2   K   | ]  }t        |        y wr4   )r>   )r6   vs     r9   r:   z=EmailMessage._set_list_header_if_not_empty.<locals>.<genexpr>  s     '?1A'?s   N)r   KeyErrorrD   )rk   r   headervaluess       r9   r   z*EmailMessage._set_list_header_if_not_empty  sM    
	@,,V4CK 	@"ii'?'??F 	@s    &A A c                    t        |j                  dd      s|j                         D ]  \  }}t        |t              st        d |j                  D              s4|j                  ||j                  D cg c]7  }t        |j                  |j                  t        |j                              9 c}        yyc c}w )z
        If msg.policy does not permit utf8 in headers, IDNA encode all
        non-ASCII domains in its address headers.
        utf8Fc              3   R   K   | ]  }|j                   j                           ! y wr4   )rN   isascii)r6   r7   s     r9   r:   zCEmailMessage._idna_encode_address_header_domains.<locals>.<genexpr>  s%      <26++--<s   %')rS   rM   rN   N)getattrr   r   rO   r   r   	addressesreplace_headerr   rS   rM   r   rN   )rk   r   fieldr   r7   s        r9   r   z0EmailMessage._idna_encode_address_header_domains  s     szz651 !$		 ue]3 <:?//< 9 && ). !% $-1->->)-'/'<
		 2s   6<B=rJ   rJ   NN)F)NNNr4   )rs   rt   ru   __doc__r   r8   r   r   r   r   r   r   defaultr   r   r   r   r   r   r   r   r   r   rv   ro   r9   r   r      s    ,O H 	

 8% 8%
8%t !& 4 4 <LH2Rh6 R;$*X	@ro   r   c            
       p     e Zd ZdZ eeg d      	 	 	 	 ddddddddd fd       Zd Z fdZd Z	 x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.
    )r(   r   r   r   alternativesr&   r   Nc                    t         |   |||||||||
|
       |	xs g D cg c]
  }t        |  c}| _        yc c}w )r   r   N)superr   r   r  )rk   r1   r   r   r'   r(   r   r   r   r  r&   r   alternative	__class__s                r9   r   zEmailMultiAlternatives.__init__$  sa    > 	!# 	 	
 @L?Qr
/:k*
 
s   ;c                 l    ||t        d      | j                  j                  t        ||             y)z-Attach an alternative content representation.Nz+Both content and mimetype must be provided.)rR   r  r   r   )rk   r   r   s      r9   attach_alternativez)EmailMultiAlternatives.attach_alternativeS  s4    ?h.JKK  !1'8!DEro   c                 (   | j                   s| j                  st        |   |       | j                  rt	        | d      rt        d      |j                          | j                  xs t        j                  }| j                  D ]  }|j                  j                  dd      \  }}|j                  }|dk(  r5t        |t              r|j                         }|j!                  |||       ht#        ||d      }|j!                  |||	        |S )
Nalternative_subtypezZEmailMultiAlternatives no longer supports the undocumented `alternative_subtype` attributer   rL   r   r   T)r8   r   )r   r   )r   r  r  r   r   r   make_alternativer8   r   r=   r   r   r   rO   r   r   add_alternativer   )rk   r   r8   r  r   r   r   r  s          r9   r   z"EmailMultiAlternatives._add_bodiesY  s   99D--G$t23$D    "}}@(@(@H#00 	U$/$8$8$>$>sA$F!'%--v%!'51").."2''('S)'HSWXG''(G'T	U 
ro   c                 z    || j                   vry| j                  D ]  \  }}|j                  d      s||vs y y)zz
        Checks that ``text`` occurs in the email body and in all attached MIME
        type text/* alternatives.
        Fztext/T)r   r  
startswith)rk   r   r   r   s       r9   body_containsz$EmailMultiAlternatives.body_containsq  sJ    
 tyy !%!2!2 	GX""7+G0C	 ro   r	  )rs   rt   ru   r
  r   r   r   r  r   r  __classcell__)r  s   @r9   r  r    sd      	
 !
 !
!
FF0ro   r  )Eemail.messager   email.policyr   r;   collectionsr   r   r   r   r   r   email.errorsr	   email.headerr
   email.headerregistryr   r   r   email.mime.baser   email.mime.messager   email.mime.multipartr   email.mime.textr   email.utilsr   r   r   ior   r   pathlibr   django.confr   django.core.mail.utilsr   django.utils.deprecationr   r   django.utils.encodingr   r   r   django.utils.timezoner   r   body_encodingr   QPr   r   rR   r?   rC   rG   r5   r`   rx   r}   r   r   r   r   r  rv   ro   r9   <module>r1     s$       " ' $  )  ? ? $ * . $ < <      + P B B 6
 ww'! !'//'* '

   :  #&   >46p :1i 1=9h =.	3	= 	3 09j2IJ .0STt tn	_\ _ro   