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.