Ë
    Úqj�2  ã                   ó  — d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
mZmZmZmZ ddlmZ ddlmZ dZd	Z ej(                  d
«      Z ej(                  d«      Z G d„ dej.                  «      Z G d„ deej2                  «      Zy)z?
An ``asyncio.Protocol`` subclass for lower level IO handling.
é    N)ÚDequeÚOptionalÚcasté   )ÚSMTPDataErrorÚSMTPReadTimeoutErrorÚSMTPResponseExceptionÚSMTPServerDisconnectedÚSMTPTimeoutError)ÚSMTPResponse)Ú
SMTPStatus)ÚSMTPProtocoli    s   (?:\r\n|\n|\r(?!\n))s   (?m)^\.c                   óŠ   — e Zd ZdZddeej                     fd„Zdd„Zdd„Z	dee
   ddfd	„Zdd
„Zdej                  ddfd„Zy)ÚFlowControlMixina·  
    Reusable flow control logic for StreamWriter.drain().
    This implements the protocol methods pause_writing(),
    resume_writing() and connection_lost().  If the subclass overrides
    these it must call the super methods.
    StreamWriter.drain() must wait for _drain_helper() coroutine.

    Copied from stdlib as per recommendation: https://bugs.python.org/msg343685.
    Logging and asserts removed, type annotations added.
    NÚloopc                 ó˜   — |€t        j                  «       | _        n|| _        d| _        t	        j
                  «       | _        d| _        y ©NF)ÚasyncioÚget_event_loopÚ_loopÚ_pausedÚcollectionsÚdequeÚ_drain_waitersÚ_connection_lost)Úselfr   s     úT/var/www/html/kelly-backend/venv/lib/python3.12/site-packages/aiosmtplib/protocol.pyÚ__init__zFlowControlMixin.__init__*   s>   € Øˆ<Ü ×/Ñ/Ó1ˆD�JàˆDŒJàˆŒÜ;F×;LÑ;LÓ;NˆÔØ %ˆÕó    Úreturnc                 ó   — d| _         y ©NT)r   ©r   s    r   Úpause_writingzFlowControlMixin.pause_writing4   s	   € Øˆ�r   c                 óx   — d| _         | j                  D ]$  }|j                  «       rŒ|j                  d «       Œ& y r   )r   r   ÚdoneÚ
set_result©r   Úwaiters     r   Úresume_writingzFlowControlMixin.resume_writing7   s0   € ØˆŒà×)Ô)ˆFØ—;‘;•=Ø×!Ñ! $Õ'ñ *r   Úexcc                 óº   — d| _         | j                  sy | j                  D ]8  }|j                  «       rŒ|€|j	                  d «       Œ(|j                  |«       Œ: y r"   )r   r   r   r&   r'   Úset_exception)r   r+   r)   s      r   Úconnection_lostz FlowControlMixin.connection_lost>   sN   € Ø $ˆÔà�|Š|Øà×)Ô)ˆFØ—;‘;•=Ø�;Ø×%Ñ% dÕ+à×(Ñ(¨Õ-ñ *r   c              ƒ   óN  K  — | j                   rt        d«      ‚| j                  sy | j                  j	                  «       }| j
                  j                  |«       	 |ƒ d {  –—†  | j
                  j                  |«       y 7 Œ # | j
                  j                  |«       w xY w­w©NúConnection lost)r   ÚConnectionResetErrorr   r   Úcreate_futurer   ÚappendÚremover(   s     r   Ú_drain_helperzFlowControlMixin._drain_helperK   s…   è ø€ Ø× Ò Ü&Ð'8Ó9Ð9Ø�|Š|ØØ—‘×)Ñ)Ó+ˆØ×Ñ×"Ñ" 6Ô*ð	/Ø�LˆLà×Ñ×&Ñ& vÕ.ð ùà×Ñ×&Ñ& vÕ.üs0   ‚AB%ÁB Á"BÁ#B Á'B%ÂB ÂB"Â"B%Ústreamúasyncio.Future[None]c                 ó   — t         ‚©N)ÚNotImplementedError©r   r7   s     r   Ú_get_close_waiterz"FlowControlMixin._get_close_waiterW   s   € Ü!Ð!r   r:   ©r    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚAbstractEventLoopr   r$   r*   Ú	Exceptionr.   r6   ÚStreamWriterr=   © r   r   r   r      s_   „ ñ	ñ&˜X g×&?Ñ&?Ñ@ó &óó(ð. 8¨IÑ#6ð .¸4ó .ó
/ð"¨×(<Ñ(<ð "ÐAWô "r   r   c            	       óª  ‡ — e Zd Z	 ddeej
                     ddfˆ fd„Zdej                  ddfd„Zdd„Z	e
defd	„«       Zd
ej                  ddfd„Zdee   ddfˆ fd„Zdeddfd„Zdefd„Zdee   fd„Zdee   fd„Zddee   defd„Zdeddfd„Zddœdedee   defd„Z	 ddedee   defd„Z	 	 d dej<                  dee   dee   defd„Z ˆ xZ!S )!r   Nr   r    c                 óÈ   •— t         ‰| �  |¬«       d| _        t        «       | _        d | _        d | _        d | _        | j                  j                  «       | _
        d| _        y )N)r   F)Úsuperr   Ú	_over_sslÚ	bytearrayÚ_bufferÚ_response_waiterÚ	transportÚ_command_lockr   r3   Ú_closedÚ
