Outlook VBA не может сохранить изменения в MailItem только для старых элементов

У меня есть макрос в Outlook VBA, который предназначен для установки категории выбранного электронного письма и отправки ответного электронного письма отправителю, когда пользователь нажимает кнопку на «Ленте».

Приведенный ниже код правильно установит категорию для любых новых писем, но выдает «Ошибка выполнения '440': не удается сохранить этот элемент». при работе с электронными письмами, которые уже давно лежали без дела. Я не знаю, что вызывает это, так как какое-то время он работает нормально, а затем больше не работает.

Я попытался перезапустить Outlook, войти в систему и выйти из нее, а также перезагрузить компьютер, и ни один из них, похоже, не вызывает изменения в поведении, поэтому я считаю, что это каким-то образом связано с продолжительностью, в течение которой находится электронное письмо. Это довольно сбивает с толку, поскольку я не понимаю, почему продолжительность нахождения в папке должна влиять на возможность сохранения, но не на возможность доступа к свойствам MailItem.

Упрощенная версия кода (без части отправки электронной почты, которая отлично работает) выглядит следующим образом:

Public Sub UpdateCategory
    Dim objItem as Object

    Set objItem = GetCurrentItem()

    'Verify that selected item is an email and an engineering request
    If TypeName(objItem) = "MailItem" And InStr(LCase(objItem.Subject), "engineering request") > 0 Then
        objItem.Categories = "Test"
        objItem.Save
    End If

    Set objItem = Nothing
End Sub

Function GetCurrentItem() As Object
    Dim objApp As Outlook.Application

    Set objApp = Application
    On Error Resume Next
    Select Case TypeName(objApp.ActiveWindow)
        Case "Explorer"
            Set GetCurrentItem = objApp.ActiveExplorer.Selection.Item(1)
        Case "Inspector"
            Set GetCurrentItem = objApp.ActiveInspector.CurrentItem
    End Select

    Set objApp = Nothing
End Function

Приветствуются любые мысли или предложения !!


person user1656131    schedule 02.10.2019    source источник


Ответы (1)


Если это почтовый ящик Exchange, возможно, что Exchange изменил элемент на стороне сервера, это изменение было загружено в файл OST, но поскольку объектная модель Outlook не знает об изменении, при попытке сохранить (устаревший) пункт, вы получите ошибку конфликта.

person Dmitry Streblechenko    schedule 04.10.2019
comment
Это почтовый ящик Exchange. Это кажется правдоподобным, есть ли способ обойти это? Как мне убедиться, что макрос ссылается на последнюю версию элемента? - person user1656131; 04.10.2019
comment
Вы ничего не можете сделать - вы можете выпустить элемент, как только закончите с ним. Если вам нужно открыть его в будущем, снова откройте его по (ранее сохраненному) идентификатору записи, используя Namespace.GetItemFromID. Как правило, не храните ссылки на элементы Outlook в течение каких-либо длительных периодов времени (открывайте. Изменяйте, сохраняйте, выпускайте) и избегайте необходимости сохранять элемент несколько раз - вносите все изменения за один проход. - person Dmitry Streblechenko; 04.10.2019