我在Outlook的Visual Basic(我们使用的是Outlook 2003和Exchange Server)中编写了一个消息处理函数来帮助我整理收到的电子邮件。
它对我有用,除非有时规则失败并且Outlook停用它。
然后我重新打开规则并在我的收件箱中手动运行以赶上。该规则自发地失败并且每天停用几次。
我想一劳永逸地解决这个问题。
答案 0 :(得分:11)
此代码向我显示了收件箱中的不同TypeNames:
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 :(得分:3)
我在其他Office应用程序中使用以下VBA代码段,其中直接引用了Outlook库。
' 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
等
答案 2 :(得分:2)
在Outlook的Visual Basic(我们使用的是Outlook 2003和Exchange Server)中编写了一个消息处理函数来帮助我整理收到的电子邮件。它对我有用,除非有时规则失败并且Outlook停用它。然后我重新打开规则并在我的收件箱中手动运行以赶上。该规则自发地失败并且每天停用几次。我想一劳永逸地解决这个问题。
以下是剥离了该功能的代码,但让您了解它的外观:
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
我得到的一个错误是“类型不匹配”调用MyMessageHandler,其中VB抱怨Item不是MailItem。好的,但TypeName(Item)返回“MailItem”,那么Item怎么不是MailItem?
我得到的另一个是带有空主题的电子邮件。这条线
strSubject = Item.Subject
给了我一个错误。我知道Item.Subject应该是空白的,但为什么会出错?
感谢。
答案 3 :(得分:2)
我的内存有点多云,但我相信MailItem不是MailItem,就像读取收据一样。 (不幸的是,证明这一点的VBA代码是在另一份工作中编写的,现在还没有。)
我还编写了代码来处理传入的消息,可能是因为你做了相同的原因(对Exchange规则太多,或者规则向导太复杂了),并且似乎回想起遇到的问题,即有些项目似乎是来自不同的类型,即使我用他们写的东西来捕捉它们。
如果有帮助,我会看看是否可以制作一个具体的例子。
答案 4 :(得分:1)
默认收件箱中可以看到许多类型的项目。
在被调用的过程中,将传入项目分配给Object
类型变量。然后使用TypeOf
或TypeName
确定它是否为MailItem
。只有这样,您的代码才能执行适用于电子邮件的操作。
即
Dim obj As Object
If TypeName(obj) = "MailItem" Then
' your code for mail items here
End If
答案 5 :(得分: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
答案 6 :(得分:0)
为什么不为代码使用简单的错误处理程序?认真。您可以为每次读取似乎失败的属性或对象写入错误。然后有它简历无论如何。无需复杂的错误处理。想象一下显示空主题的测试。由于您不知道它将返回什么值,如果有,并且它似乎在空或空白主题上出错,您需要将其描述为可能出错的简单测试。将测试作为if语句运行(无论如何都会出现错误),并在程序恢复时出错。
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