最近问过Twisted mail server with TLS - no portal?看来我找错人了 - 所以现在问一个新的、经过修改的问题似乎是中肯和适当的。
所以我正在尝试扩展在 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)
现在我有了来自 emailserver.tac 的 SMTP 工厂,以及上面的 sslCtxFactory。在我的旧代码中,我创建了一个 ESMTP 类的对象,如下所示:
myESMTP = ESMTP(contextFactory=sslCtxFactory)
factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory))
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8001)
endpoint.listen(factory)
但由于此代码未使用门户等,因此 ESMTP 类定义中的一些方法/函数由于未定义各种属性(例如 self.delivery、self.portal)而失败。
所以我试图了解如何在 mailserver.tac 代码中实现我的 sslCtxFactory - 同时仍然按照 mailserver.tac 使用门户/领域,以确保 twisted 的 ESMTP 类中的方法不会失败。
但是我怎样才能把这两个工厂“放在一起”呢?
谢谢
最佳答案
这看起来很奇怪:
myESMTP = ESMTP(contextFactory=sslCtxFactory) factory = protocol.Factory.forProtocol(lambda: mySMTP(contextFactory=sslCtxFactory))
Twisted 提供的 ESMTP
类实例不可调用。我想你的意思一定是这样的:
from functools import partial
myESMTP = partial(ESMTP, contextFactory=sslCtxFactory)
factory = protocol.Factory.forProtocol(mySMTP)
假设...
ESMTP
类的身份验证和授权行为遵循self.portal
属性。您需要做的就是设置它。
SMTPFactory
是 SMTP
实例的工厂,它将协议(protocol)的 portal
属性设置为其自身(工厂的) 的值门户
属性。唯一的麻烦是它生成了 SMTP
实例而不是 ESMTP
实例。
幸运的是,它(工厂)遵守其 protocol
属性,以便类实例化。
如果你要写:
portal = Portal(...)
myESMTP = partial(ESMTP, contextFactory=...)
factory = SMTPFactory.forProtocol(protocol=myESMTP, portal=portal)
那么你会有一个工厂:
- 创建 ESMTP 实例
- 在实例化时将
contextFactory=...
传递给ESMTP
的初始化程序 - 在
ESMTP
实例化之后,使用传递给forProtocol
的值在此处设置portal
属性。
关于ssl - 扭曲的 SMTP 服务器,添加 SSL 支持,2 个工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26424199/