XL 2016 VBA - Mail Outlook - Impossible d'insérer dans le corps du mail les "Embbeded" images

Dudu2

XLDnaute Barbatruc
Bonjour,

Je galère à essayer de placer les images "embbeded" d'un mail Outlook dans le corps du message, là où je veux qu'elles se placent et non pas à la fin du mail.

Voilà ce que ça donne avec ce .HTMLBody = <BODY><HTML>Bonjour<BR>Première image<BR><IMG src=cid:'EmbbededImage1.jpg'><BR>Deuxième image<BR><IMG src=cid:'EmbbededImage2.jpg' width='200'><BR>Fin du mail</HTML></BODY>

Et les bons attachments (qui sont bien attachés au mail !)
.Attachments.Add "H:\Téléchargements\EmbbededImage1.jpg", 1, 0
.Attachments.Add "H:\Téléchargements\EmbbededImage2.jpg", 1, 0

1628157180544.png


Merci pour toute information utile.
 
Dernière édition:
Solution
J'ai pris une approche simplificatrice pour l'envoi d'email avec Outlook en définissant une structure d'interface qu'il suffit de remplir pour s'éviter toute la mise en place dans les objets de mail Outlook.
VB:
'--------------------------------------------------------------------------------
'Interface à valoriser pour envoyer un mail Outlook via la fonction MailOutlook()
'--------------------------------------------------------------------------------
Public Type OUTLOOK_DATA
    SendUsingAccount As Variant         'Nom du compte à utiliser (ex.:moncompte@domaine.com)
                                        'Numéro de séquence (1-n) du compte OutLook à utiliser.
                                        'Si Numéro = 0, la liste...

patricktoulon

XLDnaute Barbatruc
re

Avec CDO j'ai aussi un vieux bout de code avec les attachments mais je n'ai pas les embedded images.
Mais CDO me créé des problèmes particuliers quand il plante, je reste bloqué sur Excel.
outlook a exactement le meme probleme tu es obligé de fermer si tu es en display ou aller fermer le procc outlook dans les taches
perso j’extériorise l'envoie par vbs dynamique

revenons a mon image sans fichier 😁
tiens kado
ouvre un new classeur

colle lui ça dans un module standard
on teste vite fait dans une page web vide
VB:
'***************************
'fonction image to code base64
'auteur patricktoulon
'version 2016
'**********************************
Sub test()
Fichier = ThisWorkbook.Path & "\dudu2.jpg"
 t = imgtobase64(Fichier)

  body = "Bonjour   j 'aime bien ton avatar DUDU<br>" & vbCrLf & _
  "<img src=data:image/jpg;base64," & t & "/>"
   
  With CreateObject("internetexplorer.application")
  .navigate "about:blank"
  .Visible = True
  Do While .readystate < 4: Loop
.document.write body
End With
End Sub

Function imgtobase64(Fichier)
    Dim Buffer() As Byte, intFileNumber, Fso As Object, objXML As Object, objNode As Object
    intFileNumber = FreeFile
    Set Fso = CreateObject("Scripting.FileSystemObject")
    ReDim Buffer(Fso.GetFile(Fichier).Size)
    Set Fso = Nothing
    Open Fichier For Binary As #intFileNumber
    While Not EOF(intFileNumber)
        Get #intFileNumber, , Buffer
    Wend
    Close #intFileNumber
    Set objXML = CreateObject("MSXML2.DOMDocument")    '.DOMDocument
    Set objNode = objXML.createElement("b64")    'MSXML2.IXMLDOMElement
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = Buffer
    imgtobase64 = Replace(objNode.Text, Chr(10), "")
    'Debug.Print img64
    Set objNode = Nothing
    Set objXML = Nothing
End Function

sauve ce classeur sous le nom que tu veux
dans le même dossier que le classeur met lui ton avatar
je l'ai copié pour toi (en pièce jointe)
une fois lancer clique droite dans le document html qui s'ouvre et clique "code source"

;)
 

Pièces jointes

  • dudu2.jpg
    dudu2.jpg
    3.9 KB · Affichages: 20

Dudu2

XLDnaute Barbatruc
Salut @patricktoulon,

Tu dis ça parce que tu vas trop vite et tu survoles les choses. Et après tu affirmes des trucs incorrects.
Je ne t'ai pas corrigé la 1ère fois, mais là, vu que tu recommences ! ;)

Que ce soit dans l'exemple Outlook ou CDO, je place des images (.jpg) dans le corps du mail et des documents pdf (.pdf) en pièces jointes.

