【问题标题】:Mark all emails read in specified folder标记指定文件夹中的所有电子邮件已读
【发布时间】:2020-03-14 11:05:08
【问题描述】:

我有一个 Outlook 2019 IMAP 帐户,我正在尝试使用以下 VBA 代码将“垃圾邮件”文件夹中的所有电子邮件标记为自动已读。

我在 Stack Overflow 上找到了代码,并更改了第一个 IF 语句以仅获取 Spam 文件夹。

它给了我

“数组索引越界”_错误(80020009)

在第 3 次或第 4 次迭代之后(因此最多删除三封电子邮件)并且代码中断。

为什么会失败,我可以参数化此代码以选择任意文件夹名称吗?

    Sub MarkAllItemsAsRead()
    Dim objStores As Outlook.Stores
    Dim objStore As Outlook.Store
    Dim objOutlookFile As Outlook.Folder
    Dim objFolder As Outlook.Folder

    'Process all Outlook files
    Set objStores = Outlook.Application.Session.Stores

    For Each objStore In objStores
        Set objOutlookFile = objStore.GetRootFolder

        For Each objFolder In objOutlookFile.Folders
            'Process mail folders
            If objFolder.DefaultItemType = olMailItem And objFolder.Name = "Spam" Then
                Debug.Print objFolder.Name
                Call ProcessFolders(objFolder)
            End If
        Next
    Next
    End Sub

    Sub ProcessFolders(ByVal objCurFolder As Outlook.Folder)
    Dim objUnreadItems As Outlook.Items
    Dim i As Integer
    Dim objItem As Object
    Dim objSubFolder As Outlook.Folder

    Set objUnreadItems = objCurFolder.Items.Restrict("[Unread]=True")

    'Mark all unread emails as read
    For i = 1 To objUnreadItems.Count
        Set objItem = objUnreadItems.Item(i)
        objItem.UnRead = False
        objItem.Save
    Next

    End Sub

【问题讨论】:

  • 你的代码是什么?你试过什么,有什么问题?请记住,“请有人为我写代码”并不是一种可以在这里赢得很多朋友的方法。
  • 很抱歉,在这里,但经过 3 次迭代后,它给了我“数组索引超出范围”错误 (80020009):

标签: vba outlook


【解决方案1】:

简单地颠倒迭代顺序可能会解决您的问题。

这里(可能)发生的事情是,当您更改消息时,服务器希望提供额外的帮助,并将它们移动到其他地方,一旦完成,“消息号 2”现在是“消息号 1 ”。从最高编号开始处理它们应该可以解决它,因为如果最高编号的消息消失,则不会重新编号其他消息。

IMAP 提供了更好的方法来解决它(或者使用一个命令设置所有读取,或者通过 UID 而不是序列号指定它们),但是颠倒迭代顺序是一个很小的变化并且可能会起作用。

【讨论】:

  • 好的,我知道了,非常感谢。你能告诉我为什么在这段代码中有objItem.Save吗?我在那里保存什么?
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多