Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Outlook > VBA Outlook

Réponse
 
Outils de la discussion
Vieux 18/07/2008, 17h28   #1 (permalink)
Invité de passage
 
Date d'inscription: juillet 2008
Messages: 5
Par défaut Classement automatique des emails ET des rapports (olReport)

Bonjour à tous,

J'essaiede créer une macro pour trier automatiquement mes emails. En somme :
  • Je sélectionne dans ma boîte de réception le ou les emails à classer
  • J'appel la macro "moveToArchive"
Cette macro fait :
  • Change l'état du email en "lu"
  • Classe le email (ou le rapport) dans le bon répertoire
Le problème : pas de problème pour classer les emails (class = olMail), par contre c'est une autre paire de manche pour les rapports de lecture (classe = olReport) !

En fait, je n'arrive pas à trouver l'expéditeur du rapport de lecture, je n'arrive donc pas à le classer. Bien sûr, quand la classe du message est "olReport", la fonction "SenderEmailAddress" n'existe pas, d'ou le problème !

Mon code :
Code :
Sub moveToArchive()
    'Bligoo - March 2008
    'http://bligoo.wordpress.com/
 
    ' OlObjectClass
    ' olMail = 43
    ' olNote = 44
    ' olPost = 45
    ' olReport = 46
    ' olRemote = 47
    ' Liste complète : http://support.microsoft.com/kb/285202/fr
 
    On Error Resume Next
    Dim objFolder As Outlook.MAPIFolder, objInbox As Outlook.MAPIFolder
    Dim objNS As Outlook.namespace
    Dim objItem As Object    ' Impossible de mettre "MailItem" ???
 
    Set objNS = Application.GetNamespace("MAPI")
    Set objInbox = objNS.GetDefaultFolder(olFolderInbox)
    ' Set objFolder = objNS.Folders("Dossiers 2008")
    ' À retenir : objNS.Folders(”Dossiers personnels”).Folders(”sous dossier”).Folders(”Sous sous dossier”)
    ' Exemple : Set objFolder = objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP")
    Set objFolder = objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP")
 
    If Application.ActiveExplorer.Selection.Count = 0 Then
        '[asy]Contrôle qu'au moins un message est sélectionné, sinon fin de la macro
 
        Exit Sub
 
    End If
 
    If objFolder Is Nothing Then
        '[asy]Controler que le dossier de destination est valide
        MsgBox "Le dossier cible n'existe pas!", vbOKOnly + vbExclamation, "INVALID FOLDER"
    End If
 
    For Each objItem In Application.ActiveExplorer.Selection
 
        If objFolder.DefaultItemType = olMailItem Then
 
            Select Case objItem.Class
 
                Case olMail:    ' Courriel
 
                    objItem.UnRead = False    '[asy]Le mail passe dans le statut lu
                    ' objItem.Move objFolder '[asy]Le mail est déplacé dans le répertoire cible
                    NomExp = objItem.SenderName
                    AdresseExp = objItem.SenderEmailAddress
                    Domaine = Split(AdresseExp, "@")
                    Select Case Domaine(1)
                        Case "mailingprocess.com":
                            Select Case Domaine(0)    ' Nom de l'expéditeur
 
                                Case "SRVVALIPOST1"
 
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost")
                                Case "destineo"
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost").Folders("Bordereaux")
                                Case Else
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP")
                            End Select
                        Case "routage-et-marketing.com":
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("RMP")
                        Case "bip.laposte.fr"
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("La Poste").Folders("info@bip.laposte.fr")
                    End Select
 
                Case olReport:    ' Rapport : Courriel Lu uniquement
 
                    objItem.UnRead = False    '[asy]Le mail passe dans le statut lu
                    ' Impossible d'obtenir le nom de l'expéditeur
                    ' NomExp = objItem.SenderName
                    ' AdresseExp = objItem.SenderEmailAddress
                    ' Domaine = Split(AdresseExp, "@")
 
 
                    ' objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP").Folders("Lu")
 
            End Select
 
        End If
 
    Next
 
    Set objItem = Nothing
    Set objFolder = Nothing
    Set objInbox = Nothing
    Set objNS = Nothing
 
End Sub
code qui pose problème
Code :
 Case olReport:    ' Rapport : Courriel Lu uniquement
 
                    objItem.UnRead = False    '[asy]Le mail passe dans le statut lu
                    ' Impossible d'obtenir le nom de l'expéditeur
                    ' NomExp = objItem.SenderName
                    ' AdresseExp = objItem.SenderEmailAddress
                    ' Domaine = Split(AdresseExp, "@")
