2014-10-17 70 views
1

最近问起Twisted mail server with TLS - no portal?看来我在咆哮一个错误的树 - 所以现在看起来相当恰当的问一个新的,修正的问题。扭曲的SMTP服务器,添加SSL支持,2工厂?

所以我试图扩展在http://twistedmatrix.com/documents/current/_downloads/emailserver.tac发现的基本SMTP服务器样本以支持SSL连接。我可以如下(从我以前的努力解除代码创建一个ssl上下文工厂:

caCertFile = open("/opt/tesa/etc/certs/CA/cacert.pem","r") 
certFile = open("/opt/tesa/etc/certs/server/server.crt","r") 
keyFile = open("/opt/tesa/etc/certs/server/server.key","r") 
caCertData = caCertFile.read() 
pKeyData = keyFile.read() 
certData = certFile.read() 
caCert = ssl.Certificate.loadPEM(caCertData) 
cert = load_certificate(FILETYPE_PEM, certData) 
pKey = load_privatekey(FILETYPE_PEM, pKeyData) 
sslCtxFactory = ssl.CertificateOptions(privateKey=pKey, certificate=cert, trustRoot=caCert) 

所以现在我有SMTP厂从emailserver.tac,以上我sslCtxFactory在我的旧代码,我创建了一个对象类ESMTP如下:

myESMTP = ESMTP(contextFactory=sslCtxFactory) 
factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory)) 
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8001) 
endpoint.listen(factory) 

但是,由于该代码不使用门户等,那么一些方法/在类定义为ESMTP功能失效由于没有被定义的各种属性(例如自我。 delivery,self.portal)。

所以我试图了解如何在mailserver.tac代码中实现我的sslCtxFactory - 同时仍按照mailserver.tac使用门户/领域,以确保twisted的ESMTP类中的方法不会失败。

但是,我怎样才能把这两个工厂“结合在一起”呢?

感谢

回答

1

这看起来很奇怪:一个由扭曲所提供的ESMTP类的

myESMTP = ESMTP(contextFactory=sslCtxFactory) 
factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory)) 

实例是不可调用的。我想你一定意思大概是:

from functools import partial 

myESMTP = partial(ESMTP, contextFactory=sslCtxFactory) 
factory = protocol.Factory.forProtocol(mySMTP) 

假设所以......

ESMTP类尊重其身份验证和授权行为self.portal属性。所有你需要做的就是设置它。

SMTPFactorySMTP实例的工厂,它将协议的portal属性设置为其自身(工厂的)portal属性的值。唯一的问题是它使SMTP实例而不是ESMTP实例。

幸运的是,它(工厂)尊重它的属性以供类实例化。实例是 时

  • 创建
  • 通过contextFactory=...ESMTP初始化ESMTP
  • 的实例:

    如果你写:

    portal = Portal(...) 
    myESMTP = partial(ESMTP, contextFactory=...) 
    factory = SMTPFactory.forProtocol(protocol=myESMTP, portal=portal) 
    

    ,那么你将有一个工厂,

  • 立即在ESMTP实例上设置portal属性iates他们,使用传递到forProtocol这里的价值。