【问题标题】:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] Gmail when Threadedssl.SSLError: [SSL: WRONG_VERSION_NUMBER] 线程化时的 Gmail
【发布时间】: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()

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: multithreading python-3.x ssl gmail-api


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多