# Twisted, the Framework of Your Internet # Copyright (C) 2001 Matthew W. Lefkowitz # # This library is free software; you can redistribute it and/or # modify it under the terms of version 2.1 of the GNU Lesser General Public # License as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """Coil plugin for the mail service.""" # Twisted Imports from twisted.protocols import pop3, smtp from twisted.internet import interfaces from twisted.coil import coil from twisted.mail import mail, maildir from twisted.python import components # System Imports import types import os class MailConfigurator(coil.Configurator, coil.ConfigCollection): __implements__ = (coil.IConfigurator, coil.IConfigCollection) configurableClass = mail.MailService entityType = mail.IDomain configTypes = { 'serviceName': [types.StringType, "Service Name", ""], 'storagePath': [types.StringType, "Storage Path", "Folder where messages will be stored."], } def __init__(self, instance): coil.Configurator.__init__(self, instance) coil.ConfigCollection.__init__(self, instance.domains.domains) def configDispensers(self): return [ ['makePOP3Server', interfaces.IProtocolFactory, "POP3 server for %s" % self.instance.serviceName], ['makeSMTPServer', interfaces.IProtocolFactory, "SMTP server for %s" % self.instance.serviceName] ] def makePOP3Server(self): return mail.createDomainsFactory(pop3.VirtualPOP3, self.instance.domains) def makeSMTPServer(self): return mail.createDomainsFactory(smtp.DomainSMTP, self.instance.domains) configName = 'Twisted Mail Service' def config_name(self, name): raise coil.InvalidConfiguration("You can't change a Service's name.") def config_storagePath(self, path): if not os.path.exists(path): os.makedirs(path) self.instance.storagePath = path def mailFactory(container, name): return mail.MailService(name, container.app) coil.registerConfigurator(MailConfigurator, mailFactory) components.registerAdapter(MailConfigurator, mail.MailService, coil.IConfigCollection) class MaildirDBMConfigurator(coil.Configurator, coil.ConfigCollection): __implements__ = (coil.IConfigurator, coil.IConfigCollection) entityType = types.StringType configurableClass = maildir.MaildirDirdbmDomain configTypes = { "postmaster": ["boolean", "Postmaster", "Do bounces get send to postmaster?"], } configName = 'Maildir DBM Domain' def __init__(self, instance): coil.Configurator.__init__(self, instance) coil.ConfigCollection.__init__(self, instance.dbm) def getEntityType(self): return "Password" def reallyPutEntity(self, name, entity): self.instance.dbm[name] = entity self.instance.userDirectory(name) # make maildir def maildirDbmFactory(container, name): if components.implements(container, coil.IConfigurator): container = container.getInstance() path = os.path.join(container.storagePath, name) if not os.path.exists(path): os.makedirs(path) return maildir.MaildirDirdbmDomain(path) coil.registerConfigurator(MaildirDBMConfigurator, maildirDbmFactory) components.registerAdapter(MaildirDBMConfigurator, maildir.MaildirDirdbmDomain, coil.IConfigCollection)