MIME Multipart in E-Mail

Sep 25 2020

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

1 Mark Sep 25 2020 at 20:04

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.