Bonjour,
Voilà quelques temps que je cherche un moyen d'utiliser le logiciel de messagerie par défaut d'un utilisateur afin d'envoyer un mail avec pièce jointe.
Et enfin ça y est, il existe une DLL MAPI32.dll qui permet de le faire.
C'est sur le site de jcougnaud que j'ai trouvé mon bonheur.
Voici une class qui permet l'envoi de mail avec pièce jointe
Merci à jcougnaud
La class téléchargeable ici est faite en Windev14
Voici son contenu pour les autres versions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Cl_Mapi32 est une classe PRIVÉ // cette classe permet de gérer la préparation de mail pour le logiciel de messagerie par defaut. TabAdresseDestinataire est un tableau de 0 par 3 chaînes // 1 - AdresseMail 2 - Nom destinataire 3 - TypeDestinataire TabFicPieceJointe est tableau de 0 chaînes FIN // Liste des codes erreurs // 403 - adresse mail non valide // 404 - le fichier pièce jointe pas trouvé // 410 - paramètre TypeDestinataire non valide // 411 - adresse déjà présente dans les destinataires // 412 - adresse mail pas ajouter, erreur Windev // 421 - piècejointe déjà présente // 422 - piècejointe pas ajouter, erreur Windev // 431 - pas de destinataire // 432 - erreur chargement DLL // 450 - erreur dans la mise à zero de la classe // 500 et plus - erreur dans l'envoie du message // 501 - message annuler par l'uilisateur donc non envoyé
Code : Sélectionner tout - Visualiser dans une fenêtre à part Procédure Constructeur()
Code : Sélectionner tout - Visualiser dans une fenêtre à part PROCEDURE Destructeur()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 // Résumé : Vérfie si le format de l'adresse mail en paramètre est valide ou non // Syntaxe : //[ <Résultat> = ] AdressMailValide (<UneAdresse> est chaîne) // // Paramètres : // UneAdresse (chaîne) : adresse mail à vérifier // Valeur de retour : // booléen : Vrai si l'adresse est valide, Faux dans le cas contraire - gestion des erreurs avec erreurinfo() //// Exemple : // SI PAS :AdressMailValide(UneAdresseMail) ALORS // Erreur(ErreurInfo(errMessage)) // FIN // PROCEDURE AdressMailValide(UneAdresse est une chaîne) SI VérifieExpressionRégulière(UneAdresse, "[-.a-z0-9]+[@][-.a-z0-9]+[.][a-z]{2,4}") ALORS RENVOYER Vrai SINON ErreurDéclenche(403,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "L'adresse '" + UneAdresse + "' n'est pas valide") RENVOYER Faux FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 // Résumé : Ajoute un destinataire à la liste des destinataires en vue de l'utiliser dans PrépareMail // Syntaxe : //[ <Résultat> = ] AjouteDestinataire (<UneAdresseMail> est chaîne [, <NomAffiché> est chaîne [, <TypeDestinatire> est chaîne]]) // // Paramètres : // UneAdresseMail (chaîne) : adresse mail à ajouter // NomAffiché (chaîne - valeur par défaut="") : Nom affiché dans la messagerie par défaut en plus de l'adresse mail // TypeDestinatire (chaîne - valeur par défaut="A") : "A" ou "Cc" ou "Cci" // Valeur de retour : // booléen : Vrai si le destinataire est ajouté, Faux dans le cas contraire - gestion des erreurs avec erreurinfo() //// Exemple : // SI PAS :AjouteDestinataire("mail.spam@fourniseur.fr") // Erreur(ErreurInfo(errMessage)) // RETOUR // FIN PROCEDURE AjouteDestinataire(UneAdresseMail est une chaîne,NomAffiché est une chaîne = "",TypeDestinatire est une chaîne = "A") LOCAL STypeDest est une chaîne // on vérifie si le format de l'adresse est valide SI PAS :AdressMailValide(UneAdresseMail) ALORS ErreurDéclenche(ErreurInfo(errCode),ErreurInfo(errMessage)) RENVOYER Faux SINON // on vérifie si l'adresse ne figure pas déjà dans une des trois tableau SI TableauCherche(:TabAdresseDestinataire,tcLinéairePrécédent,1,UneAdresseMail) <> -1 ALORS ErreurDéclenche(411,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "L'adresse '" + UneAdresseMail + "' a déjà été ajouté dans les destinataires") RENVOYER Faux FIN // on ajoute l'adresse à la liste d'adresse suivant le type de destinataire SELON TypeDestinatire CAS "A" STypeDest = "1" CAS "Cc" STypeDest = "2" CAS "Cci" STypeDest = "3" AUTRE CAS ErreurDéclenche(410,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Le paramètre TypeDestinataire ne peut être que ""A"" , ""Cc"" ou ""Cci""") RENVOYER Faux FIN SI PAS TableauAjouteLigne(:TabAdresseDestinataire,UneAdresseMail,NomAffiché,STypeDest) ALORS ErreurDéclenche(412,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "L'adresse '" + UneAdresseMail + "' n'as pas pu être ajouté." + RC +ErreurInfo(errMessage)) RENVOYER Faux SINON RENVOYER Vrai FIN FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 // Résumé : Ajoute un fichier à la liste des pièces jointes en vue de l'utiliser dans PrépareMail // Syntaxe : //[ <Résultat> = ] AjoutePiècejointe (<UnFichier> est chaîne) // // Paramètres : // UnFichier (chaîne) : Chemin complet du fichier à ajouter // Valeur de retour : // booléen : Vrai si le fichier est ajouté, Faux dans le cas contraire - gestion des erreurs avec erreurinfo() //// Exemple : // Indiquez ici un exemple d'utilisation. // SI PAS :AjoutePiècejointe("D:\Fichier.txt") ALORS // Erreur(ErreurInfo(errMessage)) // RETOUR // FIN // PROCEDURE AjoutePiècejointe(UnFichier est une chaîne) // on vérifie si le fichier existe SI PAS fFichierExiste(UnFichier) ALORS ErreurDéclenche(404,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "La pièce jointe '" + UnFichier + "' n'a pas été trouvée") RENVOYER Faux SINON // on verifie que le fichier n'est pas déjà dans les pièces jointes SI TableauCherche(:TabFicPieceJointe,tcLinéairePrécédent,UnFichier) <> -1 ALORS ErreurDéclenche(421,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Le fichier '" + UnFichier + "' a déjà été ajouté dans les pièces jointes") RENVOYER Faux SINON // on l'ajoute à la liste SI PAS TableauAjouteLigne(:TabFicPieceJointe,UnFichier) ALORS ErreurDéclenche(422,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Le fichier '" + UnFichier + "' n'as pas pu être ajouté aux pièces jointes." + RC +ErreurInfo(errMessage)) RENVOYER Faux SINON RENVOYER Vrai FIN FIN FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 // Résumé : Prépare le mail pour l'afficher dans le client de messagerie par défaut ou pour l'envoyer directement // Syntaxe : //[ <Résultat> = ] PrépareMail (<ObjetMail> est chaîne, <CorpsMail> est chaîne [, <EnvoiDirecte> est booléen [, <AvecAccusé> est booléen]]) // // Paramètres : // ObjetMail (chaîne) : Objet du message // CorpsMail (chaîne) : Contenue du message // EnvoiDirecte (booléen - valeur par défaut=0) : Vrai si on envoie le mail sinon on affiche le client de messagerie // AvecAccusé (booléen - valeur par défaut=0) : <indiquez ici le rôle de AvecAccusé> // Valeur de retour : // booléen : //// Exemple : // SI PAS :PrépareMail("Objet du message",Texte_RTF) ALORS // SI ErreurInfo(errCode) = 501 ALORS // Info("L'utilisateur a annulé l'envoie") // SINON // Erreur(dbgInfo(dbgLigne),ErreurInfo(errMessage)) // FIN // FIN // PROCEDURE PrépareMail(ObjetMail est une chaîne,CorpsMail est une chaîne,EnvoiDirecte est un booléen = Faux,AvecAccusé est un booléen = Faux) LOCAL Sujet est une chaîne ASCIIZ sur 128 Body est une chaîne ASCIIZ sur 1000 MAPI_LOGIN_UI est un entier MAPI_TO est un entier N_I est un entier // compteur hdlLib est un entier hRes est un entier // définition des structures MapiMessage est une structure ulReserved est un entier lpszSubject est un entier lpszNoteText est un entier lpszMessageTyp est un entier lpszDateReceived est un entier lpszConversationID est un entier flFlags est un entier lpOriginator est un entier nRecipCount est un entier lpRecips est un entier nFileCount est un entier lpFiles est un entier FIN MapiFileDesc est une structure ulReserved est un entier flFlags est un entier nPosition est un entier lpszPathName est un entier lpszFileName est un entier lpFileType est un entier FIN MapiRecipDesc est une structure ulReserved est un entier ulRecipClass est un entier lpszName est un entier lpszAddress est un entier ulEIDSize est un entier lpEntryID est un entier FIN MapiMessage est une MapiMessage tabMapiFileDesc est un tableau de TableauOccurrence(:TabFicPieceJointe) MapiFileDesc tabMapiRecipDesc est un tableau de TableauOccurrence(:TabAdresseDestinataire) MapiRecipDesc TabPieceJointe est un tableau de TableauOccurrence(:TabFicPieceJointe) chaîne ASCIIZ sur 255 TabNomPieceJointe est un tableau de TableauOccurrence(:TabFicPieceJointe) chaîne ASCIIZ sur 255 TabNomAdresse est un tableau de TableauOccurrence(:TabAdresseDestinataire) chaîne ASCIIZ sur 128 TabAdresse est un tableau de TableauOccurrence(:TabAdresseDestinataire) chaîne ASCIIZ sur 255 // si pas de destinataire on renvoie Faux SI TableauOccurrence(:TabAdresseDestinataire) =0 ALORS ErreurDéclenche(431,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Il n'y as aucun destinanatire") RENVOYER Faux FIN // On met à jour la structure des destinataires à partir du tableau dynamique POUR N_I = 1 _A_ TableauOccurrence(:TabAdresseDestinataire) // on prend l'adresse du destinataire TabAdresse[N_I]=:TabAdresseDestinataire[N_I][1] TabNomAdresse[N_I]=:TabAdresseDestinataire[N_I][2] = "" ? :TabAdresseDestinataire[N_I][1] SINON :TabAdresseDestinataire[N_I][2] MAPI_TO=Val(:TabAdresseDestinataire[N_I][3]) // on force "SMTP:" si besoin dans l'adresse SI Position(TabAdresse[N_I],"SMTP:")=0 ALORS TabAdresse[N_I]="SMTP:"+TabAdresse[N_I] FIN tabMapiRecipDesc[N_I]:ulReserved = 0 tabMapiRecipDesc[N_I]:ulRecipClass = MAPI_TO tabMapiRecipDesc[N_I]:lpszName = &TabNomAdresse[N_I] tabMapiRecipDesc[N_I]:lpszAddress = &TabAdresse[N_I] tabMapiRecipDesc[N_I]:ulEIDSize = Null tabMapiRecipDesc[N_I]:lpEntryID = Null FIN // on met à jour la structure des pièces jointes à partir du tableau dynamique POUR N_I=1 _A_ TableauOccurrence(:TabFicPieceJointe) TabPieceJointe[N_I]=:TabFicPieceJointe[N_I] TabNomPieceJointe[N_I]="" tabMapiFileDesc[N_I]:ulReserved = Null tabMapiFileDesc[N_I]:flFlags = 0 tabMapiFileDesc[N_I]:nPosition = 0xFFFFFFFF tabMapiFileDesc[N_I]:lpszPathName = &TabPieceJointe[N_I] tabMapiFileDesc[N_I]:lpszFileName = &TabNomPieceJointe[N_I] tabMapiFileDesc[N_I]:lpFileType = Null FIN // on affecte l'objet et le corps Sujet=ObjetMail Body=CorpsMail // on regarde si on doit ouvrir le client de messagerie ou non SI EnvoiDirecte ALORS MAPI_LOGIN_UI=1 // on envoi directement SINON MAPI_LOGIN_UI=8 // on ouvre le client de messagerie FIN // chargement de la librairie Mapi32.dll hdlLib = AppelDLL32("Kernel32","LoadLibraryA","MAPI32.dll") SI hdlLib<32 ALORS ErreurDéclenche(432,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Impossible de charger MAPI32.DLL" + RC + ErreurInfo(errMessage)) RENVOYER Faux FIN SI TableauOccurrence(TabFicPieceJointe) > 0 ALORS // on a des pièces jointes MapiMessage:nFileCount = TableauOccurrence(tabMapiFileDesc) MapiMessage:lpFiles = &tabMapiFileDesc SINON // on n'en a pas MapiMessage:nFileCount = 0 MapiMessage:lpFiles = Null FIN // on affecte la structure du message MapiMessage:ulReserved = 0 MapiMessage:lpszSubject = &Sujet MapiMessage:lpszNoteText = &Body MapiMessage:lpszMessageTyp = Null MapiMessage:lpszDateReceived = Null MapiMessage:lpszConversationID = Null SI AvecAccusé ALORS MapiMessage:flFlags = 2 SINON MapiMessage:flFlags = 0 FIN MapiMessage:lpOriginator = Null MapiMessage:nRecipCount = TableauOccurrence(tabMapiRecipDesc) MapiMessage:lpRecips = &tabMapiRecipDesc hRes = AppelDLL32("MAPI32.DLL","MAPISendMail",Null,Handle(),&MapiMessage,MAPI_LOGIN_UI,Null) SI hRes<> 0 ALORS // il y a eu un problème Temporisation(50) SELON hRes CAS 1 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "L'envoi a été annulé par l'utilisateur.") CAS 2 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Erreurs inattendues.") CAS 3 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Il n'y a pas de compte par défaut ou la connexion n'a pas été valide.") CAS 4 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Disque plein.") CAS 5 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Pas assez de mémoire.") CAS 9 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Il y a trop de pièces jointes.") CAS 10 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Il y a trop de destinataires.") CAS 11 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "La pièce jointe n'a pas été trouvée.") CAS 12 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "La pièce jointe n'a pas pu être ouverte.") CAS 14 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Destinataire inconnu.") CAS 15 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Le type de destinataire n'est pas Mapi_To, Mapi_Cc, Mapi_Bcc.") CAS 17 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Message invalide.") CAS 18 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Le texte du message est trop long.") CAS 21 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Destinataire ambigu.") CAS 25 ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "Destinataire invalide ou n'a pas d'adresse.") AUTRES CAS ErreurDéclenche(500 + hRes,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + ErreurInfo(errMessageSystème)) FIN SI hdlLib>0 ALORS AppelDLL32("Kernel32","FreeLibrary",hdlLib) hdlLib = 0 FIN RENVOYER Faux SINON SI hdlLib>0 ALORS AppelDLL32("Kernel32","FreeLibrary",hdlLib) hdlLib = 0 FIN RENVOYER Vrai FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 // Résumé : Remet a vide tous les destinataires et les pièces jointes // Syntaxe : //[ <Résultat> = ] RAZ_Cl_Mapi32 () // // Paramètres : // Aucun // Valeur de retour : // booléen : // Aucune //// Exemple : // Indiquez ici un exemple d'utilisation. // PROCEDURE RAZ_Cl_Mapi32() TableauSupprimeTout(:TabAdresseDestinataire) SI ErreurDétectée ALORS ErreurDéclenche(450,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + ErreurInfo(errMessage)) RENVOYER Faux FIN TableauSupprimeTout(:TabFicPieceJointe) SI ErreurDétectée ALORS ErreurDéclenche(450,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + ErreurInfo(errMessage)) RENVOYER Faux FIN RENVOYER Vrai
Et voici un exemple d'envoie de mail avec destinataire et pièce jointe
Merci de me dire avec quels clients de messagerie cette class fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 UnMail est Cl_Mapi32 SI PAS UnMail:AjouteDestinataire("mail.spam@voila.fr") ALORS Erreur(ErreurInfo(errMessage)) RETOUR FIN SI PAS UnMail:AjouteDestinataire("nom.prenom@fournisseur.fr","Destinaitre","Cc") ALORS Erreur(ErreurInfo(errMessage)) RETOUR FIN SI PAS UnMail:AjoutePiècejointe("D:\prof729b.txt") ALORS Erreur(ErreurInfo(errMessage)) RETOUR FIN SI PAS UnMail:PrépareMail("Objet du message","Texte dans le corps du message") ALORS SI ErreurInfo(errCode) = 501 ALORS Trace("Pas envoyé") SINON Erreur(dbgInfo(dbgLigne),ErreurInfo(errMessage)) FIN FIN SI PAS UnMail:RAZ_Cl_Mapi32() ALORS Erreur(dbgInfo(dbgLigne),ErreurInfo(errMessage)) FIN
Partager