MIME Multipart w e-mailu
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
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.