El objeto ‘str’ no tiene atributo ‘decodificar’. Python 3 error?

Aquí está mi código:

import imaplib from email.parser import HeaderParser conn = imaplib.IMAP4_SSL('imap.gmail.com') conn.login('example@gmail.com', 'password') conn.select() conn.search(None, 'ALL') data = conn.fetch('1', '(BODY[HEADER])') header_data = data[1][0][1].decode('utf-8') 

en este punto me sale el mensaje de error

 AttributeError: 'str' object has no attribute 'decode' 

Python 3 ya no tiene deencoding, ¿verdad? ¿Cómo puedo arreglar esto?

También en:

 data = conn.fetch('1', '(BODY[HEADER])') 

Estoy seleccionando sólo el primer correo electrónico. ¿Cómo selecciono todo?

Está intentando descodificar un objeto que ya está descodificado . Usted tiene un str , ya no hay necesidad de decodificar desde UTF-8.

Simplemente suelte la parte .decode('utf-8') :

 header_data = data[1][0][1] 

En cuanto a su llamada fetch() , está pidiendo explícitamente sólo el primer mensaje. Utilice un rango si desea recuperar más mensajes. Vea la documentación :

Las opciones de message_set para los comandos a continuación son una cadena que especifica uno o más mensajes sobre los que se debe actuar. Puede ser un número de mensaje simple ( '1' ), un rango de números de mensaje ( '2:4' ) o un grupo de rangos no contiguos separados por comas ( '1:3,6:9' ). Un rango puede contener un asterisco para indicar un límite superior infinito ( '3:*' ).

Comience con Python 3, todas las cadenas son objetos Unicode.

  a = 'Happy New Year' # Python 3 b = unicode('Happy New Year') # Python 2 

El código anterior es el mismo. Así que creo que deberías eliminar el .decode('utf-8') . Porque ya tienes el objeto Unicode.

Úsalo por este método:

 str.encode().decode() 

No estoy familiarizado con la biblioteca, pero si su problema es que no desea una matriz de bytes, una manera fácil es especificar un tipo de encoding directamente en una conversión:

 >>> my_byte_str b'Hello World' >>> str(my_byte_str, 'utf-8') 'Hello World' 

Ya está descodificado en Python3, intente directamente debería funcionar.