【问题标题】:Why am I receiving a TypeError when trying to use imapclient?为什么我在尝试使用 imapclient 时收到 TypeError?
【发布时间】:2021-09-17 17:40:18
【问题描述】:

我是 Python 新手,我正在尝试编写代码让我进入我的 gmail 收件箱,并遵循 Udemy 课程。我已经成功安装了 imapclient,并且导入 impapclient 并没有返回任何错误,所以我认为我没问题。

当我去写下一行代码conn = imapclient.IMAPClient('imap.gmail.com', ssl=True) 并输入它时,它给了我一个类型错误

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    conn = imapclient.IMAPClient('imap.gmail.com', ssl=True)
  File "C:\Users\china\AppData\Local\Programs\Python\Python39\lib\site-packages\imapclient\imapclient.py", line 254, in __init__
    self._imap = self._create_IMAP4()
  File "C:\Users\china\AppData\Local\Programs\Python\Python39\lib\site-packages\imapclient\imapclient.py", line 288, in _create_IMAP4
    return tls.IMAP4_TLS(self.host, self.port, self.ssl_context,
  File "C:\Users\china\AppData\Local\Programs\Python\Python39\lib\site-packages\imapclient\tls.py", line 44, in __init__
    imaplib.IMAP4.__init__(self, host, port)
  File "C:\Users\china\AppData\Local\Programs\Python\Python39\lib\imaplib.py", line 202, in __init__
    self.open(host, port, timeout)
TypeError: open() takes 3 positional arguments but 4 were given

我知道 ssl=True 和 'imap.gmail.com' 都是必需的参数,所以我没有尝试将任何一个都去掉。我只有两行代码,而且我正在按照 Udemy 课程中的确切代码进行操作,所以我不确定如何自己解决这个问题。

【问题讨论】:

  • 我相信你有一个不支持 Python 3.9 的旧版本的 imapclient 模块(具体来说,它不期望在 3.9 中添加到 IMAP4.open()timeout 参数。
  • 我昨天刚刚 pip 安装了 imapclient。检查后是最新的。

标签: python typeerror


【解决方案1】:

我遇到了完全相同的问题。 问题是 imapclient 直到 Python 3.7 才被正式支持,所以你可以尝试在 Python 3.7 中使用 imapclient。

或者你可以使用 imaplib 模块。它有点复杂,但我尝试使用 imaplib 和 pyzmail 模块(使文本更具可读性)

import imaplib
import pyzmail

server = imaplib.IMAP4_SSL('IMAP_SERVER')
server.login('email@example.com', 'password')
server.select("INBOX")
typ, data = server.search(None, "ALL")
for num in data[0].split():
    typ, data = server.fetch(num, '(RFC822)')
    message = pyzmail.PyzMessage.factory(data[0][1])
    print('THIS IS MESSAGE NO. ' + str(num))
    if(message.text_part != None):
        print(message.text_part.get_payload().decode(message.text_part.charset))
    elif(message.html_part != None):
        print(message.html_part.get_payload().decode(message.html_part.charset))

server.close()
server.logout()

我不是 Python 专家,因此使用 pyzmail 可能不是最佳解决方案,但它对我使用 Python 3.9 有效

  • 对于 IMAP_SERVER,您必须插入正确的 IMAP 服务器域名(如 imap.gmail.com 用于 gmail 帐户)
  • 您必须输入您的真实电子邮件地址和密码(或使用 input() 获取密码)

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。它已在 IMAPClient 2.2.0 中修复。 https://imapclient.readthedocs.io/en/2.2.0/releases.html

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 2010-12-31
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2015-10-24
      • 2021-03-15
      相关资源
      最近更新 更多