Intégrer une image dans un email Outlook – Episode 1

La question m’a été posée plusieurs fois : comment intégrer directement une image dans un corps de mail Outlook (et non pas en pièce jointe) ?

Cette question concerne plutôt Outlook et pas Access, mais on va en profiter pour traiter l’opération à partir d’Access et en VBA… 😉

Avant de démarrer…

  • Dans la technique qui suit, l’intégration des images se fait en encodant les images en base 64, puis en intégrant le résultat dans le corps de message. Le message doit être au format HTML (quelques notions de HTML peuvent dépanner pour la suite !).
  • Le premier avantage de la technique est que les images figurent directement dans le message, plutôt qu’en pièce jointe. Elles sont donc plus « accessibles » (pas besoin d’ouvrir une pièce jointe).
  • L’autre avantage est que les images ne sont pas transmises comme images externes (contrairement au cas des newsletters) : elles sont moins bloquées par les logiciels de messagerie ou les webmails.
  • Cet article ne traite pas de l’encodage en base 64 en VBA. Les images devront être préparées en amont (voir ci-dessous).
Attention
L’encodage en base 64 augmente le poids en octets des images d’un facteur variable (1.5 en moyenne). Dans l’exemple plus bas, l’image passe de 4.88 Ko à 6.68 Ko, par exemple. Cela signifie que la technique ne devrait pas être employée pour l’envoi de grosses images. Ça peut être intéressant pour un logo en bas de mail, par exemple.Mais pas pour une newsletter ! (sur un autre test, une de mes newsletters passe de 18 Ko sans images à 500 Ko lorsque les images sont intégrées).

Préparer les images

magique.pngJe dispose au départ de l’image ci-contre, au format PNG. L’image s’appelle magique.png dans l’exemple.

Cette image doit donc être convertie en base 64. Voici une façon de faire, en ligne de commande (qui pourrait être automatisée en VBA plus tard) :

  1. Rendez-vous sur cette page : http://www.fourmilab.ch/webtools/base64/#Download
  2. Téléchargez le fichier base64.zip fourni en bas de page.
  3. Dézippez le fichier. Vous obtenez un unique fichier base64.exe.
  4. Je suppose que l’image se trouve dans le même dossier que le fichier exécutable base64.exe.
  5. Ouvrez une fenêtre de commande Windows, dans ce dossier.
  6. Tapez :
    base64 -e magique.png magique64.txt

base64-dump.jpg

Pour plus de détails :

  • base64 est le nom du convertisseur (vous auriez aussi pu taper base64.exe).
  • -e est un paramètre qui demande l’encodage de l’image (la transformation en base 64).
  • magique.png est le fichier de départ.
  • magique64.txt est le fichier d’arrivée.

Si vous ouvrez le fichier magique64.txt, vous obtenez une suite de codes comme celle-ci (j’ai réduit le nombre de lignes) :

iVBORw0KGgoAAAANSUhEUgAAAOgAAAAnCAYAAAAFFwQZAAAABHNCSVQICAgIfAhkiAAAAAlw
SFlzAAAN1gAADdYBkG95nAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoA
ABMFSURBVHic7Z13vB3Fdce/g0BGwghhFYpMVcAYAhjhQGimaRDNBIMHAaaF0ExoAseUOAgr
FDkEE4NNCDYEbGzKIIzpMLQQA6YjwDIGgwWiCURHhabxH2dW2jd3Zu/uvU9CIe/3+dzPu292
dnbu3j1zzvmdc+Yq7z11oLRdEdgcuNY7M6fWSYsYlLafB0Z5Z+7+tOfShz7UwWIN+g4EtgVO
UdqOWEDzWWBQ2q4BTAD+9tOeSx/6UBdNBLRf+Lss8B2l7eoLYD6VUNruorQdrbRdsuF5mwLH
AEsB7y6QyfXhMwOl7ec+7TkUWLxB33dK7wcC45S253tnft8bE1HaKu9MO3tbAQbYUWl7M3Cn
d+ajqjGBbwBjSs0vdz1ZGXt5YASwJDDVO/NSm/4rAqsBc4AXvTPTe2MenyWE72sMsAmwLrAC
8tw9A9wO3Oid+bDi/K2Aw4BHgIeBR70zb9a87gbh2hoYpbRd0Tszq6sP1AtQDXzQJYEfRc2f
...

