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.

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

  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.