在 For Each 循环中标记已读项目会留下一些标记为未读的项目

Marking items read in a For Each loop leaves some marked unread

我正在尝试将从 Outlook 子文件夹复制到收件箱到文件系统文件夹中的邮件标记为已读。

Sub demo1()
    Dim objNS As Outlook.NameSpace
    Dim objFolder As Outlook.MAPIFolder
    Dim path As String
    Dim i As Integer, iUnred As Integer
    Dim objUnreadItems As Object, m As Object, att As Object, Item As Object
    
    Set objNS = GetNamespace("MAPI")
    Set objFolder = objNS.Folders.Item("user@email.com") ' folders of your current account
    Set objFolder = objFolder.Folders("Inbox")
    Set objFolder = objFolder.Folders("SubFolder")
    
    Set objUnreadItems = objFolder.Items.Restrict("[UnRead] = True")
    ' Debug.Print objUnreadItems.Count
    
    If objUnreadItems.Count = 0 Then
   '     MsgBox "NO objUnreadItems Email In Inbox" TODO: add to logfile
    Else
    
        For Each Item In objUnreadItems
            'Debug.Print objUnreadItems.Count
            path = "C:\temp\" & Item.Subject & ".msg"
            Item.SaveAs path, olMSG
            'Debug.Print Item.ConversationTopic
            ' Item.unRead = False
        Next
        For Each Item In objFolder.Items.Restrict("[UnRead] = True")
            Debug.Print objUnreadItems.Count & ": " & Item.ConversationTopic
            Item.unRead = False
        Next
   End If
End Sub

输出如下:

9:RMA# 2832844 FA 报告
9: RMA FA 报告# 2828196
8: RMA FA 报告# 2827687
7:RMA FA 报告# 2827667
6:RMA FA 报告# 2832909

所有消息都显示在 c:\temp 中,但九条消息中只有五条标记为已读。

您正在修改(通过设置 UnRead 属性)集合的元素。将 for each 替换为向下循环:

for i = objUnreadItems.Count to 1 step -1
      set item = objUnreadItems(i)
      path = "C:\temp\" & Item.Subject & ".msg"
      Item.SaveAs path, olMSG
      Item.UnRead = False
next

您可能还想通过删除无效(对于文件名)字符来清理文件名,例如 :.