SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

2024-05-21

此问题与 smtplib 的 SMTP_SSL 连接有关。

当与 SMTP(无 ssl)连接时,它正在工作。

在 SMTP_SSL 中尝试相同的主机和端口时,出现错误。该错误仅基于主机,gmail 设置也工作正常。

请检查下面的示例,如果 Outlook 和 Office365 需要任何更改,请告诉我。

In [1]: import smtplib

In [10]: smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=100)
Out[10]: <smtplib.SMTP_SSL instance at 0x109ccaf38>

In [2]: smtplib.SMTP('smtp-mail.outlook.com', 587, timeout=100)
Out[1]: <smtplib.SMTP instance at 0x10a00bb90>

In [3]: smtplib.SMTP_SSL('smtp-mail.outlook.com', 587, timeout=100)
---------------------------------------------------------------------------
SSLError                                  Traceback (most recent call last)
<ipython-input-9-f0c5b0de4e24> in <module>()
----> 1 smtplib.SMTP_SSL('smtp-mail.outlook.com', 587, timeout=100)

/python2.7/smtplib.pyc in __init__(self, host, port, local_hostname, keyfile, certfile, timeout)
    794             self.keyfile = keyfile
    795             self.certfile = certfile
--> 796             SMTP.__init__(self, host, port, local_hostname, timeout)
    797 
    798         def _get_socket(self, host, port, timeout):

python2.7/smtplib.pyc in __init__(self, host, port, local_hostname, timeout)
    254         self.esmtp_features = {}
    255         if host:
--> 256             (code, msg) = self.connect(host, port)
    257             if code != 220:
    258                 raise SMTPConnectError(code, msg)

python2.7/smtplib.pyc in connect(self, host, port)
    314         if self.debuglevel > 0:
    315             print>>stderr, 'connect:', (host, port)
--> 316         self.sock = self._get_socket(host, port, self.timeout)
    317         (code, msg) = self.getreply()
    318         if self.debuglevel > 0:

python2.7/smtplib.pyc in _get_socket(self, host, port, timeout)
    800                 print>>stderr, 'connect:', (host, port)
    801             new_socket = socket.create_connection((host, port), timeout)
--> 802             new_socket = ssl.wrap_socket(new_socket, self.keyfile, self.certfile)
    803             self.file = SSLFakeFile(new_socket)
    804             return new_socket

python2.7/ssl.pyc in wrap_socket(sock, keyfile, certfile, server_side, cert_reqs, ssl_version, ca_certs, do_handshake_on_connect, suppress_ragged_eofs, ciphers)
    909                      do_handshake_on_connect=do_handshake_on_connect,
    910                      suppress_ragged_eofs=suppress_ragged_eofs,
--> 911                      ciphers=ciphers)
    912 
    913 # some utility functions

python2.7/ssl.pyc in __init__(self, sock, keyfile, certfile, server_side, cert_reqs, ssl_version, ca_certs, do_handshake_on_connect, family, type, proto, fileno, suppress_ragged_eofs, npn_protocols, ciphers, server_hostname, _context)
    577                         # non-blocking
    578                         raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
--> 579                     self.do_handshake()
    580 
    581             except (OSError, ValueError):

python2.7/ssl.pyc in do_handshake(self, block)
    806             if timeout == 0.0 and block:
    807                 self.settimeout(None)
--> 808             self._sslobj.do_handshake()
    809         finally:
    810             self.settimeout(timeout)

SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:590)

参考网址:https://docs.python.org/2/library/smtplib.html#smtplib.SMTP_SSL https://docs.python.org/2/library/smtplib.html#smtplib.SMTP_SSL


我今天也遇到了同样的问题,并且已经解决了。

这是我的演示。

def _send_email(self, msg):
    if self.smtp_port == 465:
        server = smtplib.SMTP_SSL(self.smtp_host, self.smtp_port)
    elif self.smtp_port == 587:
        server = smtplib.SMTP(self.smtp_host, self.smtp_port)
        server.starttls()
    else:
        raise Exception('port {} not support'.format(SMTP_PORT))
    server.set_debuglevel(1)
    server.login(self.from_addr, self.password)
    server.sendmail(self.from_addr, [self.to_addr], msg.as_string())
    server.quit()

在我看来(可能有问题,只是个人理解,如有错误,请帮我修改一下,谢谢。):

465 and 587用于不同的协议。前者使用SSL,后者使用TLS。它们在SMTP通信之前都使用SSL来加密我们的电子邮件内容。

But for 587。您必须发送STARTTLS第一的。如果你不这样做,你会收到这样的消息Must issue a STARTTLS command first.而对于465你不能使用 tls 命令

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590) 的相关文章

随机推荐