MIME Multipart w e-mailu

Sep 25 2020

Próbuję osadzić obrazy w wiadomości e-mail.

Wiadomość e-mail jest tworzona przez wysyłanie danych przez gniazdo do serwera SMTP na porcie 25. Oto bit MIME:

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

Po odebraniu wiadomości e-mail wydaje się, że druga sekcja, obraz, jest konwertowana na załącznik i nigdy nie jest wyświetlana w tekście. Wszystkie pozostałe części działają poprawnie, obraz jest poprawnie zakodowany jako base64, więc załącznik można otworzyć. Część tekstowa / zwykła działa poprawnie zarówno wtedy, gdy Dyspozycja zawartości jest ustawiona jako wbudowana lub jako załącznik.

Użyłem innych klientów pocztowych (Outlook, Thunderbird) do osadzenia obrazu i nie ma problemu z wyświetlaniem obrazu w tekście.

Nie mogę nawet wyświetlić obrazu w tekście, nawet jeśli usunę wszystko inne. Następujące dokumenty nadal są odbierane jako załącznik:

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)

Pytanie brzmi, czego tu brakuje i jak sprawić, by obraz był wyświetlany w tekście?

Odpowiedzi

1 Mark Sep 25 2020 at 20:04

Z jakiegoś powodu po prostu nie mogłem zmusić go do działania w wanilii, prosto ze standardowego sposobu RFC; jeśli ktoś wie, jak to zrobić w ten sposób, napisz.

Więc poddałem się i użyłem wbudowanego HTML / CID do osadzenia obrazu.

Oto jak to zrobiłem:

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

Uwaga, zmieniłem również:

Content-Type: image/png; file=ts-charts.png

usuwając właściwość pliku i zastępując ją właściwością name:

Content-Type: image/png; name=ts-charts.png

Nie jestem przekonany, że jest to dobry lub zalecany sposób, ale to działa.

EDYCJA: .... Tylko po to, aby zakończyć. Przez całe życie nie mogłem wymyślić, jak połączyć zwykły tekst i osadzone obrazy HTML, więc zdecydowałem się po prostu umieścić tekst w HTML.

Oto ostatnia wiadomość:

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

Musiałem usunąć zewnętrzną wieloczęściową / mieszaną, ponieważ wysłanie tej wiadomości przez serwer wymiany spowodowało dołączenie do wiadomości załączników (att0001, att0002). Nie ma problemu z tymi duchowymi załącznikami w Thunderbirdzie, Gmailu czy jakikolwiek inny klient dzwoni na i-Phones.