Cómo decodificar un correo electrónico en formato MIME

La mayoría de emails actuales usan formato MIME (Extensiones de Correo Internet Multipropósito). Permite enviar texto plano y enriquecido/HTML, imágenes incrustadas y adjuntos. Las extensiones MIME pueden añadirse a mensaje en formato RFC/822 estándar para compatibilidad con sistemas de correo antiguos.

Paso 1

Cargue el contenido del mensaje de email.

Paso 2

Verifique cabecera «Content-Type». Si es multipart (ej. «multipart/mixed», «multipart/alternative»), el mensaje tendrá varias secciones para analizar. Si es multipart, continúe.

Paso 3

La cabecera «Content-Type» debe contener cadena única usada por el generador MIME para delimitar partes. Ejemplo:

Content-Type: multipart/mixed; boundary="part_c7161025_fe8a_45f4_83ef_6befcfa5d021"

La cadena boundary es «part_c7161025_fe8a_45f4_83ef_6befcfa5d021».

Paso 4

Cada parte MIME se separa por la cadena boundary precedida de dos guiones («--») en línea en blanco. Escanee línea a línea buscando límites. Todo texto entre límites excepto el CR/LF final pertenece a esa parte.

Importante: La última parte termina con boundary seguido de dos guiones más.

Ejemplo:

--part_c7161025_fe8a_45f4_83ef_6befcfa5d021 Primera parte MIME.
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021 Segunda parte MIME
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021 Última parte MIME.
--part_c7161025_fe8a_45f4_83ef_6befcfa5d021--

Paso 5

Cada parte MIME debe analizarse. Su formato es similar al mensaje RFC/822 original: serie de cabeceras, línea en blanco, datos del cuerpo.

Paso 6

Una parte MIME puede ser a su vez multipart, con su propia cabecera «Content-Type» y boundary. Su código debe analizar recursivamente hasta nodos hoja.

Paso 7

Una parte puede ser adjunto binario. Entonces suele haber cabecera «Filename» y codificación de transferencia. BASE64 es popular. En ese caso, todo el cuerpo debe decodificarse BASE64. Ejemplo primeras líneas de JPG adjunto:

------=NextPart_003_01C755EF.43F2628D
Content-Type: image/jpeg; name="testimage.jpg"
Content-Transfer-Encoding: base64
Content-Description: testimage.jpg
Content-Disposition: attachment; filename="testimage.jpg"
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAQABQQDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA

Paso 8

El cuerpo HTML debe estar en sección MIME con Content-Type: Text/Html, dentro de Content-Type: Multipart/Alternative.

Paso 9

El cuerpo en texto plano debe estar en sección MIME con Content-Type: Text/plain, dentro de Content-Type: Multipart/Alternative.

Consejo

Consulte RFC 822 y RFC 1341 para más info. Si programa en C#, excelente librería gratis en codeproject.com/csharp/mime_project.asp.