En Amazon SES, tengo una regla para guardar los correos electrónicos entrantes en depósitos S3. Amazon los guarda en formato MIME.
Estos correos electrónicos tienen un archivo .txt adjunto que se mostrará en el archivo MIME como content-type=text/plain , Content-Disposition=attachment ... .txt y Content-Transfer-Encoding=quoted-printable o bases64 .
Puedo analizarlo bien usando python.
Tengo un problema al decodificar el contenido del archivo adjunto .txt cuando está comprimido (es decir, content-type: applcation/zip ), como si la codificación no fuera base64 .
Mi código:
import base64 s = unicode(base64.b64decode(attachment_content), "utf-8")arroja el error:
Traceback (most recent call last): File "<input>", line 796, in <module> UnicodeDecodeError: 'utf8' codec can't decode byte 0xcf in position 10: invalid continuation byte A continuación se encuentran las primeras líneas de la cadena "base64" en attachment_content , que por cierto tiene una longitud de 53683 + "==" al final, y pensé que la longitud de una base64 debería ser un múltiplo de 4 (??). Entonces, ¿tal vez la decodificación está fallando porque la compresión está cambiando el attachment_content y necesito alguna otra operación antes/después de decodificarlo? la verdad no tengo idea..
UEsDBBQAAAAIAM9Ah0otgkpwx5oAADMTAgAJAAAAX2NoYXQudHh0tL3bjiRJkiX23sD+g0U3iOxu REWGu8c1l2Ag8lKd0V2ZWajM3kLuC6Hubu5uFeZm3nYJL6+n4T4Ry8EOdwCSMyQXBRBLgMQ+7CP5 QPBj5gdYn0CRI6JqFxWv7hlyszursiJV1G6qonI5cmQyeT6dPp9cnCaT6Yvp5Yvz6xfJe7cp8P/k 1SbL8xfJu0OSvUvr2q3TOnFVWjxrknWZFeuk2VRlu978s19MRvNMrHneOv51SOZlGUtMLYnfp0nd ...También intenté usar "latin-1", pero obtuve un galimatías.
El problema era que, después de la conversión, estaba lidiando con un archivo comprimido en formato, como " PK \x03 \x04 \X3C \Xa \x0c ... ", y necesitaba descomprimirlo antes de transformarlo a UTF-8 unicode .
Este código funcionó para mí:
import email # Parse results from email received_email = email.message_from_string(email_text) for part in received_email.walk(): c_type = part.get_content_type() c_enco = part.get('Content-Transfer-Encoding') attachment_content = part.get_payload() if c_enco == 'base64': import base64 decoded_file = base64.b64decode(attachment_content) print("File decoded from base64") if c_type == "application/zip": from cStringIO import StringIO import zipfile zfp = zipfile.ZipFile(StringIO(decoded_file), "r") unzipped_list = zfp.open(zfp.namelist()[0]).readlines() decoded_file = "".join(unzipped_list) print('And un-zipped') result = unicode(decoded_file, "utf-8")