
    \d                         d Z ddlZddlZddlmZ ddlmZ ddlmZ  G d d          Z	 G d d	          Z
 G d
 de
ej                  Z G d de
ej                  ZdS )z
Support for relaying mail.
    N)UNIXAddress)smtp)logc                   ,    e Zd ZdZddZd Zd Zd ZdS )	DomainQueuerzM
    An SMTP domain which add messages to a queue intended for relaying.
    Fc                 "    || _         || _        d S N)serviceauthed)selfr
   authenticateds      2lib/python3.11/site-packages/twisted/mail/relay.py__init__zDomainQueuer.__init__   s    #    c                                           j        j                  rt          dt	          j                                      dd                    }t          dt	          j                                      dd                    }t          |          dk    rt          |          dk    r fdS t          j	                  )a  
        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                  .                                    S r	   )startMessage)r   users   r   <lambda>z%DomainQueuer.exists.<locals>.<lambda>-   s    t0066 r   )
	willRelaydestprotocolfilterstrorigsplitlenr   SMTPBadRcpt)r   r   r   r   s   ``  r   existszDomainQueuer.exists   s     >>$)T]33 	7$DI 4 4S! < <==D$DI 4 4S! < <==D4yyA~~#d))q..666666t$$$r   c                     |j                                         }| j        pt          |t                    p
|j        dk    S )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   zDomainQueuer.willRelay0   s;     !))++{Wj{;;WtyK?WWr   c           	      r   | j         j        }|                                \  }}|5  t          j        dt          |j                  dt          |j                             t          j	        t          |j                  t          |j                  g|           ddd           n# 1 swxY w Y   |S )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   r+   envelopeFilesmtpMessages        r   r   zDomainQueuer.startMessage:   s     "$)$:$:$<$<!k 	H 	HGMS^^MM3ty>>MMNNNKTYTY8,GGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H s   A:B,,B03B0N)F)__name__
__module____qualname____doc__r   r"   r   r    r   r   r   r      sb         $ $ $ $% % %,X X X    r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )RelayerMixinc                 `   g | _         g | _        |D ]}t          |dz   d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          |dz             }|                    |           | j                             |           | j                            |           d S )N-Hrb-D)messagesnamesopenr.   loadappend)r   messagePathsmessagefpmessageContentss        r   loadMessageszRelayerMixin.loadMessagesR   s    
# 	' 	'Ggnd++ 2r"(+b//2 2 2 2 2 2 2 2 2 2 2 2 2 2 2gn%%B""2&&&M  111Jg&&&&	' 	's   AA	A	c                 :    | j         sd S | j         d         d         S )Nr   r=   r   s    r   getMailFromzRelayerMixin.getMailFrom]   #    } 	4}Q""r   c                 <    | j         sd S | j         d         d         gS )Nr   r   rH   rI   s    r   	getMailTozRelayerMixin.getMailTob   s&    } 	4a #$$r   c                 :    | j         sd S | j         d         d         S )Nr   r   rH   rI   s    r   getMailDatazRelayerMixin.getMailDatag   rK   r   c                     |t           j        v rDt          j        | j        d         dz              t          j        | j        d         dz              | j        d= | j        d= dS )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   r<   r:   N)r   SUCCESSosremover>   r=   )r   coderespnumOk	addressesr   s         r   sentMailzRelayerMixin.sentMaill   s^    
 4<Idjmd*+++Idjmd*+++M!JqMMMr   N)r2   r3   r4   rF   rJ   rM   rO   rX   r6   r   r   r8   r8   L   s_        	' 	' 	'# # #
% % %
# # #

 
 
 
 
r   r8   c                       e Zd ZdZd ZdS )SMTPRelayerz)
    A base class for SMTP relayers.
    c                 d    t          j        j        | g|R i | |                     |           dS )a  
        @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   rF   r   rB   argskws       r   r   zSMTPRelayer.__init__~   sA     	 3333333,'''''r   Nr2   r3   r4   r5   r   r6   r   r   rZ   rZ   y   s-         ( ( ( ( (r   rZ   c                       e Zd ZdZd ZdS )ESMTPRelayerz*
    A base class for ESMTP relayers.
    c                 d    t          j        j        | g|R i | |                     |           dS )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   rF   r]   s       r   r   zESMTPRelayer.__init__   sB    " 	!$4444444,'''''r   Nr`   r6   r   r   rb   rb      s-         ( ( ( ( (r   rb   )r5   rR   r.   twisted.internet.addressr   twisted.mailr   twisted.pythonr   r   r8   r\   rZ   rd   rb   r6   r   r   <module>rh      s  
  
			  0 0 0 0 0 0            8 8 8 8 8 8 8 8v* * * * * * * *Z( ( ( ( (, ( ( (*( ( ( ( (<!1 ( ( ( ( (r   