Скопируйте старые письма (> 6 месяцев) из Outlook во внешнее местоположение с помощью надстройки Outlook - PullRequest
0 голосов
/ 09 января 2019

Мы создали надстройку для outlook для архивации неактивных писем в жестком диске. Все работает нормально, за исключением сообщений электронной почты, которые не отображаются в папке outlook, поскольку они старше 6 месяцев (или какой-либо другой настройки, которую они использовали).

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

For i = 1 To NumberOfFolders
   FolderTitle = objFolder.Folders(i).Name.ToString
   FolderTitle = RemoveSpecialChars(FolderTitle)
   Dim FolderPath As String
   FolderPath = Link & FolderTitle & "\"

   If Not System.IO.Directory.Exists(FolderPath) Then
      MkDir(Link & FolderTitle)
   End If

   emailorder = 0

   For Each Item In objFolder.Folders(i).Items
      emailorder = emailorder + 1
      Title = Strings.Right("000" & emailorder, 4) & " - " & RemoveSpecialChars(Item.Subject)
      path = FolderPath & Title & ".msg"
      Item.SaveAs(path)
      ProgressValue = ProgressValue + 1
      ProgressBarArchiving.Value = ProgressValue
   Next
      objFolder.Folders(i).Delete()
      NumberOfFolders = objFolder.Folders.Count
      If NumberOfFolders > 0 Then
         i = 0
      Else
         MsgBox(ProgressValue & " e-mails archived")
         Me.Close()
         Exit Sub
      End If
   Next

Таким образом, я ищу решение, в котором я могу найти и скопировать электронные письма, которые не видны в Outlook для пользователя, или где я могу сделать все электронные письма видимыми на уровне папок, чтобы скопировать их без перегрузки. почтовый ящик с большим количеством старых писем.

В качестве теста я создал следующее (msgbox просто посмотреть, что происходит:

Dim Session As RDOSession = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = app.Session.MAPIOBJECT

Dim store As RDOExchangeMailboxStore = Session.Stores.DefaultStore
Dim storeID As String = store.EntryID
MsgBox("StoreID: " & storeID)

Dim FolderTest As RDOFolder
FolderTest = Session.PickFolder()
Dim FolderTestID As String = FolderTest.EntryID
MsgBox("FolderTestID: " & FolderTestID)

Dim MAPI_NO_CACHE As Integer
'Dim MAPI_BEST_ACCESS As Integer

Dim FolderTest2 As RDOFolder = Session.GetFolderFromID(FolderTest.EntryID,, MAPI_NO_CACHE)
Dim NumItems As Long = FolderTest2.Items.Count
MsgBox("NumItems: " & NumItems)

For Each Item In FolderTest2.Items
   MsgBox(Item.Subject)
Next

1 Ответ

0 голосов
/ 10 января 2019

На уровне Extended MAPI (только C ++ или Delphi) вам нужно будет открыть папку в онлайн-режиме, минуя кэшированное хранилище - вы можете сделать это, используя флаг MAPI_NO_CACHE при вызове IMsgStore::OpenEntry. Затем, когда вы вызовете IMAPIFolder :: GetContentsTable , вы получите все элементы в папке с удаленного сервера.

Если C ++ или Delphi не являются опцией, вы можете использовать Redemption (любой язык) - вы можете создать экземпляр объекта RDOSession , установите для его свойства RDOSession.MAPIOBJECT значение Application.Session.MAPIOBJECT из OOM, чтобы убедиться, что они совместно используют один и тот же сеанс MAPI, затем вызовите RDOSesssion/RDOStore.GetFolderFromID, указав идентификатор записи папки, а также MAPI_NO_CACHE (0x200) или с флагами MAPI_BEST_ACCESS (0x10), чтобы открыть папку в онлайн режиме. Дополнительным преимуществом является то, что вы можете запустить этот код во вторичном потоке (OOM не позволит вам сделать это).

Вы также можете использовать Redemption, чтобы выяснить, действительно ли нужно открывать папку в онлайн-режиме - RDOExchangeMailboxStore . DaysToKeepOffline / MonthsToKeepOffline. Если MonthsToKeepOffline == 0, все элементы кэшируются и доступны из локального кэшированного хранилища, не открывая родительскую папку в онлайн-режиме.

...