_quit_sent)r   r   Ú	__class__s     €r   r   zSMTPProtocol.__init__\   sW   ø€ ô 	‰Ñ˜dÐÔ#ØˆŒÜ “{ˆŒØHLˆÔà:>ˆŒØ59ˆÔØ/3¯z©z×/GÑ/GÓ/IˆŒØˆ�r   r7   r8   c                 ó   — | j                   S r:   )rP   r<   s     r   r=   zSMTPProtocol._get_close_waiterj   s   € Ø�|‰|Ðr   c                 ó$   — | j                  «        y r:   )Ú_retrieve_response_exceptionr#   s    r   Ú__del__zSMTPProtocol.__del__m   s   € ð 	×)Ñ)Õ+r   c                 ój   — t        | j                  duxr | j                  j                  «        «      S )z<
        Check if our transport is still connected.
        N)ÚboolrN   Ú
is_closingr#   s    r   Úis_connectedzSMTPProtocol.is_connectedr   s-   € ô
 �D—N‘N¨$Ð.ÒR°t·~±~×7PÑ7PÓ7RÐ3RÓSÐSr   rN   c                 óð   — t        t        j                  |«      | _        |j	                  d«      d u| _        | j                  j                  «       | _        t        j                  «       | _
        d| _        y )NÚ
sslcontextF)r   r   Ú	TransportrN   Úget_extra_inforJ   r   r3   rM   ÚLockrO   rQ   )r   rN   s     r   Úconnection_madezSMTPProtocol.connection_madey   sW   € Üœg×/Ñ/°Ó;ˆŒØ"×1Ñ1°,Ó?ÀtÐKˆŒØ $§
¡
× 8Ñ 8Ó :ˆÔÜ$Ÿ\™\›^ˆÔØˆ�r   r+   c                 ó  •— t         ‰| �  |«       | j                  sUt        d«      }|r||_        | j
                  r5| j
                  j                  «       s| j
                  j                  |«       d | _        d | _	        y r0   )
rI   r.   rQ   r
   Ú	__cause__rM   r&   r-   rN   rO   )r   r+   Úsmtp_excrR   s      €r   r.   zSMTPProtocol.connection_lost€   sj   ø€ Ü‰Ñ Ô$à�ŠÜ-Ð.?Ó@ˆHÙØ%(�Ô"à×$Ò$¨T×-BÑ-B×-GÑ-GÔ-IØ×%Ñ%×3Ñ3°HÔ=àˆŒØ!ˆÕr   Údatac                 ó®  — | j                   €t        d|›�«      ‚| j                   j                  «       ry | j                  j	                  |«       |j                  d«      }|dk(  s||dz   |dz    dk(  ry 	 | j                  «       }|�| j                   j                  |«       y y # t        $ r%}| j                   j                  |«       Y d }~y d }~ww xY w)Nz4data_received called without a response waiter set: ó   
éÿÿÿÿé   é   ó   -)
rM   ÚRuntimeErrorr&   rL   ÚextendÚrfindÚ_read_response_from_bufferr'   rD   r-   )r   rd   Úlast_linebreakÚresponser+   s        r   Údata_receivedzSMTPProtocol.data_receivedŽ   sß   € Ø× Ñ Ð(ÜØFÀtÀhÐOóð ð ×"Ñ"×'Ñ'Ô)àà�‰×Ñ˜DÔ!ð Ÿ™ EÓ*ˆà˜bÒ Ø�N QÑ&¨¸!Ñ);Ð<ÀÒDàð	;Ø×6Ñ6Ó8ˆHð Ð#Ø×%Ñ%×0Ñ0°Õ:ð $øô ò 	5Ø×!Ñ!×/Ñ/°×4Ñ4ûð	5ús   Á7B& Â&	CÂ/CÃCc                 óœ   — t        d«      }| j                  r5| j                  j                  «       s| j                  j                  |«       y)NzUnexpected EOF receivedF)r
   rM   r&   r-   )r   r+   s     r   Úeof_receivedzSMTPProtocol.eof_received©   s@   € Ü$Ð%>Ó?ˆØ× Ò ¨×)>Ñ)>×)CÑ)CÔ)EØ×!Ñ!×/Ñ/°Ô4ð r   c                 ó¸   — | j                   rN| j                   j                  «       r4| j                   j                  «       s| j                   j                  «       S y)z—
        Return any exception that has been set on the response waiter.

        Used to avoid 'Future exception was never retrieved' warnings
        N)rM   r&   Ú	cancelledÚ	exceptionr#   s    r   rU   z)SMTPProtocol._retrieve_response_exception±   sI   € ð ×!Ò!Ø×%Ñ%×*Ñ*Ô,Ø×)Ñ)×3Ñ3Ô5à×(Ñ(×2Ñ2Ó4Ð4àr   c                 ó¢  — d}t        «       }d}d}	 | j                  j                  d|«      }|dk(  rn¯t        | j                  ||dz    «      }t	        |«      t
        kD  rt        t        j                  d«      ‚	 t        |dd	 «      }|t	        |«      z  }t	        |«      r|j                  d«       |j                  |dd j                  d«      «       |d	d dk7  rd}nŒÑ|r6t        |t        |«      j!                  dd«      «      }| j                  d|…= |S y# t        $ r) t        t        j                  j                  d
