2008-09-17 4 views
8

J'ai écrit une fonction de gestionnaire de message dans Visual Basic d'Outlook (nous utilisons Outlook 2003 et Exchange Server) pour m'aider à trier les emails entrants.Quand un MailItem n'est pas un MailItem?

Cela fonctionne pour moi, sauf parfois que la règle échoue et Outlook le désactive.

Ensuite, je rallume la règle et l'exécute manuellement sur ma boîte de réception pour rattraper. La règle échoue spontanément et se désactive plusieurs fois par jour.

Je serais ravi d'y remédier une fois pour toutes.

Répondre

1

avez écrit une fonction de gestionnaire de messages dans Outlook Visual Basic (nous utilisons Outlook 2003 et Exchange Server) pour m'aider à trier les e-mails entrants. Cela fonctionne pour moi, sauf que parfois la règle échoue et Outlook le désactive. Ensuite, je rallume la règle et l'exécute manuellement sur ma boîte de réception pour la rattraper. La règle échoue spontanément et se désactive plusieurs fois par jour. J'aimerais réparer ceci une fois pour toutes.

Voici le code dépouillé de la fonctionnalité, mais vous donner une idée de la façon dont il ressemble:

Public WithEvents myOlItems As Outlook.Items 

    Public Sub Application_Startup() 
     ' Reference the items in the Inbox. Because myOlItems is declared 
     ' "WithEvents" the ItemAdd event will fire below. 
     ' Set myOlItems = Outlook.Session.GetDefaultFolder(olFolderInbox).Items 
     Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
    End Sub 

    Private Sub myOlItems_ItemAdd(ByVal Item As Object) 
     On Error Resume Next 
     If TypeName(Item) = "MailItem" Then 
      MyMessageHandler Item 
     End If 
    End Sub 

    Public Sub MyMessageHandler(ByRef Item As MailItem) 
     Dim strSender As String 
     Dim strSubject As String 

     If TypeName(Item) <> "MailItem" Then 
      Exit Sub 
     End If 

     strSender = LCase(Item.SenderEmailAddress) 
     strSubject = Item.Subject 

     rem do stuff 
     rem do stuff 
     rem do stuff 
    End Sub 

Une erreur que je reçois est « Type Mismatch » appelant MyMessageHandler où VB se plaint que le point est pas un MailItem . D'accord, mais TypeName (Item) renvoie "MailItem", alors pourquoi Item n'est pas un MailItem?

Un autre que j'obtiens est où un email avec un sujet vide arrive. La ligne

strSubject = Item.Subject 

me donne une erreur. Je sais Item.Subject devrait être vide, mais pourquoi est-ce une erreur?

Merci.

+1

TypeName interroge un type pour une version lisible par un humain. Comme il peut y avoir deux types différents avec le même nom, le fait de s'appuyer sur TypeName pour effectuer la vérification de type entraînera des faux positifs/négatifs. Essayez "TypeOf Item is MailItem" à la place – rpetrich

+0

Si 'TypeName (Item) =" MailItem "', alors appelez une procédure ... qui non seulement accepte uniquement MailItems, mais vérifie à nouveau si l'élément est un MailItem? – JimmyPena

2

Ma mémoire est un peu trouble à ce sujet, mais je crois qu'un MailItem n'est pas un MailItem quand c'est quelque chose comme un reçu de lecture. (Malheureusement, le code VBA qui a démontré cela a été écrit à un autre travail et n'est pas là maintenant.)

J'ai également eu le code écrit pour traiter les messages entrants, probablement pour la même raison que vous avez fait (trop de règles pour Exchange, ou des règles trop complexes pour l'Assistant de règles), et semblent se rappeler de courir dans le même problème que vous avez, que certains éléments semblaient être d'un type différent, même si je les attrapais avec quelque chose comme ce que vous avez écrit.

Je verrai si je peux produire un exemple spécifique si cela peut aider.

8

Ce code m'a montré les différentes TypeNames qui étaient dans ma boîte de réception:

Public Sub GetTypeNamesInbox() 
Dim myOlItems As Outlook.Items 
Set myOlItems = application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
Dim msg As Object 

For Each msg In myOlItems 
    Debug.Print TypeName(msg) 
    'emails are typename MailItem 
    'Meeting responses are typename MeetingItem 
    'Delivery receipts are typename ReportItem 
Next msg 

End Sub 

HTH

1

Il existe de nombreux types d'éléments qui peuvent être vus dans la boîte de réception par défaut.

Dans la procédure appelée, affectez l'élément entrant à une variable de type Object. Ensuite, utilisez TypeOf ou TypeName pour déterminer s'il s'agit d'un MailItem. Ce n'est qu'alors que votre code doit effectuer des actions qui s'appliquent aux e-mails.

c.-à-d.

Dim obj As Object 

If TypeName(obj) = "MailItem" Then 
    ' your code for mail items here 
End If 
1
Dim objInboxFolder As MAPIFolder 
Dim oItem As MailItem 
Set objInboxFolder = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 

For Each Item In objInboxFolder.Items 
    If TypeName(Item) = "MailItem" Then 
    Set oItem = Item 

next 
+0

Veuillez ajouter une explication à votre code. – nalply

3

J'utilise l'extrait de code VBA suivant dans d'autres applications de bureau, où la bibliothèque Outlook est directement référencée.

' Outlook Variables 

    Dim objOutlook As Outlook.Application: Set objOutlook = New Outlook.Application 
    Dim objNameSpace As Outlook.NameSpace: Set objNameSpace = objOutlook.GetNamespace("MAPI") 
    Dim objFolder As MAPIFolder: Set objFolder = objNameSpace.PickFolder() 
    Dim objMailItem As Outlook.MailItem 

    Dim iCounter As Integer: iCounter = objFolder.Items.Count 
    Dim i As Integer 

    For i = iCounter To 1 Step -1 
    If TypeOf objFolder.Items(i) Is MailItem Then 
     Set objMailItem = objFolder.Items(i) 
     With objMailItem 

etc.

+0

J'aime mieux le 'TypeOf' que le" MailItem "codé en dur comme une chaîne. –

0

pourquoi ne pas utiliser un gestionnaire d'erreur simple pour le code? Sérieusement. Vous pouvez écrire une erreur pour chaque lecture d'une propriété ou d'un objet qui semble échouer. Puis l'avoir Reprendre n'importe quoi. Pas besoin de gérer les erreurs complexes. Pensez à un test qui montre un sujet vide. Puisque vous ne savez pas quelle valeur il va retourner, le cas échéant, et il semble que l'erreur sur un sujet vide ou vide, vous devez l'imaginer comme un test simple avec une erreur possible. Exécutez le test sous la forme d'une instruction if (dans laquelle vous obtiendrez une erreur de toute façon) et redémarrez le programme en cas d'erreur.

On Error Resume Next 
If object.subject = Null 'produces an error when subject is null, otherwise allows a good read 
    strSubject = "" 'sets the subject grab string to a null or empty string as a string 
Else 
strSubject = object.subject 'Sets the subject grab string to the subject of the message\item 
End If 
Questions connexes