o
    Òó·i’  ã                   @   s€   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„ dƒZ	G dd	„ d	ƒZ
G d
d„ de
ejƒZG dd„ de
ejƒZdS )z
Support for relaying mail.
é    N)ÚUNIXAddress)Úsmtp)Úlogc                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚDomainQueuerzM
    An SMTP domain which add messages to a queue intended for relaying.
    Fc                 C   s   || _ || _d S ©N)ÚserviceÚauthed)Úselfr   Úauthenticated© r   úXC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/mail/relay.pyÚ__init__   s   
zDomainQueuer.__init__c                    sp   ˆ   ˆjˆj¡r3tdtˆjƒ dd¡ƒ}tdtˆjƒ dd¡ƒ}t|ƒdkr3t|ƒdkr3‡ ‡fdd„S t 	ˆ¡‚)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
   ˆ   ˆ¡S r   )ÚstartMessager   ©r	   Úuserr   r   Ú<lambda>-   s   
 z%DomainQueuer.exists.<locals>.<lambda>)
Ú	willRelayÚdestÚprotocolÚfilterÚstrÚorigÚsplitÚlenr   ZSMTPBadRcpt)r	   r   r   r   r   r   r   Úexists   s   
zDomainQueuer.existsc                 C   s$   |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.1N)Ú	transportZgetPeerr   Ú
isinstancer   Úhost)r	   Úaddressr   Zpeerr   r   r   r   0   s   
zDomainQueuer.willRelayc                 C   s|   | j j}| ¡ \}}|�( t dt|jƒ›dt|jƒ›�¡ t 	t|jƒt|jƒg|¡ W d  ƒ |S 1 s7w   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   ÚqueueZcreateNewMessager   Úmsgr   r   r   ÚpickleÚdump)r	   r   r"   ZenvelopeFileZsmtpMessager   r   r   r   :   s   
"
þýzDomainQueuer.startMessageN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r      s    

r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚRelayerMixinc              	   C   s€   g | _ g | _|D ]5}t|d dƒ�}t |¡}W d   ƒ n1 s!w   Y  t|d ƒ}| |¡ | j  |¡ | j |¡ qd S )Nú-HÚrbú-D)ÚmessagesÚnamesÚopenr$   ÚloadÚappend)r	   ÚmessagePathsÚmessageÚfpZmessageContentsr   r   r   ÚloadMessagesQ   s   ÿ
úzRelayerMixin.loadMessagesc                 C   s   | j sd S | j d d S )Nr   ©r.   ©r	   r   r   r   ÚgetMailFrom\   ó   zRelayerMixin.getMailFromc                 C   s   | j sd S | j d d gS )Nr   r   r7   r8   r   r   r   Ú	getMailToa   s   zRelayerMixin.getMailToc                 C   s   | j sd S | j d d S )Nr   r   r7   r8   r   r   r   ÚgetMailDataf   r:   zRelayerMixin.getMailDatac                 C   sF   |t jv rt | jd d ¡ t | jd d ¡ | jd= | jd= dS )z·Since 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ÚrespZnumOkÚ	addressesr   r   r   r   ÚsentMailk   s
   
zRelayerMixin.sentMailN)r&   r'   r(   r6   r9   r;   r<   rC   r   r   r   r   r*   L   s    r*   c                   @   ó   e Zd ZdZdd„ ZdS )ÚSMTPRelayerz)
    A base class for SMTP relayers.
    c                 O   ó(   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   r6   ©r	   r3   ÚargsÚkwr   r   r   r   }   s   zSMTPRelayer.__init__N©r&   r'   r(   r)   r   r   r   r   r   rE   x   ó    rE   c                   @   rD   )ÚESMTPRelayerz*
    A base class for ESMTP relayers.
    c                 O   rF   )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   r6   rH   r   r   r   r   ’   s   zESMTPRelayer.__init__NrK   r   r   r   r   rM   �   rL   rM   )r)   r>   r$   Ztwisted.internet.addressr   Ztwisted.mailr   Ztwisted.pythonr   r   r*   rG   rE   rN   rM   r   r   r   r   Ú<module>   s   ;,