How to create an email with embedded images that is compatible with the most mail clients

We have created a system that allows embedding an image in an outgoing email.

Here is the original message our system creates. This example contains an image attachment and an embedded image.

Mime-Version: 1.0
From: ...
To: ...
CC: 
Subject: test
x-sender: ...
x-mailer: ...
Content-Type: multipart/mixed; boundary="-------------...A128803765634794"

---------------...A128803765634794
Content-Type: multipart/related; boundary="-------------...B128803765634796"

---------------...B128803765634796
Content-Type: text/html; charset="UTF-8"

<p style="margin: 0; padding: 0"><img src="cid:083.gif" alt="" /></p>

---------------...B128803765634796
Content-type: image/gif; name="083.gif"
Content-ID: <083.gif>
X-Attachment-Id: 083.gif
Content-Disposition: Embedded; filename="083.gif"
Content-transfer-encoding: base64

............................................................................
............................................................................
......................................................
---------------PineappleCodeB128803765634796--
---------------PineappleCodeA128803765634794
Content-type: image/gif; name="waiting.gif"
Content-Disposition: Attachment; filename="waiting.gif"
Content-transfer-encoding: base64

............................................................................
............................................................................
......................................................
---------------PineappleCodeA128803765634794--

Is there another header I should add or rule I should follow?

I noticed one thing... I would guess that it is part my issue and part Gmails. but at any rate I would like to make it stop happening

When the email is received into Gmail I get

Images are not displayed.
Display images below - Always display images from ...

The embedded image is then shown as an image attachment (just like my other image attachment)

I click Display Images Below and my image is shown in the body of the email but not removed from the Attachments section.

If I go back to my in box and back to the email it looks fine.

I do not see why it does that. It it not a linked image (from external URL) and it does not happen when sending embedded images from Gmail to Gmail. That is what makes me think I might be doing somthing wrong and I am afraid that it may affect other recipients.


I've had success with exactly the same headers as you're using, with the following differences:

  • Embedded is not a valid value for the Content-Disposition header. attachment should be fine. inline should also be fine, though I've usually seen attachment for multipart/related embedded images.

  • The value of the Content-ID header is supposed to be in the same format as a message-id, which in turn looks very much like an email address. <083.gif@yourmailer> has a better chance of working with most mailers.


I was having trouble loading inline images in Gmail and I found that I was mis-using the PEAR Mail_Mime library in PHP. As already noted, the Content-ID must be formatted like a message id. The PEAR Mail_Mime library will try to add a domainID to your Content-ID if one is not supplied. It will also attempt to regex replace these Content-ID's in the HTML body of the email to maintain the link. In my case, this step was failing which did end up breaking the link from the HTML tag to the MIME attachment. So it was perfectly correct for Gmail to refuse to display the image inline. It did display the image as an attachment however.