Si tu lis bien, tu verras la différence !

1628357561595.png
 

Dudu2

XLDnaute Barbatruc
tu a regardé au fait ta discussion sur ton usf modal ou pas
Oui j'ai vu ton code. Mais je n'ai pas trouvé qu'il apportait quelque chose de plus au mien, plus simple finalement. Enfin c'est comme ça que je le vois.

a tu exploré un peu les possibilités d’extérioriser outlook ou cdo avec vbs ou bat dynamique
Ça c'est un sujet qui n'est peut-être pas si simple.
D'une part si on désynchronise d'Excel, on n'a plus le résultat (succès ou échec) dans le fil de l'action et il faut monter tout un arsenal pour l'obtenir, d'autre part si y a 1000 mails à envoyer, ne va-t-on pas mettre le PC à genoux en lançant 1000 instances en parallèle en 1 secondes. Alors se pose le problème des limites, de la temporisation. J'en ai mal à la tête d'avance 😨.
D'ailleurs ne serait-ce pas possible de désyncrhoniser avec une exécution lancée avec un Application.OnTime Now, "EnvoiMail" ?
 

patricktoulon

XLDnaute Barbatruc
re
1000 instances de vbs seront toujours!!! et je peux le confirmer sans hésitations que 1000 envoie par vba
sachant que la tache vbs se ferme automatiquement donc tu n'a jamais 1000 instance d'ouvertes 4/5 tout au plus et tu peux même le rendre auto destructible
quand a la main mise d'excel détrompe toi tu peux piloter le vbs a partir de vba mais l'inverse aussi
a partir du vbs en exécution je peux tres bien déclenché une macro du fichier excel par exemple sans problème ;)


D'ailleurs ne serait-ce pas possible de désyncrhoniser avec une exécution lancée avec un Application.OnTime Now, "EnvoiMail" ?
et non justement en vba c'est bien ça le problème quand tu créée un object ici oulook.application tant que c'a n'est pas parti tu ne peux pas faire autre chose et pour peu que tu charge des images ou fichier un peu plus lourds on voit bien que le chargement sur le serveur prend du temps
et c'est valable pour tout createobject(".....")

cela dit on a une api qui est bien pratique c'est l'api settimer
non pas parce quelle programme en différé (d' ailleurs dans ce contexte on mettrais tout au plus 10 mili secondes) mais c'est le fait qu'elle appelle la macro en addressof ;)

et oui en adressof tu peux lancer 50 fois la macro puisqu'a chaque fois il y a un id de l'instance de l'api timer (du timer quoi )
il y aussi les modules classe qui du fait que le mail serait envoyé dans sa propre instance de classe
(1 mail /1 instance de classe)
mais c'est quand même un peu moins rapide

on a testé tout ca avec Robert alias @dysorthographie su DVP y a pas mal d'année deja ;)
le moins contraignant est bien le vbs
et pour peu que tu en fasse souvent le vbs on le garde static(pas dynamique) il sert d'applicatif
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Je veux bien te croire, mais ça dépasse mes compétences. De plus, pour le moment du moins, le problème ne se pose pas pour les gens pour qui j'ai fait ces envois de mails.
Quand je ferai du spam de mails publicitaires, on en reparlera :p.
 

patricktoulon

XLDnaute Barbatruc
Je veux bien te croire, mais ça dépasse mes compétences. De plus, pour le moment du moins, le problème ne se pose pas pour les gens pour qui j'ai fait ces envois de mails.
Quand je ferai du spam de mails publicitaires, on en reparlera :p.
(sans faire de spam)là encore une fois il y a des choses que tu zappe comme pour le userform
non seulement le blocage en cas d'erreur peut être fatal mais aussi la raison de perdre des variables instruite dans vba pour d'autres fonctions
autrement dit un plantage ou l'on devrait tuer une tache ou cliquer sur déboguage te ferait tout perdre même ce qui ne concerne pas la fonction mail (que ce soit outlook ou CDO) à moins de mettre des gestion d'erreur partout pour toute les étapes
si je te le dit c'est que j'en ai bouffé des erreur de port serveur et autre avec CDO
je te ferais un exemple externe simplissime a but école
dans le vbs si erreur ben il fait rien on peut récupérer l'erreur dans un message ou même déclenché une macro du fichier excel commandeur
 

Discussions similaires

Statistiques des forums

Discussions
314 713
Messages
2 112 131
Membres
111 434
dernier inscrit
dellidjk