我今天遇到了以下奇怪的行为。
以下代码适用于 Python 3.3:
smtp = smtplib.SMTP()
smtp.connect(host="smtp.gmail.com", port=587)
smtp.ehlo()
smtp.starttls()
在 Python 3.4 中,上述代码不起作用,而是遇到以下错误:
File "smtp_test.py", line 10, in <module>
smtp.starttls()
File "/usr/lib/python3.4/smtplib.py", line 676, in starttls
server_hostname=server_hostname)
File "/usr/lib/python3.4/ssl.py", line 344, in wrap_socket
_context=self)
File "/usr/lib/python3.4/ssl.py", line 540, in __init__
self.do_handshake()
File "/usr/lib/python3.4/ssl.py", line 767, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_DECODE_ERROR] tlsv1 alert decode error (_ssl.c:598)
如果将上面的代码修改为在构造函数中指定主机和端口,而不使用 connect 方法,如下面的代码,那么它可以工作。
smtp = smtplib.SMTP(host="smtp.gmail.com", port=587)
smtp.ehlo()
smtp.starttls()
上述行为发生在 OpenSSL 版本 1.0.1f 和 OpenSSL 1.0.1g
有人可以向我解释这种行为吗?