ssl - 扭曲的 SMTP 服务器,添加 SSL 支持,2 个工厂?

标签 ssl smtp twisted factory

最近问过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 属性。您需要做的就是设置它。

SMTPFactorySMTP 实例的工厂,它将协议(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/

相关文章:

ssl - 为什么所有 SSL 子域都指向同一个 IP

iis - IIS 7 中是否弃用了 SMTP 虚拟服务器?

c# - 发送邮件 Asp.Net 时出现 "Authentication failed"错误

networking - Twisted 中 select/poll 与 epoll react 器的注意事项

linux - Chrome 证书选择出现多次

web-services - Delphi soap (httprio) 忽略证书验证

ssl - 将 SSL 添加到我的云前端分发时,我的 route 53 服务是否需要任何配置?

java - 错误 :552 5. 3.4 消息大小超过固定的最大消息大小

Python twisted reactor - 地址已被使用

python - Twisted HTTP 代理 channel 在 LostConnection 上设置为 None 但 LostConnection 尚未被调用