2016-09-07 7 views
0

imaplib를 사용하여 메일 서버에 연결하려고합니다. 암호를 일반 문자열로 포함하면 '암호' 잘 연결됩니다. 하지만, 약간 비밀번호를 당황하게하기 위해 노력하고있어 그래서 나는 이전에 b64encode를 통해 실행 한 후 로그인에 b64decode을 사용 :Py3.4 IMAPLib 로그인 ... 'str'이 버퍼 인터페이스를 지원하지 않습니다.

#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 

제안?

답변

0

암호가 str이 아닌 bytes 개체가 전달됩니다 (base64.b64decode()이 반환하기 때문에).

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

예외가 bytes 인수를 기대 bytes.replace() 방법에 의해 발생 :

당신은 문자열로 가치 디코드해야 할 것이다.

>>> 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' 
+0

하 : '\\''\\\\'str 객체이기 때문에, 당신은 bytes 객체 인 args.replace('\\', '\\\\')args 때문에 역 추적을 얻을! Py3가 문자열 대신에 바이트를 원한다는 것에 대한 많은 게시물을 읽었을 때, 다른 방향으로 캐스팅하는 것에 대해서 생각조차하지 않았습니다. 완벽하게 일했습니다. 고맙습니다. – wolf2600

+0

Python을 처음 사용하면서 오류 메시지를 올바르게 이해하지 못했습니다. 그것이 'str'이 지원하지 않는다고 말했을 때, 문자열을 찾고 있다는 것보다는 문자열을 전달하고있는 것을 보았습니다. – wolf2600

관련 문제