How to Decode an Email in MIME Format

By braniac

Most emails sent today are MIME (Multipupose Internet Mail Extensions) formatted. This allows emails to be sent with plain text and rich text/HTML versions, inline images, and attachments. MIME extensions can be added to a message in standard RFC/822 format so backward compatibility is achieved with older mail systems.

Things You'll Need

  • Knowledge of a computer language (i.e. C++, C#, VB, etc).
  • Basic knowledge of the format of an RFC/822 formatted email message.

Step 1

Load the contents of the email message.

Step 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.

Step 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".

Step 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_6befcfa5d021First MIME part.--part_c7161025_fe8a_45f4_83ef_6befcfa5d021Second MIME part--part_c7161025_fe8a_45f4_83ef_6befcfa5d021Last MIME part.--part_c7161025_fe8a_45f4_83ef_6befcfa5d021--

Step 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.

Step 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.

Step 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.43F2628DContent-Type: image/jpeg; name="testimage.jpg"Content-Transfer-Encoding: base64Content-Description: testimage.jpgContent-Disposition: attachment; filename="testimage.jpg"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAQABQQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA

Step 8

The HTML body of the message should be in a MIME section with ContentType: Text/Html, inside a ContentType: Multipart/Alternative MIME section.

Step 9

The plaintext body of the message should be in a MIME section with ContentType: Text/plain, inside a ContentType: Multipart/Alternative MIME section.

Tips & Warnings

  • Consult RFC 822 and RFC 1341 for more information.
  • If you are coding in C#, an excellent free library is available at