python smtplib没有看到从服务器广告的starttls?

时间:2014-10-22 12:56:59

标签: python ssl smtplib

所以我有一个简单的(需要工作!)python / twisted邮件服务器,它支持纯文本/ TLS邮件。我还写了一个简单的客户端程序,使用smtplib。

如果我使用telnet连接到我的服务器,则会公布ESMTP,然后在我发布EHLO后,会公布STARTTLS,如下所示:

# telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain NO UCE NO UBE NO RELAY PROBES ESMTP
ehlo me
250-localhost.localdomain Hello 127.0.0.1, nice to meet you
250 STARTTLS

到目前为止一切顺利。但是,我已经在线阅读了与smtplib的smtp_ssl类相关的错误(参见:http://bugs.python.org/issue4066Failing to send email with the Python example),因此人们建议我现在尝试过的解决方案,如下所示:

server = smtplib.SMTP('localhost', 5000) # my server is running on port 5000. Don't ask ;)
server.ehlo()
server.starttls('/opt/tesa/etc/certs/client/client.key', '/opt/tesa/etc/certs/client/client.crt')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

这成功地发送了我的信息 - 但是通过它的外观,通过纯文本。来自客户端的输出看起来只是看到服务器的EHLO 250响应的第一行(“很高兴见到你”) - 并且没有看到STARTTLS。因此,我假设它没有发布它自己的STARTTLS(因为它只会在服务器做广告时才这样做?) - 因此保留为纯文本邮件?

# python smtplib_client.py
From: me@home.com
To: you@work.com
Enter message, end with ^D (Unix) or ^Z (Windows):
fsdfds
Message length is 45
**send: 'ehlo localhost.localdomain\r\n'
reply: '250 localhost.localdomain Hello 127.0.0.1, nice to meet you\r\n'
reply: retcode (250); Msg: localhost.localdomain Hello 127.0.0.1, nice to meet you
send: 'mail FROM:<me@home.com>\r\n'**
reply: '250 Sender address accepted\r\n'
reply: retcode (250); Msg: Sender address accepted
send: 'rcpt TO:<you@work.com>\r\n'
reply: '250 Recipient address accepted\r\n'
reply: retcode (250); Msg: Recipient address accepted
send: 'data\r\n'
reply: '354 Continue\r\n'
reply: retcode (354); Msg: Continue
data: (354, 'Continue')
send: 'From: me@home.com\r\nTo: you@work.com\r\n\r\nfsdfds\r\n.\r\n'
reply: '250 Delivery in progress\r\n'
reply: retcode (250); Msg: Delivery in progress
data: (250, 'Delivery in progress')
send: 'quit\r\n'
reply: '221 See you later\r\n'
reply: retcode (221); Msg: See you later

任何人都可以为我打开灯吗?我好像在黑暗中!

(使用Python 2.6.6)

一如既往地感谢...

2 个答案:

答案 0 :(得分:0)

您声称发送的回复:

250-localhost.localdomain Hello 127.0.0.1, nice to meet you
250 STARTTLS

和客户收到的

reply: '250 localhost.localdomain Hello 127.0.0.1, nice to meet you\r\n'

看起来与众不同:没有&#34; - &#34;在响应代码250和主机名之间,这意味着响应只是这一行。 我在python 2.7和3.3中检查了smtplib.py的代码,它只打印调试它读取的行,而不做任何修改,比如替换&#39; - &#39;用&#39; &#39;

这就是为什么我假设telnet示例中的服务器版本和smtplib示例不同,而在后一个示例中,服务器实际上只发送调试中显示的行而不是STARTTLS。< / p>

除此之外,如果您要添加对&#34的引用会很有帮助。我已经在线阅读了smtplib的smtp_ssl类中的错误&#34;所以可以检查这与你的问题有什么关系。请添加您正在使用的python版本。

答案 1 :(得分:0)

所以我不确定我是否已经调整了一些东西来实现这一目标,或者我之前错过了它(不要以为我会拥有它,但是嘿!)... SMTPLIB客户端仍未显示与STARTTLS相关的日志输出中的任何内容。但是服务器端:

2014-10-23 09:14:34+0000 [__builtin__.ConsoleSMTPFactory] Sending: 220: localhost.localdomain NO UCE NO UBE NO RELAY PROBES ESMTP
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: localhost.localdomain Hello 127.0.0.1, nice to meet you
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] STARTTLS
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 220: Begin TLS negotiation now
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: localhost.localdomain Hello 127.0.0.1, nice to meet you
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1]
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: Sender address accepted
2014-10-23 09:14:34+0000 [mySMTP,5,127.0.0.1] Sending: 250: Recipient address accepted

据我所知,服务器现在只发送&#34;开始TLS协商&#34;来自客户端的STARTTLS的收据。如上所示接受发件人/收件人表明TLS谈判成功了吗?

查看服务器的python / twisted代码(在twisted的smtp.py模块中) - 消息,例如&#34; 250 - Hello 127.0.0.1&#34; - 通过&#34; self.sendCode&#34;功能。但发送STARTTLS的服务器使用&#34; self.sendLine&#34;。不知道为什么 - 我想这需要一个扭曲的专家。

说到这一点,我现在需要找到一种方法来验证服务器是否接受了TLS上的消息 - 也就是说,它确实确保了通道....:)