
    h                         S 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5      r	 " S S	5      r
 " S
 S\
\R                  5      r " S S\
\R                  5      rg)z
Support for relaying mail.
    N)UNIXAddress)smtp)logc                   4    \ rS rSrSrS	S jrS rS rS rSr	g)
DomainQueuer   zE
An SMTP domain which add messages to a queue intended for relaying.
c                     Xl         X l        g N)serviceauthed)selfr   authenticateds      Y/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/mail/relay.py__init__DomainQueuer.__init__   s    #    c                   ^ ^ T R                  TR                  TR                  5      (       a  [        S[	        TR
                  5      R                  SS5      5      n[        S[	        TR                  5      R                  SS5      5      n[        U5      S:X  a  [        U5      S:X  a  U U4S j$ [        R                  " T5      e)aI  
Check whether mail can be relayed to a user.

@type user: L{User}
@param user: A user.

@rtype: no-argument callable which returns L{IMessage <smtp.IMessage>}
    provider
@return: A function which takes no arguments and returns a message
    receiver for the user.

@raise SMTPBadRcpt: When mail cannot be relayed to the user.
N@      c                  &   > T R                  T5      $ r
   )startMessage)r   users   r   <lambda>%DomainQueuer.exists.<locals>.<lambda>-   s    t006r   )
	willRelaydestprotocolfilterstrorigsplitlenr   SMTPBadRcpt)r   r   r!   r   s   ``  r   existsDomainQueuer.exists   s     >>$))T]]33$DII 4 4S! <=D$DII 4 4S! <=D4yA~#d)q.66t$$r   c                     UR                   R                  5       nU R                  =(       d&    [        U[        5      =(       d    UR
                  S:H  $ )z
Check whether we agree to relay.

The default is to relay for all connections over UNIX
sockets and all connections from localhost.
z	127.0.0.1)	transportgetPeerr   
isinstancer   host)r   addressr   peers       r   r   DomainQueuer.willRelay0   s<     !!))+{{Wj{;WtyyK?WWr   c           	         U R                   R                  nUR                  5       u  p4U   [        R                  " S[        UR                  5      < S[        UR                  5      < 35        [        R                  " [        UR                  5      [        UR                  5      /U5        SSS5        U$ ! , (       d  f       U$ = f)z
Create an envelope and a message receiver for the relay queue.

@type user: L{User}
@param user: A user.

@rtype: L{IMessage <smtp.IMessage>}
@return: A message receiver.
zQueueing mail z -> N)
r   queuecreateNewMessager   msgr    r!   r   pickledump)r   r   r0   envelopeFilesmtpMessages        r   r   DomainQueuer.startMessage:   s     ""$)$:$:$<!GGnS^$6d3tyy>:LMNKKTYYTYY8,G   \ s   BB99
C)r   r   N)F)
__name__
__module____qualname____firstlineno____doc__r   r%   r   r   __static_attributes__ r   r   r   r      s    $%,Xr   r   c                   2    \ rS rSrS rS rS rS rS rSr	g)	RelayerMixinL   c                 Z   / U l         / U l        U H  n[        US-   S5       n[        R                  " U5      nS S S 5        [        US-   5      nWR                  U5        U R                   R                  U5        U R                  R                  U5        M     g ! , (       d  f       Nh= f)N-Hrb-D)messagesnamesopenr3   loadappend)r   messagePathsmessagefpmessageContentss        r   loadMessagesRelayerMixin.loadMessagesQ   s    
#Ggnd+r"(++b/ ,gn%B""2&MM  1JJg& $++s   B
B*	c                 J    U R                   (       d  g U R                   S   S   $ )Nr   rF   r   s    r   getMailFromRelayerMixin.getMailFrom\        }}}}Q""r   c                 L    U R                   (       d  g U R                   S   S   /$ )Nr   r   rR   rS   s    r   	getMailToRelayerMixin.getMailToa   s#    }}a #$$r   c                 J    U R                   (       d  g U R                   S   S   $ )Nr   r   rR   rS   s    r   getMailDataRelayerMixin.getMailDataf   rV   r   c                     U[         R                  ;   aL  [        R                  " U R                  S   S-   5        [        R                  " U R                  S   S-   5        U R
                  S	 U R                  S	 g)zSince we only use one recipient per envelope, this
will be called with 0 or 1 addresses. We probably want
to do something with the error message if we failed.
r   rE   rC   N)r   SUCCESSosremoverG   rF   )r   coderespnumOk	addressesr   s         r   sentMailRelayerMixin.sentMailk   sY    
 4<<IIdjjmd*+IIdjjmd*+MM!JJqMr   )rF   rG   N)
r8   r9   r:   r;   rO   rT   rX   r[   re   r=   r>   r   r   r@   r@   L   s    
	'#
%
#

r   r@   c                       \ rS rSrSrS rSrg)SMTPRelayerx   z!
A base class for SMTP relayers.
c                 n    [         R                  R                  " U /UQ70 UD6  U R                  U5        g)aN  
@type messagePaths: L{list} of L{bytes}
@param messagePaths: The base filename for each message to be relayed.

@type args: 1-L{tuple} of (0) L{bytes} or 2-L{tuple} of
    (0) L{bytes}, (1) L{int}
@param args: Positional arguments for L{SMTPClient.__init__}

@type kw: L{dict}
@param kw: Keyword arguments for L{SMTPClient.__init__}
N)r   
SMTPClientr   rO   r   rK   argskws       r   r   SMTPRelayer.__init__}   s.     	  333,'r   r>   Nr8   r9   r:   r;   r<   r   r=   r>   r   r   rh   rh   x   s    (r   rh   c                       \ rS rSrSrS rSrg)ESMTPRelayer   z"
A base class for ESMTP relayers.
c                 n    [         R                  R                  " U /UQ70 UD6  U R                  U5        g)a(  
@type messagePaths: L{list} of L{bytes}
@param messagePaths: The base filename for each message to be relayed.

@type args: 3-L{tuple} of (0) L{bytes}, (1) L{None} or
    L{ClientContextFactory
    <twisted.internet.ssl.ClientContextFactory>},
    (2) L{bytes} or 4-L{tuple} of (0) L{bytes}, (1) L{None}
    or L{ClientContextFactory
    <twisted.internet.ssl.ClientContextFactory>}, (2) L{bytes},
    (3) L{int}
@param args: Positional arguments for L{ESMTPClient.__init__}

@type kw: L{dict}
@param kw: Keyword arguments for L{ESMTPClient.__init__}
N)r   ESMTPClientr   rO   rl   s       r   r   ESMTPRelayer.__init__   s0    " 	!!$444,'r   r>   Nrp   r>   r   r   rr   rr      s    (r   rr   )r<   r_   r3   twisted.internet.addressr   twisted.mailr   twisted.pythonr   r   r@   rk   rh   ru   rr   r>   r   r   <module>rz      sW   
 
  0  8 8v) )X(, (*(<!1!1 (r   