IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 885
    Points : 3 776
    Points
    3 776
    Par défaut Envoi de mail avec pièce jointe avec la messagerie par défaut de l'utilisateur
    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

    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
    Merci de me dire avec quels clients de messagerie cette class fonctionne
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  2. #2
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 885
    Points : 3 776
    Points
    3 776
    Par défaut
    D'après le créateur original de la class

    Elle a été testée avec Outlook 2002, Outlook Express 6, Mozilla Thunderbird 1.0 et The Blat version 3.

    Moi je l'ai testée avec Outlook 2007

    Et vous sur quels clients de messagerie et quelles versions cette class fonctionne ?
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  3. #3
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 885
    Points : 3 776
    Points
    3 776
    Par défaut
    Ne fonctionne pas avec Foxmail car il ne gère pas MAPI
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Fonctionne avec Thunderbird 3.1.4

  5. #5
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 885
    Points : 3 776
    Points
    3 776
    Par défaut
    Bonjour,

    Il y a une erreur dans mon code

    J'ai mis tcLinéairePrécédent au lieu de tcLinéaire
    dans les codes de TableauCherche des procédures d'ajout de destinataires et de pièces jointes.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Merci !

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    janvier 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : janvier 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Question complémentaire
    Bonjour,

    Savez vous si le texte pourrait être du texte HTML ?
    Savez vous si on pourrait demander un accusé réception ?
    Savez vous si l'on pourrait y joindre une signature ?

    Merci d'avance

  8. #8
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2006
    Messages : 416
    Points : 1 070
    Points
    1 070
    Par défaut
    Merci Mail.spam pour cette contribution !

    Pour ma part, j'utilise la classe "System.net.mail" du framework .net pour envoyer des mails.
    Et pour répondre a API-COMTAT, si MAPI32.dll ne le permet pas, le "System.net.mail" le permet (sauf peux être la signature, je ne suis pas sûr)

    pour avoir une trace dans le logiciel de messagerie, il suffit de se mettre en copie invisible.
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  9. #9
    Membre actif
    Inscrit en
    avril 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 308
    Points : 231
    Points
    231
    Par défaut
    Merci pour la contribution .

    Me reste plus qu'à trouver comment changer de compte pour un envois en directe, dans le cas où l'utilisateur a plusieurs comptes mail sur son Thunderbird.

  10. #10
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 885
    Points : 3 776
    Points
    3 776
    Par défaut
    Citation Envoyé par wimbish Voir le message
    Merci Mail.spam pour cette contribution !

    Pour ma part, j'utilise la classe "System.net.mail" du framework .net pour envoyer des mails.
    Et pour répondre a API-COMTAT, si MAPI32.dll ne le permet pas, le "System.net.mail" le permet (sauf peux être la signature, je ne suis pas sûr)

    pour avoir une trace dans le logiciel de messagerie, il suffit de se mettre en copie invisible.
    Bonjour,

    Peux tu mettre un exemple d'utilisation de la classe "System.net.mail".
    Sinon pour moi l'avantage de mon code c'est que je peux pré-renseigner un mail puis l'ouvrir avec le logiciel de messagerie afin que l'utilisateur puisse faire des changements supplémentaires.

    La copie invisible est toujours un moyen, mais dans ce cas autant utiliser les fonctions de mail de windev.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  11. #11
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2006
    Messages : 416
    Points : 1 070
    Points
    1 070
    Par défaut
    Citation Envoyé par mail.spam Voir le message
    Bonjour,

    Peux tu mettre un exemple d'utilisation de la classe "System.net.mail".
    Sinon pour moi l'avantage de mon code c'est que je peux pré-renseigner un mail puis l'ouvrir avec le logiciel de messagerie afin que l'utilisateur puisse faire des changements supplémentaires.

    La copie invisible est toujours un moyen, mais dans ce cas autant utiliser les fonctions de mail de windev.
    Tu as tout à fait raison et c'est pourquoi je trouvais ta contribution réellement intéressante.
    La seule utilité du system.net.mail est d'avoir accès à plus d'options que les fonctions Windev (pour répondre API-COMTAT)
    Ci dessous un exemple basic d'utilisation du .net pour un envoi simple (pour plus d'option, il faut aller voir la MSDN).

    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
     
    ClientSMTP est un objet SmtpClient dynamique
    mailAuthentication est un NetworkCredential dynamique
    oMailMessage est un MailMessage dynamique
     
    PROCEDURE EmailInitialise(sServeur,nPort,sLogin,sPassword)
    // Client SMTP
    ClientSMTP = allouer un SmtpClient(sServeur,nPort)
    // Objet authentification
    mailAuthentication = allouer un NetworkCredential(sLogin, sPassword)
    ClientSMTP.EnableSsl = Vrai
    ClientSMTP.UseDefaultCredentials = Faux
    ClientSMTP.Credentials = mailAuthentication
     
    PROCEDURE EmailEnvoi(sExpediteur,sDestinataire,sObjet,Contenu)
    // Contenu HTML ?
    oMailMessage.IsBodyHtml = Faux
    // Objet Email
    oMailMessage = allouer un MailMessage(sExpediteur,sDestinataire,sObjet, Contenu)
    // Envoi de l'email
    ClientSMTP.Send(oMailMessage)
    Pour l'accusé de réception, on peut ajouter cela (enfin je crois):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oMailMessage.Headers.Add("Disposition-Notification-To", sExpediteur)
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2011
    Messages : 137
    Points : 104
    Points
    104
    Par défaut
    Merci pour votre contribution, cela m'a été grandement utile !
    Je suis en train de modifier la classe pour permettre de choisir moi même l'expediteur du mail mais cela ne fonctionne pas, il me met systématiquement l’expéditeur par défaut qui est défini sur Thunderbird...

    Ci dessous ce que j'ai modifié:

    Déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	MapiExpediteur est un MapiRecipDesc
    	NomAdresseExp est une chaîne ASCIIZ sur 128
    	AdresseExp est une chaîne ASCIIZ sur 255
    AjouteExpediteur:
    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
     
    PROCEDURE AjouteExpediteur(UneAdresseMail est une chaîne,NomAffiché est une chaîne = "")
     
    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(:TabAdresseExpediteur,tcLinéaire,1,UneAdresseMail) <> -1 ALORS
    		ErreurDéclenche(411,dbgInfo(dbgElément)+ RC + RC + "Erreur : " + RC + "L'adresse '" + UneAdresseMail + "' a déjà été ajouté dans les expéditeurs")
    		RENVOYER Faux
    	FIN
     
    	STypeDest = "0" //SENDER MESSAGE ORIG
     
    	SI PAS TableauAjouteLigne(:TabAdresseExpediteur,UneAdresseMail,NomAffiché = "" ? UneAdresseMail SINON 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
    Affectation tabMapiOrig
    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
     
    		// TEST EXPEDITEUR
    		AdresseExp=:TabAdresseExpediteur[1][1]
    		NomAdresseExp=:TabAdresseExpediteur[1][2] = "" ? :TabAdresseExpediteur[1][1] SINON :TabAdresseExpediteur[1][2]
     
    		//on force "SMTP:" si besoin dans l'adresse
    		SI Position(AdresseExp,"SMTP:")=0 ALORS
    			AdresseExp="SMTP:"+AdresseExp
    		FIN
     
    		MapiExpediteur:ulReserved = 0
    		MapiExpediteur:ulRecipClass = 0 // 0 = orig sender
    		MapiExpediteur:lpszName = NomAdresseExp
    		MapiExpediteur:lpszAddress = AdresseExp
    		MapiExpediteur:ulEIDSize = Null
    		MapiExpediteur:lpEntryID = Null
    Affectation de MapiMessage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MapiMessage:lpOriginator = &MapiExpediteur

    Peut être avez-vous une petite idée ?

  13. #13
    Membre expérimenté
    Inscrit en
    août 2010
    Messages
    714
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 714
    Points : 1 612
    Points
    1 612
    Par défaut
    Bonjour,

    EMailLanceAppli

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2011
    Messages : 137
    Points : 104
    Points
    104
    Par défaut
    Bonjour,

    merci d'avoir répondu par contre je ne l'ai pas précisé mais je suis en Windev 15, du coup pas d'accès à EmailLanceAppli.

    J'avais tenté ceci mais 10% en gros des destinataires ne recevaient pas la pièce jointe:
    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
     
    Email.NbDestinataire = 1
    Email.Destinataire[1] = mailDestinataire
     
    Email.NbCci = 1
    Email.Cci[1] = "xx@xx.fr"
     
    Email.Expéditeur = mailCabFact
    Email.Sujet = titreMail
     
    Email.Attache[1] = lienFact
    Email.NbAttache = 1
     
    EmailImporteHTML(maChaine, "C:\signature\")
     
    SI EmailEnvoieMessage(CodeCollT) = Faux ALORS
    	Erreur(ErreurInfo(errComplet))
    FIN

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 13
    Points : 19
    Points
    19
    Par défaut une petite correction à la classe Cl_Mapi32
    <bonjour,
    je reprends ce vieux fil mais ça m'a bien servi car je cherchais à passer vraiment par la messagerie interne pour envoyer mes devis générés par mon application devis/facturation.

    J'ai donc récupéré la classe grâce à votre contribution.
    Merci donc à ceux qui en sont à l'origine.
    Et cela s'est mis à marcher rapidement SAUF que ma pj s"appelait moz_mapi ou un truc comme ça

    Et cette pièce sans extension correspondait bien à ma pj en pdf si je l'ouvrais avec un viewer PDF.

    J'ai donc repris le code et juste changé cela dans la méthode PrépareMail; un init avec un fextraitchemin car le TabNomPieceJointe était à ""
    ET C'EST TOUT BON !!!
    voir extrait modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // 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]=fExtraitChemin(TabPieceJointe[N_I],fFichier+fExtension)  // remplacé 02/4/2015 par Roumeg
    	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

  16. #16
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2016
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, ça marche nickel de mon côté!

    Logiciel de messagerie testé : Outlook 2013

  17. #17
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2016
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Jusqu'ici je n'ai pu qu'ouvrir des fenêtres d'écriture d'e-mail Outlook 2013 en format d'édition "Texte Brut".


    J'ai réussi à ouvrir Outlook 2013 en format d'édition HTML en utilisant MAPI32, pour cela il faut retirer le contenu du body de la façon suivante (dans la procédure PrépareMail) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //MapiMessage:lpszNoteText = &Body
    MapiMessage:lpszNoteText = ""	//si vide, ouvre en format d'édition HTML

    Bien évidemment, la contrainte que cela ajoute est de ne pas avoir de corps pré-défini pour notre e-mail.

    C'est la seule solution que j'ai pu trouver sur le web, si jamais vous avez des solutions/idées à proposer je suis preneur!

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Caractére inconnu
    Salut tout le monde merci pour cette solution je l'ai testé avec thunderbird et il fonctionne parfaitement. mais j'ai rencontré un problème quand thunderbird récupère le message écrit dans l'application windev il y a tout plein de caractère à l'intérieur c'est très gênant comment je pourrais régler ce problème???
    Merci à tous pour l’éventuel solution

Discussions similaires

  1. Envoi de mails multiples - pièce jointe différente
    Par Niconewrest dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 08/06/2014, 15h35
  2. [AC-2003] Envoi mail à liste de destinataires avec pièce jointe et sans Outlook
    Par philippe.desrues dans le forum VBA Access
    Réponses: 1
    Dernier message: 11/07/2013, 15h35
  3. [XL-2002] Envoi de mails multiples - pièce jointe différente
    Par Phanloga dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 30/04/2011, 10h06
  4. [PHP 5.3] Envoi de mail en texte, html, avec pièces-jointes et images....
    Par rafmos dans le forum Langage
    Réponses: 1
    Dernier message: 06/08/2010, 15h58
  5. Comment envoyer un mail avec pièce jointe avec MAPI ?
    Par scara dans le forum Web & réseau
    Réponses: 0
    Dernier message: 30/12/2007, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo