Py3.4 IMAPLib登录...'str'不支持缓冲区接口

时间:2016-09-07 12:45:23

标签: python python-3.x base64 imaplib

使用imaplib,我正在尝试连接到邮件服务器。 当我将密码包含为普通字符串时:'password' 它很好。但我试图略微模糊我的密码,所以我以前通过b64encode运行它,然后在登录中使用b64decode:

#Works:
mail.login('myloginname', 'myPassword')

#Doesn't Work:
mail.login('myloginname', base64.b64decode('Ja3rHsnakhdgkhervc'))
# or
mail.login('myloginname', bytes(base64.b64decode('Ja3rHsnakhdgkhervc')))

...

Traceback (most recent call last):
  File "./testing.py", line 15, in <module>
    mail.login('myloginname', bytes(base64.b64decode('Ja3rHsnakhdgkhervc')))
  File "/usr/local/lib/python3.4/imaplib.py", line 536, in login
    typ, dat = self._simple_command('LOGIN', user, self._quote(password))
  File "/usr/local/lib/python3.4/imaplib.py", line 1125, in _quote
    arg = arg.replace('\\', '\\\\')
TypeError: 'str' does not support the buffer interface

建议?

1 个答案:

答案 0 :(得分:0)

您传递的是bytes对象的密码,而不是str值,因为这是base64.b64decode()返回的内容。

您必须解码该值为字符串:

 base64.b64decode('Ja3rHsnakhdgkhervc').decode('ascii')

异常是由bytes.replace()方法引起的,该方法需要bytes个参数。由于'\\''\\\\'str个对象,因此只有args.replace('\\', '\\\\')args对象,才会在bytes处获得追溯:

>>> b'foo'.replace('\\', '\\\\')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
>>> 'foo'.replace('\\', '\\\\')
'foo'