|›�«      d‚w xY w)z7Parse the actual response (if any) from the data bufferrg   r   FTrf   r   zResponse too longNrh   zMalformed SMTP response line: ri   s    	
rj   zutf-8Úsurrogateescape)rK   rL   ÚfindÚbytesÚlenÚMAX_LINE_LENGTHr	   r   Úunrecognized_commandÚintÚ
ValueErrorÚinvalid_responseÚvaluerl   Ústripr   Údecode)r   ÚcodeÚmessageÚoffsetÚmessage_completeÚline_end_indexÚlinerp   s           r   rn   z'SMTPProtocol._read_response_from_bufferÀ   sf  € àˆÜ“+ˆØˆØ ÐàØ!Ÿ\™\×.Ñ.¨u°fÓ=ˆNØ Ò#Øä˜Ÿ™ f¨~ÀÑ/AÐBÓCˆDä�4‹yœ?Ò*Ü+Ü×3Ñ3Ð5Hóð ðÜ˜4  ˜8“}�ð ”c˜$“iÑˆFÜ�7Œ|Ø—‘˜uÔ%Ø�N‰N˜4  ˜8Ÿ>™>¨*Ó5Ô6Ø�A�aˆy˜DÒ Ø#'Ð Øð5 ñ8 Ü#Ø”e˜G“n×+Ñ+¨GÐ5FÓGóˆHð —‘˜W˜f˜WÐ%ØˆOàøô+ ò Ü+Ü×/Ñ/×5Ñ5Ø4°T°HÐ=óð ððús   Á<D Ä2EÚtimeoutc              ƒ   óÆ  K  — | j                   €t        d«      ‚	 t        j                  | j                   |«      ƒ d{  –—† }	 | j                  €	d| _         |S | j                  j                  «       | _         |S 7 Œ;# t        t        j                  f$ r}t        d«      |‚d}~ww xY w# | j                  €d| _         w | j                  j                  «       | _         w xY w­w)aã  
        Get a status response from the server.

        This method must be awaited once per command sent; if multiple commands
        are written to the transport without awaiting, response data will be lost.

        Returns an :class:`.response.SMTPResponse` namedtuple consisting of:
          - server response code (e.g. 250, or such, if all goes well)
          - server response string (multiline responses are converted to a
            single, multiline string).
        Nr1   z%Timed out waiting for server response)	rM   r
   r   Úwait_forÚTimeoutErrorr   rN   r   r3   )r   rŠ   Úresultr+   s       r   Úread_responsezSMTPProtocol.read_responseì   sÓ   è ø€ ð × Ñ Ð(Ü(Ð):Ó;Ð;ð		CÜ"×+Ñ+¨D×,AÑ,AÀ7ÓK×K‰Fð
 �~‰~Ð%Ø(,�Ô%ð ˆð )-¯
©
×(@Ñ(@Ó(B�Ô%àˆð LùÜœg×2Ñ2Ð3ò 	YÜ&Ð'NÓOÐUXÐXûð	Yûð �~‰~Ð%Ø(,�Õ%à(,¯
©
×(@Ñ(@Ó(B�Õ%üsD   ‚C!›#A< ¾A:¿A< Á6C!Á:A< Á<B&ÂB!Â!B&Â&B) Â)5CÃC!c                 óú   — | j                   �| j                   j                  «       rt        d«      ‚t        | j                   d«      st	        d| j                   ›d�«      ‚| j                   j                  |«       y )Nr1   Úwritez
Transport z does not support writing.)rN   rY   r
   Úhasattrrk   r‘   )r   rd   s     r   r‘   zSMTPProtocol.write  sh   € Ø�>‰>Ð! T§^¡^×%>Ñ%>Ô%@Ü(Ð):Ó;Ð;Ü�t—~‘~ wÔ/ÜØ˜TŸ^™^Ð.Ð.HÐIóð ð 	�‰×Ñ˜TÕ"r   ©rŠ   Úargsc             ‡   óT  K  — | j                   €t        d«      ‚dj                  |«      dz   }| j                   4 ƒd{  –—†  | j                  |«       |dk(  rd| _        | j                  |¬«      ƒ d{  –—† }ddd«      ƒd{  –—†  |S 7 ŒM7 Œ7 Œ
# 1 ƒd{  –—†7  sw Y   S xY w­w)zj
        Sends an SMTP command along with any args to the server, and returns
        a response.
        NúServer not connectedó    ó   
s   QUIT
Tr“   )rO   r
   Újoinr‘   rQ   r�   )r   rŠ   r”   Úcommandrp   s        r   Úexecute_commandzSMTPProtocol.execute_command  s¡   è ø€ ð ×ÑÐ%Ü(Ð)?Ó@Ð@Ø—)‘)˜D“/ GÑ+ˆà×%×%Ó%Ø�J‰J�wÔà˜+Ò%Ø"&�”à!×/Ñ/¸Ð/Ó@×@ˆH÷ &×%ð ˆð &øð Aøð &ø×%×%Ð%ð ˆüsW   ‚<B(¾B¿B(Á3BÁ5BÁ6BÁ:B(ÂBÂB(ÂBÂB(ÂB%ÂBÂB%Â B(r…   c              ƒ   óð  K  — | j                   €t        d«      ‚t        j                  d|«      }t        j                  d|«      }|j                  d«      s|dz  }|dz  }| j                   4 ƒd{  –—†  | j                  d«       | j                  |¬«      ƒ d{  –—† }|j                  t        j                  k7  r t        |j                  |j                  «      ‚| j                  |«       | j                  |¬«      ƒ d{  –—† }|j                  t        j                  k7  r t        |j                  |j                  «      ‚ddd«      ƒd{  –—†  |S 7 Œæ7 Œ½7 ŒW7 Œ# 1 ƒd{  –—†7  sw Y   S xY w­w)zø
        Sends an SMTP DATA command to the server, followed by encoded message content.

        Automatically quotes lines beginning with a period per RFC821.
        Lone \\r and \\n characters are converted to \\r\\n
        characters.
        Nr–   r˜   s   ..s   .
s   DATA
r“   )rO   r
   ÚLINE_ENDINGS_REGEXÚsubÚPERIOD_REGEXÚendswithr‘   r�   r„   r   Ústart_inputr   r…   Ú	completed)r   r…   rŠ   Ústart_responserp   s        r   Úexecute_data_commandz!SMTPProtocol.execute_data_command'  sB  è ø€ ð ×ÑÐ%Ü(Ð)?Ó@Ð@ä$×(Ñ(¨°'Ó:ˆÜ×"Ñ" 5¨'Ó2ˆØ×Ñ Ô(Ø�wÑˆGØ�8Ñˆà×%×%Ó%Ø�J‰J�{Ô#Ø#'×#5Ñ#5¸gÐ#5Ó#F×FˆNØ×"Ñ"¤j×&<Ñ&<Ò<Ü# N×$7Ñ$7¸×9OÑ9OÓPÐPà�J‰J�wÔØ!×/Ñ/¸Ð/Ó@×@ˆHØ�}‰}¤
