MIME Multipart in E-Mail
Ich versuche, Bilder in eine E-Mail einzubetten.
Die E-Mail wird erstellt, indem Daten über einen Socket an einen SMTP-Server an Port 25 gesendet werden. Hier ist das MIME-Bit:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=mixedsection;
--mixedsection
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Content-Disposition: inline
Below should be an inline embedded image
--mixedsection
Content-Type: image/png; file=ts-charts.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png
iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAACk+hPgAAABpFBMVEX// (etc etc etc)
--mixedsection--
Wenn die E-Mail empfangen wird, scheint der zweite Abschnitt, das Bild, in einen Anhang konvertiert und nie inline angezeigt zu werden. Alle anderen Teile funktionieren einwandfrei. Das Bild ist korrekt als base64 codiert, sodass der Anhang geöffnet werden kann. Der Text- / Klartext-Teil funktioniert korrekt, sowohl wenn die Inhaltsdisposition auf Inline als auch auf Anhang eingestellt ist.
Ich habe andere Mail-Clients (Outlook, Thunderbird) verwendet, um das Bild einzubetten, und kein Problem damit, dass das Bild inline angezeigt wird.
Ich kann das Bild nicht einmal inline anzeigen lassen, selbst wenn ich alles andere entferne. Folgendes wird noch als Anhang erhalten:
MIME-Version: 1.0
Content-Type: image/png; file=ts-charts.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png
iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAAC (etc etc)
Die Frage ist also, was fehlt mir hier und wie kann ich das Bild inline anzeigen lassen?
Antworten
Aus irgendeinem Grund konnte ich es einfach nicht dazu bringen, in einer Vanille zu arbeiten, direkt nach dem RFC-Standard. Wenn jemand weiß, wie es so geht, schreibe bitte.
Also gab ich auf und verwendete Inline-HTML / CID, um das Bild einzubetten.
So habe ich es gemacht:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=mixedsection;
--mixedsection
Content-Type: multipart/related; boundary=relatedsection;
--relatedsection
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 8Bit
Content-Disposition: inline
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<p><img src="cid:myembeddedimage" alt=""></p>
</body>
</html>
--relatedsection
Content-Type: image/png; name=ts-charts.png
Content-ID: myembeddedimage
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png
iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAACk+hPgAAABpFBMVEX//3 (etc etc)
--relatedsection--
--mixedsection--
Hinweis Ich habe auch geändert:
Content-Type: image/png; file=ts-charts.png
durch Entfernen der Dateieigenschaft und Ersetzen durch eine Namenseigenschaft:
Content-Type: image/png; name=ts-charts.png
Ich bin nicht unglaublich sicher, dass dies entweder eine gute oder eine empfohlene Methode ist, aber es funktioniert.
EDIT: .... Nur um fertig zu werden. Ich konnte für mein ganzes Leben nicht herausfinden, wie man einfachen Text und eingebettete HTML-Bilder mischt, also entschied ich mich dafür, den Text einfach in HTML einzufügen.
Hier ist die letzte Nachricht:
MIME-Version: 1.0
Content-Type: multipart/related; boundary=relatedsection;
--relatedsection
Content-Type: text/html;
Content-Transfer-Encoding: 8bit
Content-Disposition: inline
<html>
<head>
<meta http-equiv="content-type" content="text/html;">
</head>
<body>
<p> Below is an embedded image ...</p>
<p><img src="cid:myembeddedimage" alt=""></p>
</body>
</html>
--relatedsection
Content-Type: image/png; name=ts-charts.png
Content-ID: myembeddedimage
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png
AHqCAMAAACk+hPgAAABpFBMVEX///8PDw8jIyPDw8OPj333mOm2ajzGtEbdPpm (etc (etc)
--relatedsection--
Ich musste das äußere Multipart / Mixed entfernen, da das Ausführen dieser Nachricht über einen Exchange-Server dazu führte, dass Anhänge (att0001, att0002) an die Nachricht angehängt wurden. Kein Problem mit diesen Ghost-Anhängen auf Thunderbird, Google Mail oder wie auch immer der Client auf i-Phones heißt.