EXCEL VBA génère des messages Outlook illisibles chez les destinataires

cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009 - 25 juin 2009 à 10:56
cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009 - 25 juin 2009 à 18:08
Bonjour,

Je viens de m’inscrire sur votre forum afin de trouver réponse à un problème qui me fait m’arracher mes cheveux (et il n’y en a déjà plus beaucoup) :

Je suis sous EXCEL 2002 et Outlook 2002, VBA 6.

J’ai une procédure EXCEL qui génère, par Outlook.Application, etc., un courriel prérempli avec adresse du destinataire, un titre, texte et une pièce jointe.

A la fin, je n’envoie pas le message mais je me contente de l’afficher (Message.Display).
Ainsi, je peux encore ajouter quelque chose au texte avant envoi.

Cela fonctionne impec, sauf que chez mes destinataires le message est illisible !

Le sujet du message commence par =?Windows-1252?Q?, dans le texte toutes les minuscules accentuées sont remplacées par des =avec leur code, etc.

J’ai compris qu’il s’agit d’un problème d’encodage mais je n’arrive pas à le résoudre.
Je précise que lorsque je saisis un courriel de toute pièce sous Outlook 2002 directement, tout fonctionne très bien. J’ai plusieurs adresses de messagerie et je peux réaliser un envoi à travers plusieurs fournisseurs d’accès, cela ne change rien.

C’est donc bien le message généré depuis VBA qui pose problème.
Je n’ai pas trouvé un moyen de forcer un encodage via VB.
J’ai déjà essayé de modifier la base de registre et d’ajouter, sous HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Outlook\Options\Mail, une Dword avec 0 (IntelligentCoding) ou 2 (Base64), mais rien n’y fait.

Le pire, c’est que certains envois arrivent correctement (mais c’est plutôt rare).
Auriez-vous une idée ? Existe-il une option par le biais duquel on peut forcer un encodage UTF-8 (c’est visiblement ce qu’il faut) ? Je n’ai pas la moindre idée d’où il sort l’encodage Windows-1252 qui, d’après ce que j’y pu comprendre, est obsolète.

Actuellement, je fonctionne avec le code suivant
(j’ai laissé en commentaire des variantes que j’ai également essayé, genre CreateObject au lieu de GetObject, mais pour autant que je sache le problème ne se trouve pas là) :

Je vous remercie par avance pour vos lumières !


Dim ServOutlook As Outlook.Application
Dim Message As Outlook.MailItem
'appel de la fonction
Set ServOutlook = GetObject("", "Outlook.Application")
' Set ServOutlook = New Outlook.Application
Set Message = ServOutlook.Createitem(olMailItem)
' Set ServOutlook = CreateObject("outlook.Application")
' Set Message = ServOutlook.Createitem(0)

Message.To = Destinataire
Message.Subject = SujetMessage
Message.body = TexteMessage
‘ Message.HTMLBody = TexteMessage

fichierPDF = Cells(2, 2)
On Error Resume Next
Message.ATTACHMENTS.Add (fichierPDF)
If Err <> 0 Then
MsgBox "Le fichier PDF " & fichierPDF & " est introuvable." & vbCrLf & _
"Le message ne sera pas envoyé."
Set ServOutlook = Nothing
Exit Sub
End If
On Error GoTo 0
Message.Display
Set ServOutlook = Nothing

On ne sait que ce que l'on pratique (Montesquieu)