× 4Ñ 4Ò4Ü# H§M¡M°8×3CÑ3CÓDÐD÷ &×%ð ˆð &øàFøð
 Aøð &ø×%×%Ð%ð ˆüsn   ‚A/E6Á1EÁ2E6Á5'E ÂEÂA'E ÄEÄAE ÅE6ÅEÅE6ÅE ÅE ÅE6Å E3Å&E)Å'E3Å.E6Útls_contextÚserver_hostnamec           	   ƒ   ó¨  K  — | j                   rt        d«      ‚| j                  €t        d«      ‚| j                  4 ƒd{  –—†  | j	                  d«       | j                  |¬«      ƒ d{  –—† }|j                  t        j                  k7  r t        |j                  |j                  «      ‚| j                  �| j                  j                  «       rt        d«      ‚	 | j                  j                  | j                  | |d||¬«      ƒ d{  –—† }|| _        ddd«      ƒd{  –—†  |S 7 Œê7 ŒÁ7 Œ!# t        t         j                  f$ r}t#        d	«      |‚d}~wt$        $ r}t#        |j&                  d
   «      |‚d}~wt(        $ r/}|j&                  r|j&                  d
   }nd}t        |«      |‚d}~ww xY w7 Œ”# 1 ƒd{  –—†7  sw Y   S xY w­w)zG
        Puts the connection to the SMTP server into TLS mode.
        zAlready using TLS.Nr–   s
   STARTTLS