Le type olReport n'ayant pas les mêmes propriétés que olMail, impossible de trouver de qui vient le rapport de lecture. Le courrier étant envoyé à plusieurs destinataires, même si je regarde à l'intérieur du "body", je ne trouve pas de qui le message m'est envoyé ! Le plus drôle est qu'il est bien possible de faire répondre mais à partir de l'interface. Dur dur la vie !

Moi j'ai bien beau chercher, je n'ai rien trouvé pour m'en sortir ! Au secours !

Dernière modification par Dolphy35 ; 18/07/2008 à 18h06 Motif: Balises Code (#)
amarcotte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/07/2008, 21h24   #2 (permalink)
Responsable Outlook
 
Avatar de Dolphy35
 
Date d'inscription: octobre 2004
Localisation: Rennes
Messages: 3 278
Envoyer un message via MSN à Dolphy35 Envoyer un message via Skype™ à Dolphy35
Par défaut

Salut,

je confirme il n'y a aucunes propriétés permettant d'avoir l'expéditeur depuis un ReportItem. Normalement tu as l'adresse mail de l'expéditeur du report dans le body mais là il te faut coder un bon traitement sur chaîne.

Je ne connais pas mais regarde du côté de CDO, il reprend pas mal de faille d'outlook.


Dolphy
__________________
Initiation au VBA d'Outlook
venez défier mabrute
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/07/2008, 21h45   #3 (permalink)
Invité de passage
 
Date d'inscription: juillet 2008
Messages: 5
Par défaut

Hello Dolphy35,

Merci pour la réponse, c'est bien ce que je pensais ! C'est quand même incroyable qu'il soit impossible de retrouver l'expéditeur. Le traitement du corp du message n'est pas vraiment utile, le nom de l'expéditeur y est mais pas nécessairement son adresse email !

Concernant le Collaboration Data Objects (CDO), as-tu un site source à me suggérer ?

Merci encore pour ta réponse rapide,

amarcotte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/07/2008, 22h30   #4 (permalink)
Responsable Outlook
 
Avatar de Dolphy35
 
Date d'inscription: octobre 2004
Localisation: Rennes
Messages: 3 278
Envoyer un message via MSN à Dolphy35 Envoyer un message via Skype™ à Dolphy35
Par défaut

re,



Wouapaaa !!!

c'est pas CDO mais redemption

http://www.dimastr.com/redemption


Dolphy
__________________
Initiation au VBA d'Outlook
venez défier mabrute
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/07/2008, 22h51   #5 (permalink)
Invité de passage
 
Date d'inscription: juillet 2008
Messages: 5
Par défaut

J'ai honte j'ai honte !

Merci pour la suggestion, je regarde ça !

À bientôt,

André
amarcotte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/07/2008, 23h14   #6 (permalink)
Responsable Outlook
 
Avatar de Dolphy35
 
Date d'inscription: octobre 2004
Localisation: Rennes
Messages: 3 278
Envoyer un message via MSN à Dolphy35 Envoyer un message via Skype™ à Dolphy35
Par défaut

Citation:
Envoyé par amarcotte Voir le message
J'ai honte j'ai honte !
c'est plutôt moi j'ai carrément confondu les deux

Bon Week
__________________
Initiation au VBA d'Outlook
venez défier mabrute
Je ne réponds pas aux questions techniques par MP
Dolphy35 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/07/2008, 14h52   #7 (permalink)
Invité de passage
 
Date d'inscription: juillet 2008
Messages: 5
Par défaut

Yes ! Redemption a la solution ! Juste un petit bout, mais qui donne exactement le résultat recherché :

Code :
Dim sItem, oItem
Set sItem = CreateObject("Redemption.SafeMailItem")
Set oItem = Application.Session.GetDefaultFolder(6).Items(1) 'get first e-mail from the Inbox, can be any other item
sItem.Item = oItem
PrSenderEmail = &HC1F001E
MsgBox sItem.Fields(PrSenderEmail)
MsgBox sItem.Fields(PrSenderEmail) envoi le nom du destinataire, que ce soit un email ou un rapport. Que du bonheur !

Merci pour ton aide, c'était une excellente suggestion !
amarcotte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/07/2008, 16h25   #8 (permalink)
Invité de passage
 
Date d'inscription: juillet 2008
Messages: 5
Par défaut

Pour les fana du code, la technique utilisé :

Code :
Function TrouveExpediteur(IDUnique As String) As String
 
Dim sItem, oItem
 
    Set sItem = CreateObject("Redemption.SafeMailItem")
    Set oItem = Application.Session.GetItemFromID(IDUnique) ' Application.Session.GetDefaultFolder(6).Items(1) 'get first e-mail from the Inbox, can be any other item
    
    sItem.Item = oItem
    PrSenderEmail = &HC1F001E
    
    TrouveExpediteur = sItem.Fields(PrSenderEmail)
    
    Set sItem = Nothing
    Set oItem = Nothing
 
End Function
Il s'agit en fait de passer en paramètre l'ID unique du message en cours pour trouver l'adresse destinataire. La fonction principale (je sais, il reste à optimiser !) :

Code :
Sub moveToArchive()
'Bligoo - March 2008
'http://bligoo.wordpress.com/
 
 ' OlObjectClass
 '  olMail = 43
 '  olNote = 44
 '  olPost = 45
 '  olReport = 46
 '  olRemote = 47
 '  Liste complète : http://support.microsoft.com/kb/285202/fr
 
    On Error Resume Next
    Dim objFolder As Outlook.MAPIFolder, objInbox As Outlook.MAPIFolder
    Dim objNS As Outlook.NameSpace
    Dim objItem As Object ' Impossible de mettre "MailItem" ???
 
    Set objNS = Application.GetNamespace("MAPI")
    Set objInbox = objNS.GetDefaultFolder(olFolderInbox)
    ' Set objFolder = objNS.Folders("Dossiers 2008")
    ' À retenir : objNS.Folders(”Dossiers personnels”).Folders(”sous dossier”).Folders(”Sous sous dossier”)
    ' Exemple : Set objFolder = objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP")
    Set objFolder = objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP")
    
    If Application.ActiveExplorer.Selection.Count = 0 Then
        '[asy]Contrôle qu'au moins un message est sélectionné, sinon fin de la macro
        Exit Sub
    End If
 
    If objFolder Is Nothing Then
        '[asy]Controler que le dossier de destination est valide
        MsgBox "Le dossier cible n'existe pas!", vbOKOnly + vbExclamation, "INVALID FOLDER"
    End If
 
    For Each objItem In Application.ActiveExplorer.Selection
        If objFolder.DefaultItemType = olMailItem Then
        NomExp = TrouveExpediteur(objItem.EntryID)
            Select Case objItem.Class
                Case olMail:    ' Courriel
                    objItem.UnRead = False '[asy]Le mail passe dans le statut lu
                    ' objItem.Move objFolder '[asy]Le mail est déplacé dans le répertoire cible
                    ' NomExp = objItem.SenderName
                    AdresseExp = objItem.SenderEmailAddress
                    Domaine = Split(AdresseExp, "@")
                    Select Case Domaine(1)
                        Case "mailingprocess.com":
                            Select Case Domaine(0)  ' Nom de l'expéditeur
                                Case "SRVVALIPOST1"
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost")
                                Case "destineo"
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost").Folders("Bordereaux")
                                Case Else
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP")
                            End Select
                        Case "routage-et-marketing.com":
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("RMP")
                        Case "bip.laposte.fr"
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("La Poste").Folders("info@bip.laposte.fr")
                        Case "laposte.fr"
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("La Poste")
                        Case "valipost.com":
                            Select Case Domaine(0)  ' Nom de l'expéditeur
                                Case "rmp"
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost")
                                Case Else
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Valipost")
                            End Select
                    End Select
                Case olReport:  ' Rapport : Courriel Lu uniquement
                    objItem.UnRead = False '[asy]Le mail passe dans le statut lu
                    ' Impossible d'obtenir le nom de l'expéditeur
                    ' NomExp = objItem.SenderName
                     AdresseExp = NomExp
                     Domaine = Split(AdresseExp, "@")
                    Select Case Domaine(1)
                        Case "mailingprocess.com":
                            Select Case Domaine(0)  ' Nom de l'expéditeur
                                Case "SRVVALIPOST1"
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost")
                                Case "destineo"
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Serveur.Valipost").Folders("Bordereaux")
                                Case Else
                                    objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("MP").Folders("Lu")
                            End Select
                        Case "routage-et-marketing.com":
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("Interne").Folders("RMP").Folders("Lu")
                        Case "laposte.fr"
                            objItem.Move objNS.Folders("Dossiers 2008").Folders("Boîte de réception").Folders("La Poste")
                    End Select
            End Select
        End If
    Next
 
    Set objItem = Nothing
    Set objFolder = Nothing
    Set objInbox = Nothing
    Set objNS = Nothing
    
End Sub
Ça fonctionne parfaitement, c'est bien à se demander pourquoi Outlook sans Redemption n'était pas capable de faire la "job".

Encore merci pour la suggestion !
amarcotte est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Outlook > VBA Outlook

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide