ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 线程化时的 Gmail

Posted

技术标签:

【中文标题】ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 线程化时的 Gmail【英文标题】:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] Gmail when Threaded 【发布时间】:2018-03-23 16:54:10 【问题描述】:

我能够在 Python 中获得包含查询的电子邮件列表,但是当我从线程中运行代码时,我得到了错误:

ssl.SSLError: [SSL: WRONG_VERSION_NUMBER]

这是我调用线程的方式:

Thread(target=get_messages_for_label, args=('recruitment')).start()

错误发生在这一行:

response = service.users().labels().list(userId=user_id).execute()

但是,当我在没有线程的情况下运行它(作为简单的方法调用)时,它可以正常工作。

很难在两者之间共享代码,因为在线程启动和错误发生之间有很多方法调用。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我刚找到这篇文章:https://developers.google.com/api-client-library/python/guide/thread_safety。

根据文档,Gmail API 是建立在 Httplib2 之上的,它不是线程安全的。

作为一种变通方法,您可以为每个命令执行方法提供一个新的 http 对象实例。

就我而言

service.labels().list().execute()

变成:

service.users().labels().list(userId=user_id)\
   .execute(http=self.__get_credentials().authorize(httplib2.Http()))

【讨论】:

你调用__get_credentials()self对象是什么?【参考方案2】:

Google 的 oauth2client 现已弃用。在使用新的 google-auth 库时,您可以创建一个授权的 Http 实例,如下所示:

import googleapiclient.discovery
from google.oauth2 import service_account
from googleapiclient import _auth

credentials = service_account.Credentials.from_service_account_info(...)
service = googleapiclient.discovery.build('drive', 'v3', credentials=credentials)
http = _auth.authorized_http(credentials)
service.files().get(...).execute(http=http)

【讨论】:

以上是关于ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 线程化时的 Gmail的主要内容,如果未能解决你的问题,请参考以下文章

gsutil ssl.SSLError:[Errno 185090050]

Rails 3:OpenSSL::SSL::SSLError:主机名与服务器证书不匹配

Heroku上的OpenSSL :: SSL :: SSLError [重复]

pandas.read_csv 报ssl.SSLError

如何让 python 信任我服务器的 TLS 自签名证书:ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败

使用 Ruby on Rails 的 HTTP GET 请求:OpenSSL::SSL::SSLError