Soyez le premier à donner votre avis sur cette source.
Snippet vu 6 101 fois - Téléchargée 20 fois
Option Explicit 'Auteur Florent Bénetière : tnerolf@lekod.com 'Cette classe d'objet a pour but de gérer la création, l'envoi et le rangement de messages au format HTML 'Bibliothèques nécessaires 'Library Office ' [Chemin vers Program Files]\Fichiers communs\Microsoft Shared\[Version du Pack Office]\MSO.DLL ' Microsoft Office [Version du Pack Office] Object Library 'API Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Ootlook As New Outlook.Application Private Racine As Namespace 'Haut de la hiérarchie d'Outlook Private Profil As String Private Mdp As String Private ID As String 'Pour éventuellement retrouver le message et le déplacer vers un dossier Outlook une fois celui-ci envoyé 'Le mail Private Courriel As Outlook.MailItem Public From As String 'From peut être renseigné soit par l'alias d'un compte, soit par son adresse si l'on ne veut pas le compte d'envoi par défaut. 'Les destinataires Private Tbl_To() As String Private Tbl_Cc() As String Private Tbl_Cci() As String 'Les pièces jointes Private Tbl_PJ() As String Private Tbl_Img_incrust() As String 'Tbl_Img_incrust est de structure [Chemin vers le fichier][Code HTML d'insertion de l'image][x] 'Le sujet Public Sujet As String 'Le corps HTML du message Public HTML As String Public Sub Associe_profil(Nom As String) Profil = Nom If Len(Profil) > 0 And Len(Mdp) > 0 Then Lance_Outlook End Sub Public Sub Associe_Mot_de_passe(Valeur As String) Mdp = Valeur If Len(Profil) > 0 And Len(Mdp) > 0 Then Lance_Outlook End Sub Property Let Importance(Urgence As String) Dim Priorite As Byte 'Urgence peut être 'Basse, Normale, Haute If Urgence = "Basse" Then Priorite = olImportanceLow ElseIf Urgence = "Haute" Then Priorite = olImportanceHigh Else Priorite = olImportanceNormal End If Courriel.Importance = Priorite End Property Private Sub Class_Initialize() 'On initialise les tableaux 'Les messages ReDim Tbl_Courriel(0) 'Les destinataires ReDim Tbl_To(0) ReDim Tbl_Cc(0) ReDim Tbl_Cci(0) 'Les pièces jointes ReDim Tbl_PJ(0) 'Les images incrustées ReDim Tbl_Img_incrust(1, 0) 'Le message Set Courriel = Ootlook.CreateItem(olMailItem) 'L'ID du message ID = Creer_nom_aleatoire() End Sub Private Sub Supprimer_ligne_Tbl(Quel_tableau As String, Valeur As String) 'Cette procédure supprime la ligne du tableau Quel_tableau contenant la valeur Valeur 'Passer "Tout" comme Valeur pour vider entièrement le tableau Quel_tableau Dim Tableau As Variant, a As Integer, Taille As Integer Dim Pointeur As String, PJ As Attachment Dim Regle As New RegExp Select Case Quel_tableau Case "To" Tableau = Tbl_To Case "Cc" Tableau = Tbl_Cc Case "Cci" Tableau = Tbl_Cci Case "PJ" Tableau = Tbl_PJ Case "Image" Tableau = Tbl_Img_incrust End Select If Quel_tableau = "Image" Then Taille = UBound(Tableau, 2) Else Taille = UBound(Tableau) End If With Courriel For a = 0 To Taille If Quel_tableau = "Image" Then Pointeur = Tableau(0, a) Else Pointeur = Tableau(a) End If If (Pointeur Like "*" & Valeur & "*" Or Valeur = "Tout") And _ Len(Pointeur) > 0 Then Select Case Quel_tableau Case "To", "Cc", "Cci" 'On est obligé de faire appel à une expression r&égulière 'car la dernière adresse de la liste n'a plus son ";" With Regle .Global = True .IgnoreCase = True .Pattern = Pointeur & ";?" If Quel_tableau = "To" Then Courriel.To = .Replace(Courriel.To, vbNullString) ElseIf Quel_tableau = "Cc" Then Courriel.Cc = .Replace(Courriel.Cc, vbNullString) Else Courriel.BCC = .Replace(Courriel.BCC, vbNullString) End If Tableau(a) = vbNullString If Valeur <> "Tout" Then Exit For End With Case "PJ", "Image" If Quel_tableau = "Image" Then 'S'il s'agit d'une incrustation on supprime le code HTML pointant vers l'image incrustée With Regle .IgnoreCase = True .Global = True .Pattern = "<img[^>]+src=""" & Valeur & """[^>]+>" HTML = .Replace(HTML, vbNullString) Courriel.HTMLBody = HTML End With End If For Each PJ In .Attachments If Pointeur Like "*" & PJ.Filename & "*" Then .Attachments.Remove PJ.Index Exit For End If Next PJ If Quel_tableau = "Image" Then Tableau(0, a) = vbNullString: Tableau(1, a) = vbNullString Else Tableau(a) = vbNullString End If If Valeur <> "Tout" Then Exit For End Select End If Next a End With 'On met à jour le tableau cible Select Case Quel_tableau Case "To" Tbl_To = Tableau Case "Cc" Tbl_Cc = Tableau Case "Cci" Tbl_Cci = Tableau Case "PJ" Tbl_PJ = Tableau Case "Image" Tbl_Img_incrust = Tableau End Select End Sub Public Sub Suppr_To(Adresse As Variant) 'Passer "Tout" pour supprimer tous les To Dim Ligne As Variant If IsArray(Adresse) Then For Each Ligne In Adresse Supprimer_ligne_Tbl "To", CStr(Ligne) Next Ligne Else Supprimer_ligne_Tbl "To", CStr(Adresse) End If End Sub Public Sub Suppr_Cc(Adresse As Variant) 'Passer "Tout" pour supprimer tous les Cc Dim Ligne As Variant If IsArray(Adresse) Then For Each Ligne In Adresse Supprimer_ligne_Tbl "Cc", CStr(Ligne) Next Ligne Else Supprimer_ligne_Tbl "Cc", CStr(Adresse) End If End Sub Public Sub Suppr_Cci(Adresse As Variant) 'Passer "Tout" pour supprimer tous les Cci Dim Ligne As Variant If IsArray(Adresse) Then For Each Ligne In Adresse Supprimer_ligne_Tbl "Cci", CStr(Ligne) Next Ligne Else Supprimer_ligne_Tbl "Cci", CStr(Adresse) End If End Sub Public Sub Suppr_PJ(Nom_fichier As Variant) 'Mettre uniquement le nom du fichier, pas le chemin complet 'Passer "Tout" pour supprimer toutes les pièces jointes Dim Ligne As Variant If IsArray(Nom_fichier) Then For Each Ligne In Nom_fichier Supprimer_ligne_Tbl "PJ", CStr(Ligne) Next Ligne Else Supprimer_ligne_Tbl "PJ", CStr(Nom_fichier) End If End Sub Public Sub Suppr_Incrustation(Image As Variant) 'Mettre uniquement le nom du fichier, pas le chemin complet 'Passer "Tout" pour supprimer toutes les images incrustées Dim Ligne As Variant If IsArray(Image) Then For Each Ligne In Image Supprimer_ligne_Tbl "Image", CStr(Ligne) Next Ligne Else Supprimer_ligne_Tbl "Image", CStr(Image) End If End Sub Public Sub Ajoute_To(Destinataires As Variant) Dim Ligne As Variant If IsArray(Destinataires) Then For Each Ligne In Destinataires Tbl_To(UBound(Tbl_To)) = Ligne ReDim Preserve Tbl_To(UBound(Tbl_To) + 1) Next Ligne Else Tbl_To(UBound(Tbl_To)) = Destinataires ReDim Preserve Tbl_To(UBound(Tbl_To) + 1) End If End Sub Public Sub Ajoute_Cc(Destinataires As Variant) Dim Ligne As Variant If IsArray(Destinataires) Then For Each Ligne In Destinataires Tbl_Cc(UBound(Tbl_Cc)) = Ligne ReDim Preserve Tbl_Cc(UBound(Tbl_Cc) + 1) Next Ligne Else Tbl_Cc(UBound(Tbl_Cc)) = Destinataires ReDim Preserve Tbl_Cc(UBound(Tbl_Cc) + 1) End If End Sub Public Sub Ajoute_Cci(Destinataires As Variant) Dim Ligne As Variant If IsArray(Destinataires) Then For Each Ligne In Destinataires Tbl_Cci(UBound(Tbl_Cci)) = Ligne ReDim Preserve Tbl_Cci(UBound(Tbl_Cci) + 1) Next Ligne Else Tbl_Cci(UBound(Tbl_Cci)) = Destinataires ReDim Preserve Tbl_Cci(UBound(Tbl_Cci) + 1) End If End Sub Public Sub Ajoute_PJ(Pieces As Variant) 'On ajoute une pièce jointe si et seulement si elle ne l'a pas été au préalable Dim Ligne0 As Variant, Ligne1 As Variant, Drapeau_existe As Boolean If IsArray(Pieces) Then For Each Ligne0 In Pieces For Each Ligne1 In Tbl_PJ If Ligne0 = Ligne1 Then Drapeau_existe = True Exit For End If Next Ligne1 If Not Drapeau_existe Then Tbl_PJ(UBound(Tbl_PJ)) = Ligne0 ReDim Preserve Tbl_PJ(UBound(Tbl_PJ) + 1) Courriel.Attachments.Add Ligne0 End If Drapeau_existe = False Next Ligne0 Else For Each Ligne0 In Tbl_PJ If Ligne0 = Pieces Then Drapeau_existe = True Exit For End If Next Ligne0 If Not Drapeau_existe Then Tbl_PJ(UBound(Tbl_PJ)) = Pieces ReDim Preserve Tbl_PJ(UBound(Tbl_PJ) + 1) Courriel.Attachments.Add Pieces End If End If End Sub Public Sub Ajoute_Image(Chemin_Images As String, Optional Infobulle As String = vbNullString, _ Optional Alignement As String = "baseline", Optional Epaisseur_Bordure As Byte = 0, _ Optional PJ_Image_visible As Boolean = True, Optional Hauteur As String, Optional Largeur As String) 'On ajoute une image si et seulement si elle ne l'a pas été au préalable 'On renseigne Tbl_Img_incrust en conséquence '*************************************************************************************************** '* POUR QUE L'IMAGE SOIT BIEN VISIBLE SUR DES MESSAGERIES AUTRE QU'OUTLOOK * '* Il faut absolument, en aval, si cette fonction est appelée pour joindre le fichier image * '* et après la récupération du code de l'image ajouter les lignes suivante pour qu'Outlook compile * '* correctement le message * '* * '* Message.Display * '* Message.BodyFormat = olFormatHTML * '* Message.HTMLBody = HTML * '*************************************************************************************************** Dim a As Byte, Taille As Byte, Drapeau_existe As Boolean, Nom_image As String Dim Nombre_attachements As Byte Taille = UBound(Tbl_Img_incrust, 2) For a = 0 To Taille If Chemin_Images = Tbl_Img_incrust(0, a) Then Drapeau_existe = True Exit For End If Next a If Not Drapeau_existe Then Nom_image = Mid(Chemin_Images, InStrRev(Chemin_Images, "\") + 1) Nombre_attachements = Courriel.Attachments.Count Courriel.Attachments.Add Chemin_Images, olByValue, IIf(PJ_Image_visible, 88888888, 0), Nom_image ' 'IIf(PJ_Image_visible, 88888888, 0) ' 'Si PJ_Image_visible est vrai, on met la position du fichier joint dans le message à la fin de ce dernier ' 'Cela explique la position 88888888 ' 'Si ce nombre est élevé, c'est pour être certain que le fichier soit joint après le contenu HTML du message. ' 'En effet, si ce n'est pas le cas, certaines messageries, comme, par exemple, les Black Berry, ne voient pas l'image s'afficher du premier coup. ' 'De plus, le fait de mettre le contenu des pièces jointes en fin de message est conforme aux normes d'élaboration ' 'de ces derniers qui veut que la partie encodée en hexadécimale des pièces jointes se trouvent après le corps du message. ' ' 'Si PJ_Image_visible=Faux, La pièce jointe ne sera pas affichée dans le champ "Pièce jointe" du message. ' 'Tant que l'image n'est pas jointe au message, on boucle While Nombre_attachements = Courriel.Attachments.Count DoEvents Wend Tbl_Img_incrust(0, Taille) = Chemin_Images Tbl_Img_incrust(1, Taille) = "<img alt=""" & Infobulle & """ hspace=0 src=""" & Nom_image & """ align=""" & _ Alignement & """ border=""" & Epaisseur_Bordure & """" & _ IIf(Len(Hauteur) > 0, """ height=""" & Hauteur & """", vbNullString) & _ IIf(Len(Hauteur) > 0, """ width= """ & Largeur & """", vbNullString) & ">" ReDim Preserve Tbl_Img_incrust(1, UBound(Tbl_Img_incrust, 2) + 1) End If End Sub Public Sub Modifie_Image_Incrustee(Image As String, Optional Infobulle As String = vbNullString, _ Optional Alignement As String = "baseline", Optional Epaisseur_Bordure As Byte = 0, _ Optional Hauteur As String, Optional Largeur As String) 'Cette procédure modifie le code HTML associé à une image incrustée 'Image peut être soit le nom du fichier, soit le chemin complet menant vers l'image Dim a As Byte, Taille As Byte Taille = UBound(Tbl_Img_incrust, 2) For a = 0 To Taille If InStr(1, Tbl_Img_incrust(0, a), Image) > 0 Then Tbl_Img_incrust(1, a) = _ "<img alt=""" & Infobulle & """ hspace=0 src=""" & Image & """ align=""" & _ Alignement & """ border=""" & Epaisseur_Bordure & """" & _ IIf(Len(Hauteur) > 0, """ height=""" & Hauteur & """", vbNullString) & _ IIf(Len(Hauteur) > 0, """ width= """ & Largeur & """", vbNullString) & ">" Exit Sub End If Next a End Sub Public Function Renvoie_HTML_image_incrustee(Image As String) As String 'Cette fonction renvoie le code HTML d'insertion de l'image Image 'Image peut être soit le nom du fichier, soit le chemin complet menant vers l'image Dim a As Byte, Taille As Byte Taille = UBound(Tbl_Img_incrust, 2) For a = 0 To Taille If InStr(1, UCase(Tbl_Img_incrust(0, a)), UCase(Image)) > 0 Then Renvoie_HTML_image_incrustee = Tbl_Img_incrust(1, a) Exit Function End If Next a End Function Public Sub Lance_Outlook() 'Cette procédure permet d'ouvrir Outlook s'il ne l'est pas et initialise Racine 'Si Outlook n'est pas ouvert, on le fait Dim Nlle_Session As Boolean Nlle_Session = IIf(NbreProcess("Outlook.exe") = 0, True, False) Set Racine = Ootlook.GetNamespace("Mapi") 'On ouvre une session Racine.Logon Profil, Mdp, False, Nlle_Session End Sub Private Function NbreProcess(ByVal ProcessName As String) As Byte Dim svc As Object Dim sQuery As String Dim oproc As Variant Dim Compteur As Byte On Error Resume Next Set svc = GetObject("winmgmts:root\cimv2") sQuery = "select * from win32_process where name='" & ProcessName & "'" For Each oproc In svc.execquery(sQuery) Compteur = Compteur + 1 Next Set svc = Nothing NbreProcess = Compteur On Error GoTo 0 End Function Public Sub Nouveau_message() 'Cette procédure crée un nouveau message et l'associe à Courriel '*************************************************************************************************** '* !! SI VOUS CREEZ UN NOUVEAU MESSAGE, IL N'Y AURA PLUS DE HANDLE VERS LE PRECEDENT !! * '*************************************************************************************************** Set Courriel = Ootlook.CreateItem(olMailItem) ID = Creer_nom_aleatoire() End Sub Public Sub Genere_message(Optional Envoi As Boolean = False, Optional Rangement As String, Optional Visible As Boolean = True) 'Cette procédure crée le message 'si Envoi est Vrai, le message est envoyé, sinon il est sauvegardé et affiché 'Rangement s'il est renseigné, déplace le message dans le dossier indiqué SI ET SEULEMENT SI ce dernier a été envoyé 'Si Visible est Vrai, alors on voit l'interface d'Outlook Dim Explo As Outlook.Explorer, Ligne As Variant Dim Dossier As Outlook.Folder, Dossier_rangement As Outlook.Folder, Message As MailItem Dim Champ_adresse As String, Drapeau_archive As Boolean 'Uniquement valable à partir d'Outlook 2007 Dim Compte As Account On Error GoTo Erreurs If TypeName(Racine) = "Nothing" Then Lance_Outlook If Visible Then If Ootlook.Explorers.Count > 0 Then Set Explo = Ootlook.Explorers(1) Else Set Explo = Ootlook.Explorers.Add(Racine.Folders(1), olFolderDisplayNormal) End If Explo.Activate End If With Courriel '*********************************************** '* Valable uniquement à partir d'Outlook 2007 * '*********************************************** If Len(From) > 0 Then For Each Compte In Racine.Accounts If UCase(Compte.UserName) = UCase(From) Or UCase(Compte.SmtpAddress) = UCase(From) Then .SendUsingAccount = Compte Exit For End If Next Compte End If '*********************************************** .Subject = Sujet .BodyFormat = olFormatHTML .HTMLBody = HTML 'On laisse le soin à Word 2007 d'interpréter le code HTML à la sauce Office 2007 'Comme les commentaires HTML sont supprimés par Outlook lorsqu'il compile le message lors de l'envoi, 'On ajoute un paragraphe contenant l'ID du message à la fin de ce dernier. 'style="display:none" permet de le rendre invisible .HTMLBody = .HTMLBody & "<p style=""display:none"">" & ID & "</p>" 'On insère l'ID du message afin de le retouver dans les éléments envoyés 'si on veut le ranger dans un dossier. 'En effet, l'IdEntry du message change lorsqu'il est envoyé For Each Ligne In Tbl_To If Len(Ligne) > 0 Then Champ_adresse = Champ_adresse & Ligne & ";" Next Ligne .To = Champ_adresse Champ_adresse = vbNullString For Each Ligne In Tbl_Cc If Len(Ligne) > 0 Then Champ_adresse = Champ_adresse & Ligne & ";" Next Ligne .Cc = Champ_adresse Champ_adresse = vbNullString For Each Ligne In Tbl_Cci If Len(Ligne) > 0 Then Champ_adresse = Champ_adresse & Ligne & ";" Next Ligne .BCC = Champ_adresse .Save If Envoi Then 'On récupère l'ID de ce dernier car elle va nous servir à le retrouver 'ID_Message = .EntryID 'On ne peut pas utiliser EntryID car cette valeur change lorsque le message est déplacé 'dans un autre répertoire .Send Sleep 200 'On laisse le temps à Outlook de copier le message dans le dossier Envoyé If Len(Rangement) > 0 Then 'On détermine le dossier de rangement For Each Dossier In Racine.Folders Set Dossier_rangement = Recherche_dossier(Dossier, Rangement, True) Sleep 300 'On laisse le temps à Outlook d'associer le dossier à la variable If Dossier_rangement.Name = Rangement Then 'Lorsqu'un message est envoyé il est ou non copié dans le dossier "Éléments envoyés" 'Si c'est le cas, on le déplace dans Rangement Set Dossier = Racine.GetDefaultFolder(olFolderSentMail) For Each Message In Dossier.Items If InStr(1, Message.HTMLBody, ID) > 0 Then Drapeau_archive = True 'Pour savoir s'il faut ou non déplacer le message Message.Move Dossier_rangement 'car il est possible de demander à Outlook 'de ne pas enregistrer une copie des messages envoyés dans "Eléments envoyés" Exit For End If Next Message 'Tant que le message n'a pas été déplacé, on boucle While Drapeau_archive For Each Message In Dossier_rangement.Items If InStr(1, Message.HTMLBody, ID) > 0 Then Drapeau_archive = False Exit For End If Next Message DoEvents Wend Exit For End If Suite: Next Dossier End If Exit Sub Else .Display End If End With Exit Sub Erreurs: If Err.Description = "Impossible d'ouvrir l'élément. Recommencez." Then 'Impossible d'ouvrir le dossier Resume Suite 'On passe au dossier suivant Else EnvoiErreur "Genere_message", Err.Number, Err.Description End If End Sub Private Function Recherche_dossier(Dossier_racine As Outlook.Folder, Nom As String, Optional Reinit As Boolean = False) As Outlook.Folder 'Cette fonction récursive recherche un dossier ayant le nom Nom et le renvoie 'La recherche est insensible à la casse Dim Dossier As Outlook.Folder, Ss_Dossier As Outlook.Folder Static Trouve As Boolean If Reinit Then Trouve = False If Trouve Then Exit Function Set Dossier = Dossier_racine Set Recherche_dossier = Dossier If UCase(Dossier) = UCase(Nom) Then Trouve = True Exit Function End If With Dossier If .Folders.Count > 0 Then For Each Ss_Dossier In .Folders Set Recherche_dossier = Recherche_dossier(Ss_Dossier, Nom) If Trouve Then Exit Function Next Ss_Dossier End If End With End Function Public Sub Affiche_Courriel() Courriel.Display End Sub Public Sub Reinit_Message() 'Cette procédure vide tous les conteneurs associés à un message Suppr_To "Tout" Suppr_Cc "Tout" Suppr_Cci "Tout" Suppr_PJ "Tout" Suppr_Incrustation "Tout" End Sub Private Function Creer_nom_aleatoire(Optional Prefixe As String = "Message_") As String ' Cette fonction renvoie un nom aléatoire Randomize Creer_nom_aleatoire = Replace(Prefixe & Format(Now(), "YYYYmmddhhnn") & CStr(CLng(100000000 * Rnd())), "E-", "") End Function
3 déc. 2011 à 21:58
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.