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 [重复]
如何让 python 信任我服务器的 TLS 自签名证书:ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败