MailItem何时不是MailItem?

10 vba mailitem typeof outlook-vba outlook-2003

我在Outlook的Visual Basic(我们使用的是Outlook 2003和Exchange Server)中编写了一个消息处理函数来帮助我整理收到的电子邮件.

它对我有用,除非有时规则失败并且Outlook停用它.

然后我重新打开规则并在我的收件箱中手动运行以赶上.该规则自发地失败并且每天停用几次.

我想一劳永逸地解决这个问题.

小智 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
Run Code Online (Sandbox Code Playgroud)

HTH


小智 5

我在其他 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
Run Code Online (Sandbox Code Playgroud)

ETC。


小智 3

我在 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
Run Code Online (Sandbox Code Playgroud)

我收到的一个错误是调用 MyMessageHandler 时出现“类型不匹配”,其中 VB 抱怨 Item 不是 MailItem。好的,但是 TypeName(Item) 返回“MailItem”,那么为什么 Item 不是 MailItem?

我收到的另一个邮件是一封主题空的电子邮件。线路

strSubject = Item.Subject
Run Code Online (Sandbox Code Playgroud)

给我一个错误。我知道 Item.Subject 应该为空,但为什么这是一个错误?

谢谢。