我遇到麻烦的环境:Windows10上的Python 2.7.11(已修补至今)。 Python通过msi安装。 我检查了设置中的PATH设置,并将其设置为c:\ Python27。
这适用于Mac:
from imapclient import IMAPClient IMAPClient("imap-mail.outlook.com", use_uid=True, ssl=(True))
但在Windows上,如果这样的barfs:
Traceback (most recent call last): File "test_outlook_imap.py", line 3, in <module> IMAPClient("imap-mail.outlook.com", use_uid=True, ssl=(True)) File "C:\Python27\lib\site-packages\imapclient\imapclient.py", line 152, in __init__ self._imap = self._create_IMAP4() File "C:\Python27\lib\site-packages\imapclient\imapclient.py", line 164, in _create_IMAP4 self._timeout) File "C:\Python27\lib\site-packages\imapclient\tls.py", line 153, in __init__ imaplib.IMAP4.__init__(self, host, port) File "C:\Python27\lib\imaplib.py", line 173, in __init__ self.open(host, port) File "C:\Python27\lib\site-packages\imapclient\tls.py", line 159, in open self.sock = wrap_socket(sock, self.ssl_context, host) File "C:\Python27\lib\site-packages\imapclient\tls.py", line 126, in wrap_socket ssl_context = create_default_context() File "C:\Python27\lib\site-packages\imapclient\tls.py", line 109, in create_default_context context.load_verify_locations(cadata=certs) File "C:\Python27\lib\site-packages\backports\ssl\core.py", line 654, in load_verify_locations self._ctx.load_verify_locations(cafile, capath) File "C:\Python27\lib\site-packages\OpenSSL\SSL.py", line 528, in load_verify_locations _raise_current_error() File "C:\Python27\lib\site-packages\OpenSSL\_util.py", line 48, in exception_from_error_queue raise exception_type(errors) OpenSSL.SSL.Error: []
这是否与窗口的证书链处理?
顺便说一下,它在imap.gmail.com中的Outlook域的位置是一样的。
这不是最终的答案,但我发现的解决方法是卸载imapclient并安装旧版本。 版本0.13(和0.11)为我工作,但是升级到1.0.1后,我得到了你发布相同的错误信息。
要用pip卸载imapclient,请运行:
pip uninstall imapclient
要用pip安装较旧的0.13版本,请运行:
pip install imapclient==0.13
要验证imapclient的版本,从交互式shell运行:
>>> import imapclient
>>> imapclient.__version__
这是一个解决方法,适用于我(Python 3.5,Windows 10):
from backports import ssl from imapclient import IMAPClient context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) server = IMAPClient('imap.gmail.com', ssl=True, ssl_context=context)
上面的代码是从开发人员的解决方法派生而来的,但是我发现我只需要定义context
一行来使其工作。 指定其他SSL / TLS协议也起作用。