def makeService(config): """ Configure a service for operating a mail server. The returned service may include POP3 servers, SMTP servers, or both, depending on the configuration passed in. If there are multiple servers, they will share all of their non-network state (i.e. the same user accounts are available on all of them). @type config: L{Options <usage.Options>} @param config: Configuration options specifying which servers to include in the returned service and where they should keep mail data. @rtype: L{IService <twisted.application.service.IService>} provider @return: A service which contains the requested mail servers. """ if config['esmtp']: rmType = relaymanager.SmartHostESMTPRelayingManager smtpFactory = config.service.getESMTPFactory else: rmType = relaymanager.SmartHostSMTPRelayingManager smtpFactory = config.service.getSMTPFactory if config['relay']: dir = config['relay'] if not os.path.isdir(dir): os.mkdir(dir) config.service.setQueue(relaymanager.Queue(dir)) default = relay.DomainQueuer(config.service) manager = rmType(config.service.queue) if config['esmtp']: manager.fArgs += (None, None) manager.fArgs += (config['hostname'], ) helper = relaymanager.RelayStateHelper(manager, 1) helper.setServiceParent(config.service) config.service.domains.setDefaultDomain(default) if config['pop3']: f = config.service.getPOP3Factory() for endpoint in config['pop3']: svc = internet.StreamServerEndpointService(endpoint, f) svc.setServiceParent(config.service) if config['smtp']: f = smtpFactory() if config['hostname']: f.domain = config['hostname'] f.fArgs = (f.domain, ) if config['esmtp']: f.fArgs = (None, None) + f.fArgs for endpoint in config['smtp']: svc = internet.StreamServerEndpointService(endpoint, f) svc.setServiceParent(config.service) return config.service
def validateTo(self, user): # XXX - Yick. This needs cleaning up. if self.user and self.service.queue: d = self.service.domains.get(user.dest.domain, None) if d is None: d = relay.DomainQueuer(self.service, True) else: d = self.service.domains[user.dest.domain] return defer.maybeDeferred(d.exists, user)
def validateTo(self, user): log.msg("validateTo(): %s" % user) if self.user and self.service.queue: d = self.service.domains.get(user.dest.domain, None) log.msg('Debug:\n %s' % dir(self.service)) if d is None and not self.service.authed: raise smtp.SMTPDeliveryError( 550, "We do not relay unless you have an account.") elif d is None and not self.orig_is_local: # relay foreign addresses log.msg('Debug: d is None and not self.orig_is_local') d = relay.DomainQueuer(self.service, True) elif d is None and self.orig_is_local: # we know the sender, lets relay d = relay.DomainQueuer(self.service, True) else: d = self.service.domains[ user.dest.domain] # delivery to local domain return defer.maybeDeferred(d.exists, user)
def makeService(config): if config['esmtp']: rmType = relaymanager.SmartHostESMTPRelayingManager smtpFactory = config.service.getESMTPFactory else: rmType = relaymanager.SmartHostSMTPRelayingManager smtpFactory = config.service.getSMTPFactory if config['relay']: dir = config['relay'] if not os.path.isdir(dir): os.mkdir(dir) config.service.setQueue(relaymanager.Queue(dir)) default = relay.DomainQueuer(config.service) manager = rmType(config.service.queue) if config['esmtp']: manager.fArgs += (None, None) manager.fArgs += (config['hostname'], ) helper = relaymanager.RelayStateHelper(manager, 1) helper.setServiceParent(config.service) config.service.domains.setDefaultDomain(default) ctx = None if config['certificate']: from twisted.mail.protocols import SSLContextFactory ctx = SSLContextFactory(config['certificate']) if config['pop3']: s = internet.TCPServer(config['pop3'], config.service.getPOP3Factory()) s.setServiceParent(config.service) if config['pop3s']: s = internet.SSLServer(config['pop3s'], config.service.getPOP3Factory(), ctx) s.setServiceParent(config.service) if config['smtp']: f = smtpFactory() f.context = ctx if config['hostname']: f.domain = config['hostname'] f.fArgs = (f.domain, ) if config['esmtp']: f.fArgs = (None, None) + f.fArgs s = internet.TCPServer(config['smtp'], f) s.setServiceParent(config.service) return config.service
def validateTo(self, user): """ Validate the address for which a message is destined. @type user: L{User} @param user: The destination address. @rtype: L{Deferred <defer.Deferred>} which successfully fires with no-argument callable which returns L{IMessage <smtp.IMessage>} provider. @return: A deferred which successfully fires with a no-argument callable which returns a message receiver for the destination. @raise SMTPBadRcpt: When messages cannot be accepted for the destination address. """ # XXX - Yick. This needs cleaning up. if self.user and self.service.queue: d = self.service.domains.get(user.dest.domain, None) if d is None: d = relay.DomainQueuer(self.service, True) else: d = self.service.domains[user.dest.domain] return defer.maybeDeferred(d.exists, user)