Outlook VBA макрос для синхронизации двух папок - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь синхронизировать две папки 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.Я продолжаю искать лучший способ обнаружить скопированное письмо после сравнения его с оригинальным элементом.

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете использовать событие Items.ItemAdd в исходной папке, чтобы скопировать элемент, переданный обработчику события.

Ваш код, конечно, должен работать, когда в исходную папку приходит новое сообщение.

...