o b@sdZddlZddlZddlmZddlmZddlmZGdddZ Gdd d Z Gd d d e ej Z Gd d d e ej ZdS)z Support for relaying mail. N) UNIXAddress)smtp)logc@s2eZdZdZd ddZddZddZd d Zd S) DomainQueuerzM An SMTP domain which add messages to a queue intended for relaying. FcCs||_||_dSN)serviceauthed)selfr authenticatedr 4/usr/lib/python3/dist-packages/twisted/mail/relay.py__init__s zDomainQueuer.__init__cspjjr3tdtjdd}tdtjdd}t|dkr3t|dkr3fddSt )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 } 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@cs Sr) startMessager r userr r -s z%DomainQueuer.exists..) willRelaydestprotocolfilterstrorigsplitlenr SMTPBadRcpt)r rrrr rr existss  zDomainQueuer.existscCs$|j}|jpt|tp|jdkS)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) transportgetPeerr isinstancerhost)r addressrpeerr r r r0s zDomainQueuer.willRelaycCs||jj}|\}}|(tdt|jdt|jt t|jt|jg|Wd|S1s7wY|S)z Create an envelope and a message receiver for the relay queue. @type user: L{User} @param user: A user. @rtype: L{IMessage } @return: A message receiver. zQueueing mail z -> N) rqueuecreateNewMessagermsgrrrpickledump)r rr% envelopeFile smtpMessager r r r:s " zDomainQueuer.startMessageN)F)__name__ __module__ __qualname____doc__r rrrr r r r rs   rc@s4eZdZddZddZddZddZd d Zd S) RelayerMixinc Csg|_g|_|D]5}t|dd }t|}Wdn1s!wYt|d}|||j||j|qdS)N-Hrb-D)messagesnamesopenr(loadappend)r messagePathsmessagefpmessageContentsr r r loadMessagesRs    zRelayerMixin.loadMessagescCs|jsdS|jddS)Nrr4r r r r getMailFrom]zRelayerMixin.getMailFromcCs|jsdS|jddgS)Nrrr>r?r r r getMailTobszRelayerMixin.getMailTocCs|jsdS|jddS)Nrrr>r?r r r getMailDatagrAzRelayerMixin.getMailDatacCsF|tjvrt|jddt|jdd|jd=|jd=dS)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. rr3r1N)rSUCCESSosremover5r4)r coderespnumOk addressesrr r r sentMaills  zRelayerMixin.sentMailN)r,r-r.r=r@rBrCrKr r r r r0Ls   r0c@eZdZdZddZdS) SMTPRelayerz) A base class for SMTP relayers. cO(tjj|g|Ri|||dS)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 r=r r9argskwr r r r ~s zSMTPRelayer.__init__Nr,r-r.r/r r r r r rMy rMc@rL) ESMTPRelayerz* A base class for ESMTP relayers. cOrN)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 }, (2) L{bytes} or 4-L{tuple} of (0) L{bytes}, (1) L{None} or L{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 r=rPr r r r szESMTPRelayer.__init__NrSr r r r rUrTrU)r/rEr(twisted.internet.addressr twisted.mailrtwisted.pythonrrr0rOrMrVrUr r r r s   ;-