VBA Outlook 2019 // пометить все письма прочитанными в указанной папке - PullRequest
0 голосов
/ 28 октября 2019

Итак, я пытаюсь сделать Outlook 2019 пригодным для использования.

У меня настроена учетная запись IMAP, и, к сожалению, я не могу отписаться от определенных папок, например, от спама (что я считаю идиотским, потому что другие почтовые клиенты допускают это). Эта папка спама управляется сервером, поэтому ежедневно я получаю ~ 25 писем. Чтобы сохранить его чистым в Outlook, я хотел бы пометить все электронные письма в этой папке как прочитанные, и это в Outlook открыто, и в любое время в нем появляется любое электронное письмо.

Не могли бы вы помочь мне сделать это через VBA?

Ниже приведен не мой код, я нашел его здесь в stackoverflow и просто изменил первый оператор IF, чтобы получить только папку Spam, но он даетme «Индекс массива вне границ» ошибка (80020009) после 3-й и 4-й итерации (поэтому удаляется до 3 электронных писем), и код ломается.

Давайте не будем исправляться толькоПапка со спамом, можем ли мы сделать ее общей и в случае необходимости просто заменить имя папки в коде?

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

1 Ответ

0 голосов
/ 28 октября 2019

Простое изменение порядка итераций, скорее всего, решит вашу проблему.

То, что (вероятно) здесь происходит, заключается в том, что когда вы изменяете сообщения, сервер хочет быть очень полезным и перемещает их сообщения в другое место, икак только это будет сделано, то, что было «сообщением № 2», теперь стало «сообщением № 1». Обработка их, начиная с наибольшего числа, должна решить эту проблему, потому что, если сообщение с наибольшим номером пропадает, другие сообщения не перенумеровываются.

IMAP предлагает более эффективные способы ее решения (либо установив чтение всех одной командой,или указав их по UID, а не по порядковому номеру), но изменение порядка итераций является небольшим изменением и, вероятно, сработает.

...