[ACCEPTED]-When is a MailItem not a MailItem?-outlook-2003
This code showed me the different TypeNames 1 that were in my Inbox:
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
I use the following VBA code snippet in 2 other Office Applications, where the Outlook 1 Library is directly referenced.
' 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.
have written a message handler function 19 in Outlook's Visual Basic (we're using Outlook 18 2003 and Exchange Server) to help me sort 17 out incoming email. It is working for me, except 16 sometimes the rule fails and Outlook deactivates 15 it. Then I turn the rule back on and manually 14 run it on my Inbox to catch up. The rule 13 spontaneously fails and deactivates several 12 times a day. I would love to fix this once 11 and for all.
Here is the code stripped of 10 the functionality, but giving you an idea 9 of how it looks:
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
One error I get is "Type 8 Mismatch" calling MyMessageHandler where 7 VB complains that Item is not a MailItem. Okay, but 6 TypeName(Item) returns "MailItem", so how 5 come Item is not a MailItem?
Another one 4 I get is where an email with an empty subject 3 comes along. The line
strSubject = Item.Subject
gives me an error. I 2 know Item.Subject should be blank, but why 1 is that an error?
Thanks.
My memory is somewhat cloudy on this, but 13 I believe that a MailItem is not a MailItem 12 when it is something like a read receipt. (Unfortunately, the 11 VBA code that demonstrated this was written 10 at another job and isn't around now.)
I also 9 had code written to process incoming messages, probably 8 for the same reason you did (too many rules 7 for Exchange, or rules too complex for the 6 Rules Wizard), and seem to recall running 5 into the same problem you have, that some 4 items seemed to be from a different type 3 even though I was catching them with something 2 like what you wrote.
I'll see if I can produce 1 a specific example if it will help.
There are many types of items that can be 5 seen in the default Inbox.
In the called 4 procedure, assign the incoming item to an 3 Object
type variable. Then use TypeOf
or TypeName
to determine 2 if it is a MailItem
. Only then should your code 1 perform actions that apply to emails.
i.e.
Dim obj As Object
If TypeName(obj) = "MailItem" Then
' your code for mail items here
End If
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
why not use a simple error handler for the 12 code? Seriously. You could write an error 11 for each read of a property or object that 10 seems to fail. Then have it Resume no matter 9 what. No need for complex error handling. Think 8 of a test that shows an empty subject. Since 7 you don't know what value it will return, if 6 any, and it seems to error on an empty or 5 blank subject, you need to picture it as 4 a simple test with a possible error. Run 3 the test as an if statement (one in which 2 you will get an error anyway), and have 1 the program resume on error.
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
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.