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).
Préparer les images
Je 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) :
- Rendez-vous sur cette page : http://www.fourmilab.ch/webtools/base64/#Download
- Téléchargez le fichier
base64.zip
fourni en bas de page. - Dézippez le fichier. Vous obtenez un unique fichier
base64.exe
. - Je suppose que l’image se trouve dans le même dossier que le fichier exécutable
base64.exe
. - Ouvrez une fenêtre de commande Windows, dans ce dossier.
- Tapez :
base64 -e magique.png magique64.txt
Pour plus de détails :
base64
est le nom du convertisseur (vous auriez aussi pu taperbase64.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 :
- 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).
- Vous aurez également besoin de la bibliothèque Microsoft Scripting Runtime, pour lire le fichier texte en base 64.
- Pour éviter des concaténations, j’utilise la fonction StringFormat() proposée dans un autre article du blog.
- 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
' --- ' INTEGRATION D'UNE IMAGE DANS LE CORPS DE MAIL OUTLOOK ' --- ' Sub IntegrationImageOutlook( _ ByVal strDestinataire As String, _ ByVal strSujet As String, _ ByVal strCheminImage As String) ' Quelques variables Dim olApp As Outlook.Application Dim mi As Outlook.MailItem Dim fso As Scripting.FileSystemObject Dim stm As Scripting.TextStream Dim strImage64 As String ' Lecture de l'image en base 64 Set fso = New Scripting.FileSystemObject Set stm = fso.OpenTextFile(strCheminImage, ForReading) strImage64 = stm.ReadAll() stm.Close Set stm = Nothing Set fso = Nothing ' Démarrer Outlook Set olApp = New Outlook.Application ' Mail Set mi = olApp.CreateItem(olMailItem) With mi ' En-tête .To = strDestinataire .Subject = strSujet .BodyFormat = olFormatHTML ' Corps du message .HTMLBody = StringFormat( _ "Bonjour !<br>Voici une image :<br>" _ & "<img src=""data:image/png;base64,{0}"">", _ strImage64) ' Envoi du mail .Send End With ' On ferme ! Set mi = Nothing olApp.Quit Set olApp = Nothing End Sub |
Tester !
Pour tester la procédure précédente :
- Faites apparaître la fenêtre Exécution (
CTRL
+G
). - 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"
- Validez par
Entrée
… et attendez que le message parte. - Vous avez un nouveau message !
Explications
- En début de procédure, on lit tout le contenu (en base 64) de l’image, dans la variable
strImage64
(de typeString
, 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 duXYZ
, toute l’image encodée plus haut.
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…
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
DenisS > 🙂
Aaahhh ! Vivement la suite, alors 😀
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).
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 😀