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.
Step 1
Load the contents of the email message.
Video of the Day
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_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--
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.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
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.
Video of the Day