Le code VBA

Notez le chemin complet du fichier magique64.txt, vous en aurez besoin pour la suite… Il est plus pratique de lire directement le fichier texte (qui peut être lourd) à partir d’Access, plutôt que d’essayer de l’intégrer dans le code VBA.

Quelques petites choses à régler avant de coder en VBA :

  1. Ce qui suit nécessite la bibliothèque Microsoft Outlook x.y Object Library, pour piloter Outlook à partir d’Access (voir la page Références pour plus de détails).
  2. Vous aurez également besoin de la bibliothèque Microsoft Scripting Runtime, pour lire le fichier texte en base 64.
  3. Pour éviter des concaténations, j’utilise la fonction StringFormat() proposée dans un autre article du blog.
  4. Enfin, d’autres articles parlent déjà d’Outlook sur le blog. Vous devriez les consulter ! 😉

Voici le code VBA qui envoie une image dans le corps de mail. A recopier dans un module standard, comme d’habitude ! Pour l’instant, le code est limité : vous pourrez l’étendre pour ajouter plus d’une image, et paramétrer le corps du message. Mais l’essentiel est là pour la démo.

Tester !

Pour tester la procédure précédente :

  1. Faites apparaître la fenêtre Exécution (CTRL + G).
  2. Tapez dans cette fenêtre (sur une seule ligne, et en adaptant selon vos propres infos) :
    IntegrationImageOutlook "votre.email@votre-fournisseur.fr", "Test Image", "C:\Users\...\magique64.txt"
  3. Validez par Entrée… et attendez que le message parte.
  4. Vous avez un nouveau message !base64-resultat.png

Explications

  • En début de procédure, on lit tout le contenu (en base 64) de l’image, dans la variable strImage64 (de type String, car l’encodage base 64 est bien de type texte).
  • Le corps du message est paramétré pour être au format HTML.
  • Le message lui-même est en HTML, d’où les <br> pour provoquer les retours à la ligne, dans le texte.
  • En HTML, une image est insérée par la balise <img src="chemin">. Ici, on utilise une variante où le chemin est remplacé par la base 64 de l’image, de la forme : <img src="data:image/png;base64,XYZ">. A la place du XYZ, toute l’image encodée plus haut.

Vous aimerez aussi...

6 réponses

  1. Hervé Inisan dit :

    Supergin > Je n’ai pas eu le temps (et la possibilité !) de tester sur toutes les configurations, mais l’affichage peut effectivement dépendre du logiciel de messagerie, selon qu’il prend en charge ou pas le format. Je reteste dès que j’ai un moment…

  2. Supergin dit :

    Bonjour Hervé
    Très content que le sujet soit traité: c’est un must!!!
    Ceci dit j’ai un problème (Houston)
    – Toutes les bibliothèques nécessaires (références) sont installées
    – La conversion d l’image png a été fzite suivant la procédure décrite
    – La fonction String format a été intégrée dans un module
    _ Le mail est bien envoyé et reçu avec son titre et son texte mais l’image continue à s’afficher avec un petit carré et une croix-rouge
    Une idée? Exite-t-il un moyen de vérifier si l’encodage base64 s’est bien effectué un moyen de reconstituer l’image à partir du fichiet txt)? Ou faut-il s’orienter vers autre chose?
    Autre problème: dès l’exécution du test, Outlook me dit qu’il reste encore des messages non envoyés!!
    Je livre ceci à ta sagacité proverbiale
    Encore bravo pour ton superbe engagement

  3. Hervé Inisan dit :

    DenisS > 🙂

  4. DenisS dit :

    Aaahhh ! Vivement la suite, alors 😀

  5. Hervé Inisan dit :

    DenisS > Hé, hé ! Si, si ça apporte quelque chose… 🙂 En fait, ça anticipe sur le 3ème article de cette mini-série (une version libMail only).

  6. DenisS dit :

    Ou, pour ceux qui ont également installé libMAIL :

    strImage64 = Enc_Base64(PJFichier(strCheminImage))

    permet aussi de récupérer le contenu encodé du fichier dans une variable, sans programme externe 😉

    Bon, ça n’apporte rien, mais il fallait que ce soit dit 😀

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *