Я пытаюсь синхронизировать две папки outlook (одна - общий почтовый ящик, а другая - личная настраиваемая папка). Моя главная цель - синхронизировать эти две папки, по крайней мере, каждый раз, когда «оригинальная» общая папка получает новуюпочта, которая должна быть скопирована в пользовательскую папку «destination».
Мне удалось получить все почтовые сообщения в исходном общем почтовом ящике за определенный промежуток времени (например, текущий день)
Private ons As Outlook.NameSpace
Dim sourceFolder As Outlook.Folder
Dim sourceFolderRecipient As Outlook.Recipient
Set sourceFolderRecipient = ons.CreateRecipient("sharedAccount@myDomain.com")
Set sourceFolder = ons.GetSharedDefaultFolder(sourceFolderRecipient, olFolderInbox)
Dim sourceFolderMails As Outlook.items
Set sourceFolderMails = sourceFolder.items
Dim sourceFolderMail As Outlook.MailItem
Dim strFilter As String
strFilter = "[SentOn] > '" & Date & "'"
Set sourceFolderMails = sourceFolderMails.Restrict(strFilter)
И я могу также скопировать все сообщения из списка sourceFolderMails в папку назначения.
К сожалению, когда приходит новое сообщение, функция вызывается снова, и она дублирует все сообщения в папке назначения и новое письмо.
Есть ли способ фильтрации sourceFolderMails, например sourceFolderMails.Restrict («все сообщения Subject и SentOn, отличные от списка»), или какое-либо другое решение для копирования только новой почты / писем?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Моя функция синхронизации вызывается каждый раз, когда появляется новое сообщениеприбывает (вызывая событие ItemAdd
).Я попытался использовать два вложенных For Each item In items
для контейнеров элементов sourceFolderMails и destinationFolderMails, сравнивающих атрибуты Subject
и SentOn
.Это работает, но сравнение SentOn
заставляет макрос увеличивать время выполнения формы менее чем за секунду до более 30 секунд, и это невозможно, потому что мне нужно проверить до шести общих почтовых папок.(Subject
сравнение не влияет на время выполнения, в то время как другие атрибуты, такие как Size
, влияют, и именно поэтому я ищу другой способ фильтрации полученного списка рассылки, например, используя items.Restrict(filter)
).
ОБНОВЛЕНИЕ
Учитывая, что есть некоторые свойства MailItem, которые можно сравнивать, не влияя на время выполнения (по крайней мере, Subject и EntryID), возможное решение может быть скопировано на скопированные сообщения оригиналаitem EntryID (потому что он изменяется после копирования сообщения)
Dim objCopy As Outlook.MailItem
Dim EntryID2Property As Outlook.UserProperty
Set objCopy = sourceFolderMail.Copy
Set EntryID2Property = objCopy.UserProperties.Add("EntryID2", olText)
EntryID2Property.Value = sourceFolderMail.EntryID
objCopy.Save
objCopy.Move destinationFolder
Можно добавить пользовательское свойство и затем сравнить его с исходным EntryID
If (sourceFolderMail.Subject = destinationFolderMail.Subject) And (sourceFolderMail.EntryID = destinationFolderMail.UserProperties.Find("EntryID2")) Then
К сожалению, сравнение пользовательских свойствтак же медленно, как SendOn.Я продолжаю искать лучший способ обнаружить скопированное письмо после сравнения его с оригинальным элементом.