r“   r1   F)Úserver_sider¦   Ússl_handshake_timeoutz#Timed out while upgrading transportr   z.Connection was reset while upgrading transport)rJ   rk   rO   r
   r‘   r�   r„   r   Úreadyr	   r…   rN   rY   r   Ú	start_tlsr�   r   r   ÚConnectionAbortedErrorr”   r2   )r   r¥   r¦   rŠ   rp   Útls_transportr+   r…   s           r   r«   zSMTPProtocol.start_tlsG  s¤  è ø€ ð �>Š>ÜÐ3Ó4Ð4Ø×ÑÐ%Ü(Ð)?Ó@Ð@à×%×%Ó%Ø�J‰J�Ô'Ø!×/Ñ/¸Ð/Ó@×@ˆHØ�}‰}¤
× 0Ñ 0Ò0Ü+¨H¯M©M¸8×;KÑ;KÓLÐLð �~‰~Ð%¨¯©×)BÑ)BÔ)DÜ,Ð->Ó?Ð?ð?Ø&*§j¡j×&:Ñ&:Ø—N‘NØØØ %Ø$3Ø*1ð ';ó '÷ !�ð( +ˆDŒN÷? &×%ðB ˆðC &øà@øð!ùô !¤'×"6Ñ"6Ð7ò WÜ&Ð'LÓMÐSVÐVûä)ò =Ü& s§x¡x°¡{Ó3¸Ð<ûÜ'ò ?Ø—8’8Ø!Ÿh™h q™k‘GàN�GÜ,¨WÓ5¸3Ð>ûð?úð1 &ø×%×%Ð%ðB ˆüs¨   ‚?GÁD,ÁGÁ'F<Á,D.Á-A2F<Ã .D2ÄD0ÄD2ÄF<ÄGÄ%F:Ä&GÄ.F<Ä0D2Ä2F7ÅEÅF7Å#E<Å<F7Æ*F2Æ2F7Æ7F<Æ:GÆ<GÇGÇGÇ
Gr:   r>   )NN)"r?   r@   rA   r   r   rC   r   rE   r=   rV   ÚpropertyrX   rZ   ÚBaseTransportr`   rD   r.   rz   rq   rs   ÚBaseExceptionrU   r   rn   Úfloatr�   r‘   r›   r¤   ÚsslÚ
SSLContextÚstrr«   Ú__classcell__)rR   s   @r   r   r   [   s�  ø„ ð 59ñ à�w×0Ñ0Ñ1ð ð 
õ ð¨×(<Ñ(<ð ÐAWó ó,ð
 ðT˜dò Tó ðTð ¨×)>Ñ)>ð  À4ó  ð" 8¨IÑ#6ð "¸4õ "ð; %ð ;¨Dó ;ð6˜dó ð¨h°}Ñ.Eó ð*¨H°\Ñ,Bó *ñX¨8°E©?ð Àló ð8#˜%ð # Dó #ð 8<òØðØ%-¨e¡_ðà	óð, :>ñØðØ'/°¡ðà	óðF *.Ø#'ñ	/à—^‘^ð/ð " #™ð/ð ˜%‘ð	/ð
 
÷/r   r   )rB   r   r   Úrer²   Útypingr   r   r   Úerrorsr   r   r	   r
   r   rp   r   r   Ú__all__r|   Úcompiler�   rŸ   ÚProtocolr   ÚBaseProtocolr   rF   r   r   Ú<module>r½      sŠ   ðñó Û Û 	Û 
ß (Ñ (÷õ õ #Ý ð €ð €Ø�R—Z‘ZÐ 8Ó9Ð Øˆr�z‰z˜+Ó&€ô:"�w×'Ñ'ô :"ôz[Ð# W×%9Ñ%9õ [r   