8 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 juin 2009 à 12:20
Salut
Merci de ne pas utilisé Opera comme navigateur car les retours à la ligne ne sont pas standards et rendent les messages très difficiles à lire (peut en rebuter plus d'un, moi le premier, et t'enlever des chances d'avoir des réponses)

Je n'y connais pas grand chose en norme, mais voici mes idées :
- Le format HTML a surement plus de chance de passer, à condition d'encoder les caractères accentués selon la norme HTML
  Voir ce <code> pour URLEncode
- As-tu recherché "UTF-8" parmi les codes du site ? il y a un exemple http://www.vbfrance.com/codes/ENCODER-URL-UTF8-DEPUIS-WORD_46108.aspx

Sinon, dans la mesure où tu dimensionnes proprement ton objet ServOutlook, mieux vaut utiliser "Set = New" que le "GetObject" ou "CreateObject" réservé aux définitions tardives (et à éviter tant que faire se peut).

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 12:49
Merci Jack pour cette réponse rapide !

Je n'utilise pas Opéra comme navigateur mais IE8 !
Cette remarque de ta part me donne une idée d'ailleurs. J'ai installé IE8 très récemment.
Et j'avais déjà testé ma solution d'envoi de mails auparavant et je n'avais eu aucun problème de ce genre. Y aurait-il un lien avec le remplacement d'IE7 (que j'utilisais avant) par IE8 ?

J'appliquerai ton conseil d'utiliser "Set = New", justement je ne suis pas très au fait avec le modèle Objet de VBA (J'ai été développeur, mais à l'époque le langage s'appelait COBOL...).

Ceci dit, je ne vois pas bien les différences entre ces différentes instructions et de toute manière cela n'a rien changé.

Je viens de trouver une propriété de l'objet Outlook.MailItem permettant de forcer la page de code :
.InternetCodepage = 28591.

Moyennant ceci, je constate que le mail envoyé a bien été encodé avec la page Europe occidentale (ISO) au lieu de Europe occidentale (Windows). L'option est donc prise en compte mais le mail chez le destinataire reste toujours aussi illisible, sauf que le sujet commence maintenant par "=?iso-8859-1?Q?" au lieu de "=?Windows-1252?Q?". Ça me fait une belle jambe !

J'ai l'impression que ce n'est même pas un problème de type d'encodage. J'ai regardé le code concernant UTF-8 mais je ne crois pas trop que la solution se trouve dans cette direction.

J'ai aussi joué avec les Options Internationales par défaut dans Outlook pour l'encodage des messages sortants : le changement est bien pris en compte et le résultat est... ..le même !

Je sèche ! Surtout que cela a fonctionné pendant mes premiers tests et que, même ce matin, j'ai eu UN message qui passait, et pas les autres !

Pire : chez moi, dans mes messages envoyés, tout est affiché correctement !

La seule retouche que j'ai faite dans mon code est de prendre soin de bien fermer l'objet
Outlook.MailItem par un Set Message = Nothing.

Mais c'est pareil, rien n'a changé.


On ne sait que ce que l'on pratique (Montesquieu)
0
cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 13:48
Je viens d'identifier le problème mais je n'ai pas encore la solution :

Le problème est causé par les minuscules accentuées présentes dans le sujet et le texte du message !

Le sujet et le texte du message proviennent de cellules EXCEL que j'insère de la façon suivante :
Dim SujetMessage As String
Dim TexteMessage As String
If Cells(5, Cellule_cible.Column) <> "" Then
SujetMessage = Cells(5, Cellule_cible.Column) & vbCrLf & vbCrLf
Else
MsgBox "Il manque le sujet du message !" & vbCrLf & vbCrLf
Exit Sub
End If
Message.Subject = SujetMessage
Message.body = TexteMessage

Si je garde le sujet et le texte tel quel mais que je resaisis, dans la fenêtre d'Outlook ces minuscules accentuées en les remplaçant par exactement les mêmes, ça passe !
Si je laisse les minuscules en provenance des cellules d'EXCEL, j'ai l'erreur.

Alors là !
Je n'ai plus le temps de regarder ça plus en détail pour le moment, mais je reprendrai la recherche en fin d'aprèm.


On ne sait que ce que l'on pratique (Montesquieu)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 juin 2009 à 17:26
Re
A mon avis, nulle n'est besoin de toucher à Outlook lui-même.
Regarde du côté des chaines de caractère ANSI <--> Unicode (DBCS, StrConv, ChrW).
A mon avis, si tu fournissais le contenu du corps de message directement, sans passer par une chaine TexteMessage As String, cela fonctionnerait.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 17:31
Je veux bien : Mais comment je fais ça, sachant que le texte se trouve dans des cellules EXCEL ?



On ne sait que ce que l'on pratique (Montesquieu)
0
cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 17:37
Ça devient intéressant !
Effectivement, en mettant directement une instruction du style
Message.Body = "abcéééç'jkfglijrg, fsdçôdjndj,d"
ça passe !

Mon souci est que mon message n'est pas statique :
Il concatène le contenu de plusieurs cellules EXCEL qui, de plus, sont modifiables à la main !

Et un moment donné, ça a fonctionné.
D'ailleurs, dans Mes éléments envoyés, tous les messages s'affichent correctement.




On ne sait que ce que l'on pratique (Montesquieu)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 juin 2009 à 18:01
Bah ...
   Message.Body = Cells(maLigne, maColonne).Value
Tu mets là, la suite d'instructions que tu as utilisé pour renseigner TexteMessage
Si tu dois passer par une variable, il faudra utiliser des tableaux de Bytes (caractères codés sur 2 bytes)
Faut faire des recherches là dessus (ANSI, Unicode, Forms2 ...)
0
cs_Frutchy Messages postés 6 Date d'inscription jeudi 25 juin 2009 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 18:08
Merci Jack,

J'ai commencé à éliminer les variables intermédiaires mais le problème reste.
En fait, mon texte se construit ainsi :
Message.Body = Cells(7, Cellule_cible.Column).Value & " " & _
Sheets("Textes").Cells(9, 12).Value & "," & vbCrLf & vbCrLf & _
Texte1 & Texte2 & Texte3 & _
Politesse & Signature
dans lequel Texte1, Politesse, etc. s'alimentent comme suit :
Texte1 = Cells(8, Cellule_cible.Column).Value
etc.

Le problème serait donc lié à une mauvaise transcription du contenu des variables. Je rève...
Je te jure que ça a fonctionné avec ce code !


On ne sait que ce que l'on pratique (Montesquieu)
0
Rejoignez-nous