docs.python.org的POP3示例抛出错误

-1 投票
1 回答
1134 浏览
提问于 2025-04-18 06:55

我刚接触Python,想写个脚本从我的pop3邮箱服务器下载邮件。我在Python.org上找到一个看起来简单的例子,但当我用我的邮箱设置运行代码时,出现了这个错误:

Traceback (most recent call last):                           
  File "getmail.py", line 4, in <module>                     
    M.pass_(getpass.getpass())                               
  File "E:\Python32\lib\poplib.py", line 192, in pass_       
    return self._shortcmd('PASS %s' % pswd)                  
  File "E:\Python32\lib\poplib.py", line 155, in _shortcmd   
    return self._getresp()                                   
  File "E:\Python32\lib\poplib.py", line 131, in _getresp    
    raise error_proto(resp)                                  
poplib.error_proto: b'-ERR Authentication failed.'            

这是来自python.org的示例代码:

import getpass, poplib

M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print j

代码中的“print j”这一行当然会报错。有趣的是,这个脚本也没有询问用户名,只问了密码,我猜这就是“认证失败”的原因。

为了避免我输入的用户名或密码错误,我对我的脚本做了以下修改:

import getpass, poplib

M = poplib.POP3('mail.myPOP3server.com')
M.user = 'my_username'
M.pass_ = 'myPassword'
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print(j)

结果出现了以下错误:

Traceback (most recent call last):
  File "E:\wos\getmail.py", line 6, in <module>
    numMessages = len(M.list()[1])
  File "E:\Python32\lib\poplib.py", line 219, in list
    return self._longcmd('LIST')
  File "E:\Python32\lib\poplib.py", line 162, in _longcmd
    return self._getlongresp()
  File "E:\Python32\lib\poplib.py", line 138, in _getlongresp
    resp = self._getresp()
  File "E:\Python32\lib\poplib.py", line 131, in _getresp
    raise error_proto(resp)
poplib.error_proto: b'-ERR Unknown command.'
[Finished in 0.4s with exit code 1]

所以我确信问题出在这里:

numMessages = len(M.list()[1])

有没有人能帮我解答一下这个问题?

我经常使用docs.python.org来查找示例代码,这是我第一次遇到示例代码失败的情况。我尝试把密码改得很短很简单,还在用户名后面加上“@servername”,但还是无法获取邮件列表。

示例代码可以在这个 页面 找到。

更新:如果有人能解释一下为什么会被投反对票,我会很感激,这样我可以从中学习。

1 个回答

3

根据文档的说明,POP3.userPOP3.pass_ 是一些方法,你需要把用户名和密码传递给它们,而不是把用户名和密码赋值给这些方法。所以,你需要把这个:

M.user = 'my_username'
M.pass_ = 'myPassword'

改成这个:

M.user('my_username')
M.pass_('myPassword')

撰写回答