
    hF                        S r SSKJr  SrSSKrSSKrSSKrSSKrSSKrSSK	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  SSKJrJrJrJr  SSKJr  SSKJr  \R>                  S   S:H  r \ =(       a    \R>                  S   S:  r!\ (       a  \"4r#\"r$SSK
J%r%  \%RL                  r'O\(4r#\)r$Sr'\RT                  " S\RV                  SS5         " S S\,5      r-S+S jr.S,S jr/S,S jr0S,S jr1S r2 " S S\35      r4 " S S\55      r6 " S S\35      r7 " S  S!\35      r8 " S" S#\35      r9 " S$ S%\95      r: " S& S'\95      r;\Rx                  " 5       r=\=R}                  S(S)S*9r?g)-z
flaskext.mail
~~~~~~~~~~~~~

Flask extension for sending email.

:copyright: (c) 2010 by Dan Jacob.
:license: BSD, see LICENSE for more details.
    )with_statementz0.9.1N)charset)encode_base64)MIMEBase)MIMEMultipart)MIMEText)Header)
formatdate
formataddr
make_msgid	parseaddr)contextmanager)current_app         )policyutf-8c                        \ rS rSrS rS rSrg)FlaskMailUnicodeDecodeError3   c                 >    Xl         [        R                  " U /UQ76   g N)objUnicodeDecodeError__init__)selfr   argss      _C:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\flask_mail.pyr   $FlaskMailUnicodeDecodeError.__init__4   s    ##D040    c                     [         R                  U 5      nU< SU R                  < S[        U R                  5      < S3$ )Nz. You passed in z ())r   __str__r   type)r   originals     r   r$   #FlaskMailUnicodeDecodeError.__str__8   s+    %--d3.6$txx.QQr!   )r   N)__name__
__module____qualname____firstlineno__r   r$   __static_attributes__ r!   r   r   r   3   s    1Rr!   r   c                 f   [        U [        5      (       a  U $  [        U [        5      (       dw  [        (       a1  [        U [        5      (       a  [        XU5      n U $ [        U 5      n  U $ [        U S5      (       a  U R                  5       n U $ [        [	        U 5      X5      n  U $ U R                  X5      n  U $ ! [         am  n[        U [        5      (       d  [        U /UR                  Q76 eSR                  U  Vs/ s H  n[        XA[        U5      PM     Os  snf sn5      n  SnAU $ SnAff = f)z
Similar to smart_text, except that lazy instances are resolved to
strings, rather than kept as lazy objects.

If strings_only is True, don't convert (some) non-string-like objects.
__unicode__ N)
isinstance	text_typestring_typesPY3byteshasattrr/   decoder   	Exceptionr   r   join
force_textstrings_only)sencodingerrorseargs        r   r:   r:   =   s    !Y+!\**sa''!!v6A H "!A H M**MMO H eAh9 H *A H  +!Y''-a9!&&99'(*'( %SL'(* +AH+s<   AB9 B9 *!B9 B9 %B9 9
D0:D+=D
D++D0c                      U R                  S5        U $ ! [         aJ     [        X5      R                  5       n  U $ ! [         a    [        U S5      R                  5       n   U $ f = ff = f)Nasciir   )encodeUnicodeEncodeErrorr	   )subjectr=   s     r   sanitize_subjectrF   \   su    8w N  8	8W/668G N " 	8Wg.557GN	88s$    
A)<$A% A)$A%%A)c                 6   [        U [        5      (       a  [        [        U 5      5      n U u  p  [	        X!5      R                  5       n U R                  S5        [        X 45      $ ! [         a    [	        US5      R                  5       n NDf = f! [         a~    SU ;   a\  U R                  SS5      u  p4[        [	        X15      5      nUR                  S5      R                  S5      nSR                  X4/5      n  N[	        X5      R                  5       n  Nf = f)Nr   rB   @r   idna)r1   r3   r   r:   r	   rC   rD   splitstrr7   r9   r   )addrr=   nm	localpartdomains        r   sanitize_addressrP   f   s    $%%D)*HB*B!((*	3G rj!!  *B '')*  3$; $

3 2IF978I]]6*11':F88Y/0D$)002D3s*   A& 	B &$BBA*D<DDc                 $   ^ [        U4S jU 5      $ )Nc                    > [        U T5      $ r   )rP   )r?   r=   s    r   <lambda>$sanitize_addresses.<locals>.<lambda>}   s    )!X6r!   )map)	addressesr=   s    `r   sanitize_addressesrW   |   s    6	BBr!   c                 ,    U (       a  SU ;   d  SU ;   a  gg)z,Used by has_bad_header to check for \r or \n
TFr-   )lines    r   _has_newliner\      s    r!   c                   @    \ rS rSrSrS rS rS rS rSS jr	S	 r
S
rg)
Connection   zHandles connection to host.c                     Xl         g r   )mail)r   ra   s     r   r   Connection.__init__   s    	r!   c                     U R                   R                  (       a  S U l        OU R                  5       U l        SU l        U $ )Nr   )ra   suppresshostconfigure_host
num_emailsr   s    r   	__enter__Connection.__enter__   s2    99DI++-DIr!   c                 \    U R                   (       a  U R                   R                  5         g g r   )re   quit)r   exc_type	exc_valuetbs       r   __exit__Connection.__exit__   s    99IINN r!   c                    U R                   R                  (       a@  [        R                  " U R                   R                  U R                   R
                  5      nO?[        R                  " U R                   R                  U R                   R
                  5      nUR                  [        U R                   R                  5      5        U R                   R                  (       a  UR                  5         U R                   R                  (       aU  U R                   R                  (       a:  UR                  U R                   R                  U R                   R                  5        U$ r   )ra   use_sslsmtplibSMTP_SSLserverportSMTPset_debuglevelintdebuguse_tlsstarttlsusernamepasswordlogin)r   re   s     r   rf   Connection.configure_host   s    99##DII$4$4diinnED<<		 0 0$))..ADC		0199MMO99$))"4"4JJtyy))499+=+=>r!   Nc                    UR                   (       d   S5       eUR                  (       d   S5       eUR                  5       (       a  [        eUR                  c  [
        R
                  " 5       Ul        U R                  (       a  U R                  R                  [        U=(       d    UR                  5      [        [        UR                   5      5      [        (       a  UR                  5       OUR                  5       UR                  UR                  5        [         R#                  U[$        R&                  " 5       S9  U =R(                  S-  sl        U R(                  U R*                  R,                  :X  aI  SU l        U R                  (       a0  U R                  R/                  5         U R1                  5       U l        ggg)zVerifies and sends message.

:param message: Message instance.
:param envelope_from: Email address to be used in MAIL FROM command.
zNo recipients have been addedzRThe message does not specify a sender and a default sender has not been configuredN)appr   r   )send_tosenderhas_bad_headersBadHeaderErrordatetimere   sendmailrP   listrW   r4   as_bytes	as_stringmail_optionsrcpt_optionsemail_dispatchedsendr   _get_current_objectrg   ra   
max_emailsrl   rf   )r   messageenvelope_froms      r   r   Connection.send   s=    ? ??~~ 	+*	+~ ""$$  <<99;GL99II/0OP#$6w$GH58Sw//1g>O>O>Q&33&33	5 	g;+J+J+LM1??dii222DOyy		  //1	  3r!   c                 8    U R                  [        U0 UD65        gz\Shortcut for send(msg).

Takes same arguments as Message constructor.

:versionadded: 0.3.5
Nr   Messager   r   kwargss      r   send_messageConnection.send_message        			'4*6*+r!   )re   ra   rg   r   )r(   r)   r*   r+   __doc__r   ri   rp   rf   r   r   r,   r-   r!   r   r^   r^      s$    %!2F,r!   r^   c                       \ rS rSrSrg)r      r-   N)r(   r)   r*   r+   r,   r-   r!   r   r   r      s    r!   r   c                   &    \ rS rSrSr  SS jrSrg)
Attachment   zEncapsulates file attachment information.

:versionadded: 0.3.5

:param filename: filename of attachment
:param content_type: file mimetype
:param data: the raw file data
:param disposition: content-disposition (if any)
Nc                 h    Xl         X l        X0l        U=(       d    SU l        U=(       d    0 U l        g )N
attachment)filenamecontent_typedatadispositionheadersr   r   r   r   r   r   s         r   r   Attachment.__init__   s*     (	&6,}"r!   )r   r   r   r   r   NNNNN)r(   r)   r*   r+   r   r   r,   r-   r!   r   r   r      s     ?C+/%r!   r   c                       \ rS rSrSr              SS jr\S 5       rSS jrS r	S r
S	 rS
 rS rS rS rS rS r     SS jrSrg)r      a  Encapsulates an email message.

:param subject: email subject header
:param recipients: list of email addresses
:param body: plain text message
:param html: HTML message
:param sender: email sender address, or **MAIL_DEFAULT_SENDER** by default
:param cc: CC list
:param bcc: BCC list
:param attachments: list of Attachment instances
:param reply_to: reply-to address
:param date: send date
:param charset: message character set
:param extra_headers: A dictionary of additional headers for the message
:param mail_options: A list of ESMTP options to be used in MAIL FROM command
:param rcpt_options:  A list of ESMTP options to be used in RCPT commands
Nc                    U=(       d    [         R                  S   R                  n[        U[        5      (       a  SU-  nU=(       d    / U l        Xl        XPl        Xl        U=(       d    / U l	        U=(       d    / U l
        X0l        X@l        Xl        [        5       U l        Xl        Xl        U=(       d    / U l        U=(       d    / U l        U=(       d    / U l        g )Nra   z%s <%s>)r   
extensionsdefault_senderr1   tuple
recipientsrE   r   reply_toccbccbodyhtmlr   r   msgIdr   extra_headersr   r   attachments)r   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   s                  r   r   Message.__init__  s     H;11&9HHfe$$'F$* (9"			\
*(.B(.B&,"r!   c                     [        U R                  5      [        U R                  =(       d    S5      -  [        U R                  =(       d    S5      -  $ )Nr-   )setr   r   r   rh   s    r   r   Message.send_to&  s5    4??#c$((.b&99C2<NNNr!   c                 @    U R                   =(       d    Sn[        XUS9$ )zwCreates a MIMEText object with the given subtype (default: 'plain')
If the text is unicode, the utf-8 charset is used.
r   )_subtype_charset)r   r   )r   textsubtyper   s       r   	_mimetextMessage._mimetext*  s     ,,)'AAr!   c           
         [         R                  S   R                  nU R                  =(       d    SnU R                  =(       d    / n[        U5      S:X  a-  U R                  (       d  U R                  U R                  5      nO[        U5      S:  aF  U R                  (       d5  [        5       nUR                  U R                  U R                  5      5        O|[        5       n[        S5      nUR                  U R                  U R                  S5      5        UR                  U R                  U R                  S5      5        UR                  U5        U R                  (       a"  [        [        U R                  5      U5      US'   [        U R                  U5      US'   S	R!                  [#        [%        ['        U R(                  U5      5      5      5      US
'   [+        U R,                  SS9US'   U R.                  US'   U R0                  (       a:  S	R!                  [#        [%        ['        U R0                  U5      5      5      5      US'   U R2                  (       a  [        U R2                  U5      US'   U R4                  (       a'  U R4                  R7                  5        H	  u  pgXtU'   M     [8        R:                  " S[8        R<                  5      nU GH*  n	[?        U	R@                  RC                  S5      6 n
U
RE                  U	RF                  5        [I        U
5        U	RJ                  nU(       a_  U(       aX  [L        RN                  " SU5      nURQ                  SS5      RS                  S5      nURU                  SU5      RW                  5       n U=(       a    URQ                  S5        U
R]                  SU	R^                  US9  U	R`                   H  u  pU
R]                  X5        M     UR                  U
5        GM-     [b        (       a  [b        Ul2        U$ ! [X         a$    [Z        (       d  URQ                  S5      nSSU4n Nf = f)zCreates the emailra   r   r   alternativeplainr   SubjectFromz, ToT)	localtimeDatez
Message-IDCczReply-Toz[\s]+/NFKDrB   ignorer0   utf8UTF8 zContent-Disposition)r   )3r   r   ascii_attachmentsr   r   lenr   r   r   r   attachrE   rF   r:   rP   r   r9   r   r   rW   r   r
   r   r   r   r   r   itemsrecompileUNICODEr   r   rJ   set_payloadr   r   r   unicodedata	normalizerC   r7   substriprD   r4   
add_headerr   r   message_policyr   )r   r   r=   r   msgr   kvSPACESr   fr   keyvalues                 r   _messageMessage._message1  s.   '226:LL<<*7&&,"{q ..+C!$))/CJJt~~dii01  /C'6Kt~~diiABt~~dii@AJJ{#<<-j.FQC	N&t{{H=FIId3'9$//8'T#UVWD	 d;F JJL77		$s+=dggx+P'Q"RSCI==.t}}hGC
O**002A 3 Hbjj1%J*1177<=AMM*//*!!**H-&00B#??7H=DDWM!::dH5;;=25X__W5 LL.#//"*  , )00
S( 1 JJqM5 &6 >'CJ
! & 2s'v6H"B12s   P+Q
	Q
c                 >    U R                  5       R                  5       $ r   )r   r   rh   s    r   r   Message.as_string|  s    }}((**r!   c                     [         (       a  U R                  5       R                  5       $ U R                  5       R                  5       R	                  U R
                  =(       d    S5      $ )Nr   )PY34r   r   r   rC   r   rh   s    r   r   Message.as_bytes  sE    4==?++--==?,,.55dll6MgNNr!   c                 "    U R                  5       $ r   )r   rh   s    r   r$   Message.__str__  s    ~~r!   c                 "    U R                  5       $ r   )r   rh   s    r   	__bytes__Message.__bytes__  s    }}r!   c                    U R                   U R                  /U R                  -   nU H  n[        U5      (       d  M    g   U R                  (       a  [        U R                  5      (       ax  [        U R                  R                  S5      5       HP  u  p4U(       d    gUS:  a  US   S;  a    g[        U5      (       a    g[        UR                  5       5      S:X  d  MP    g   g)zChecks for bad headers i.e. newlines in subject, sender or recipients.
RFC5322: Allows multiline CRLF with trailing whitespace (FWS) in headers
Tz
r   z	 F)	r   r   r   r\   rE   	enumeraterJ   r   r   )r   r   headerlinenumr[   s        r   r   Message.has_bad_headers  s    
 ;;.@FF##  <<DLL))%.t||/A/A&/I%JMG#{tAwe';##D))#4::<(A-# &K r!   c                 R    SSK Jn  SnU" [        U5      SS9  U R                  5       $ )Nr   )warnzIis_bad_headers is deprecated, use the new has_bad_headers method instead.r   )
stacklevel)warningsr   DeprecationWarningr   )r   r   r   s      r   is_bad_headersMessage.is_bad_headers  s)    !Y$3##%%r!   c                 &    UR                  U 5        g)zVerifies and sends the message.N)r   )r   
connections     r   r   Message.send  s     	r!   c                 :    U R                   R                  U5        g)zVAdds another recipient to the message.

:param recipient: email address of recipient.
N)r   append)r   	recipients     r   add_recipientMessage.add_recipient  s     	y)r!   c           	      P    U R                   R                  [        XX4U5      5        g)zAdds an attachment to the message.

:param filename: filename of attachment
:param content_type: file mimetype
:param data: the raw file data
:param disposition: content-disposition (if any)
N)r   r
  r   r   s         r   r   Message.attach  s%     	xt'J	Lr!   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   )r   NNNNNNNNNNNNN)r   r   )r(   r)   r*   r+   r   r   propertyr   r   r   r   r   r$   r   r   r  r   r  r   r,   r-   r!   r   r   r      s    $  " !#"""-H O OBIV+O .&
*  Lr!   r   c                   6    \ rS rSr\S 5       rS rS rS rSr	g)
_MailMixini  c              #      ^#    [         (       d  [        S5      e/ mU4S jn[         R                  U5         Tv   [         R                  U5        g! [         R                  U5        f = f7f)aA  Records all messages. Use in unit tests for example::

    with mail.record_messages() as outbox:
        response = app.test_client.get("/email-sending-view/")
        assert len(outbox) == 1
        assert outbox[0].subject == "testing"

You must have blinker installed in order to use this feature.
:versionadded: 0.4
zblinker must be installedc                 (   > TR                  U 5        g r   )r
  )r   r   outboxs     r   _record+_MailMixin.record_messages.<locals>._record  s    MM'"r!   N)r   RuntimeErrorconnect
disconnect)r   r  r  s     @r   record_messages_MailMixin.record_messages  s[       :;;	# 	  )	1L''0''0s   4A,A A,A))A,c                 z    U R                  5        nUR                  U5        SSS5        g! , (       d  f       g= f)zSends a single message instance. If TESTING is True the message will
not actually be sent.

:param message: a Message instance.
N)r  r   )r   r   r  s      r   r   _MailMixin.send  s%     \\^zLL$ ^^s   ,
:c                 8    U R                  [        U0 UD65        gr   r   r   s      r   r   _MailMixin.send_message  r   r!   c                     [        U SS5      =(       d    [        n [        UR                  S   5      $ ! [         a    [        S5      ef = f)z$Opens a connection to the mail host.r   Nra   z9The curent application was not configured with Flask-Mail)getattrr   r^   r   KeyErrorr  r   r   s     r   r  _MailMixin.connect  sL    dE4(7K	\cnnV455 	\Z[[	\s	   4 A
r-   N)
r(   r)   r*   r+   r   r  r   r   r  r,   r-   r!   r   r  r    s$    1 16%,\r!   r  c                        \ rS rSr SS jrSrg)_Maili  c                     Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        Xl	        Xl
        g r   )rv   r~   r   rw   r|   rs   r   r{   r   rd   r   )r   rv   r~   r   rw   r|   rs   r   r{   r   rd   r   s               r   r   _Mail.__init__  s=       	,
$ !2r!   )r   r{   r   r   r   rw   rv   rd   rs   r|   r~   N)F)r(   r)   r*   r+   r   r,   r-   r!   r   r'  r'    s     $)3r!   r'  c                   8    \ rS rSrSrS	S jrS
S jrS rS rSr	g)Maili  z4Manages email messaging

:param app: Flask instance
Nc                 R    Xl         Ub  U R                  U5      U l        g S U l        g r   )r   init_appstater$  s     r   r   Mail.__init__  s#    ?s+DJDJr!   c                    [        UR                  SS5      UR                  S5      UR                  S5      UR                  SS5      UR                  SS5      UR                  S	S5      UR                  S
5      [        UR                  SU5      5      UR                  S5      UR                  SU5      UR                  SS5      5      $ )NMAIL_SERVERz	127.0.0.1MAIL_USERNAMEMAIL_PASSWORD	MAIL_PORT   MAIL_USE_TLSFMAIL_USE_SSLMAIL_DEFAULT_SENDER
MAIL_DEBUGMAIL_MAX_EMAILSMAIL_SUPPRESS_SENDMAIL_ASCII_ATTACHMENTS)r'  getrz   )r   configr{   testings       r   	init_mailMail.init_mail  s    JJ}k2JJ'JJ'JJ{B'JJ~u-JJ~u-JJ,-

</0JJ()JJ+W5JJ/7
 	
r!   c                     U R                  UR                  UR                  UR                  5      n[	        US0 5      Ul        X!R
                  S'   U$ )zInitializes your mail settings from the application settings.

You can use this if you want to set up your Mail instance
at configuration time.

:param app: Flask application instance
r   ra   )r@  r>  r{   r?  r"  r   )r   r   r.  s      r   r-  Mail.init_app.  sE     szz399ckkB !lB7!&vr!   c                 0    [        U R                  US 5      $ r   )r"  r.  )r   names     r   __getattr__Mail.__getattr__=  s    tzz4..r!   )r   r.  r   )FF)
r(   r)   r*   r+   r   r   r@  r-  rF  r,   r-   r!   r   r+  r+    s    

/r!   r+  zemail-dispatchedz
Signal sent when an email is dispatched. This signal will also be sent
in testing mode, even though the email will not actually be sent.
)doc)r   strict)r   )@r   
__future__r   __version__r   blinkerrt   sysr   r   emailr   email.encodersr   email.mime.baser   email.mime.multipartr   email.mime.textr   email.headerr	   email.utilsr
   r   r   r   
contextlibr   flaskr   version_infor4   r   rK   r3   r2   r   rx   r   
basestringunicodeadd_charsetSHORTESTr   r   r:   rF   rP   rW   r\   objectr^   r8   r   r   r   r  r'  r+  	Namespacesignalssignalr   r-   r!   r   <module>r`     sk   & 	   
    ( $ . $  E E % 	qQ
's"a'4LI[[N;LIN   GW--tW =R"4 R>",CN, N,b	Y 	% %(TLf TLn8\ 8\v3J 3",/: ,/^ 


>>"4 ;>  r!   