MIME Multipart dans l'e-mail

Sep 25 2020

J'essaie d'incorporer des images dans un e-mail.

L'e-mail est créé en envoyant des données via une socket à un serveur SMTP sur le port 25. Voici le 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--

Lorsque l'e-mail est reçu, il apparaît que la deuxième section, l'image, est convertie en pièce jointe et n'est jamais affichée en ligne. Toutes les autres parties fonctionnent correctement, l'image est correctement encodée en base64 afin que la pièce jointe puisse être ouverte. La partie texte / simple fonctionne correctement à la fois lorsque la disposition du contenu est définie sur en ligne ou en pièce jointe.

J'ai utilisé d'autres clients de messagerie (Outlook, Thunderbird) pour intégrer l'image, et aucun problème avec l'image affichée en ligne.

Je n'arrive même pas à afficher l'image en ligne même si je supprime tout le reste. Ce qui suit est toujours reçu en pièce jointe:

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)

La question est donc de savoir ce qui me manque ici et comment puis-je afficher l'image en ligne?

Réponses

1 Mark Sep 25 2020 at 20:04

Pour une raison quelconque, je ne pouvais tout simplement pas le faire fonctionner à la vanille, directement de la manière standard RFC; si quelqu'un sait comment procéder de cette façon, merci de poster.

J'ai donc abandonné et utilisé du HTML / CID en ligne pour intégrer l'image.

Voici comment je l'ai fait:

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

Notez que j'ai également changé:

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

en supprimant la propriété de fichier et en la remplaçant par une propriété de nom:

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

Je ne suis pas vraiment convaincu que ce soit une bonne façon de le faire ou une méthode recommandée, mais cela fonctionne.

EDIT: .... Juste pour finir. Pendant toute ma vie, je ne pouvais pas comprendre comment mélanger du texte brut et des images intégrées HTML, j'ai donc opté pour simplement mettre le texte en HTML.

Voici le message final:

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

J'ai dû supprimer le multipart / mixed externe car l'exécution de ce message via un serveur d'échange a entraîné l'ajout de pièces jointes (att0001, att0002) au message. Aucun problème avec ces pièces jointes fantômes du tout sur Thunderbird, Gmail, ou tout ce que le client est appelé sur les i-Phones.