Sunday, December 15, 2013

How to Decode an Email in MIME Format


1. Load the contents of the email message.
2. Check the "Content-Type" header. If the content type is multipart (i.e. "multipart/mixed", "multipart/alternative", etc) the message will have multiple sections to parse. If the content type is multipart, continue with below steps.
3. The Content-Type header should contain a unique string used by the code that generated the MIME message to designate MIME part boundaries. Example:Content-Type: multipart/mixed;
boundary="part_c7161025_fe8a_45f4_83ef_6befcfa5d021"The boundary string in this case is "part_c7161025_fe8a_45f4_83ef_6befcfa5d021".
4. Each MIME part will be separated by the boundary string preceeded by two dashes ("--") on a blank line. You will need to scan the message line by line looking for the part boundaries. All text in between the boundaries *except the final CR/LF* is part of that MIME part.Important: The last MIME part will end with the boundary string followed by two more dashes.Example:--part_c7161025_fe8a_45f4_83ef_6befcfa5d021
First MIME part.--part_c7161025_fe8a_45f4_83ef_6befcfa5d021
Second MIME part--part_c7161025_fe8a_45f4_83ef_6befcfa5d021
Last MIME part.--part_c7161025_fe8a_45f4_83ef_6befcfa5d021--
5. Each MIME part then needs to be parsed. The format of each MIME part is similar to the original RFC/822 formatted message. It will contain a series of headers, followed by a blank line, then the body data.
6. A MIME part can itself be multipart, with its own "Content-Type" header and boundary string. Your code must recursively parse MIME parts until it reaches the child nodes.
7. A MIME part can simply be a binary attachment. In this case a Filename header will usually be supplied, along with the transfer encoding. BASE64 is a popular encoding type. In this case the entire MIME part body must be BASE64 decoded. As an example here are the first few lines of an attached JPG image:------_=_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
8. The HTML body of the message should be in a MIME section with ContentType: Text/Html, inside a ContentType: Multipart/Alternative MIME section.
9. The plaintext body of the message should be in a MIME section with ContentType: Text/plain, inside a ContentType: Multipart/Alternative MIME section.