SSL错误:[SSL:WRONG_VERSION_NUMBER] Gmail当使用线程时

4
我能够用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()

然而,当我将其作为简单的方法调用运行时,它可以正常工作,但是当我不使用线程时,就会出现错误。

由于在线程启动和错误发生之间有相当多的方法调用,因此很难在它们之间共享代码。

如果有任何帮助,将不胜感激。

2个回答

7
我刚刚找到了这篇文章:https://developers.google.com/api-client-library/python/guide/thread_safety
根据文档,Gmail API是建立在不安全的Httplib2上的。
为了解决这个问题,您可以向每个命令的execute方法提供一个新的http对象实例。
在我的情况下,
service.labels().list().execute()

Becomes:

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

1
你正在调用 __get_credentials() 的是哪个 self 对象? - erwaman
在我的情况下,我一直在将 service 对象传递给多线程代码的部分(使用并发 futures),并且出现了这个错误。相反,通过传递凭据并在每个线程中创建一个新的服务,它开始工作了:service = build('drive', 'v3', credentials=creds) - kevinmicke
1
你让我的一天变得更美好,尽管答案已经是6年前的!谢谢。 - luca

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接