使用Outlook加载项将旧电子邮件(> 6个月)从Outlook复制到外部位置

时间:2019-01-09 09:46:45

标签: visual-studio email outlook outlook-addin

我们为Outlook创建了一个外接程序,用于将无效的电子邮件存档到硬盘驱动器位置。一切正常,除了因时间超过6个月(或使用的设置)而无法在Outlook文件夹中显示的电子邮件之外。

由于不希望更改设置以在服务器上显示所有电子邮件,因此,我宁愿尝试在文件夹级别的插件中进行设置,或者采用另一种解决方法来仍然复制不可见的电子邮件

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 :(得分:0)

在扩展MAPI级别(仅C ++或Delphi)上,您需要绕过缓存存储以在线模式打开文件夹-您可以通过在调用{{1}时使用MAPI_NO_CACHE标志来做到这一点。 }。然后,您致电IMAPIFolder::GetContentsTable时,将从远程服务器获取文件夹中的所有项目。

如果没有C ++或Delphi选项,则可以使用Redemption(任何语言)-您可以创建RDOSession对象的实例,并将其IMsgStore::OpenEntry属性设置为{{ 1}},以确保两者共享相同的MAPI会话,然后调用RDOSession.MAPIOBJECT并指定文件夹条目ID以及Application.Session.MAPIOBJECT(0x200)或与RDOSesssion/RDOStore.GetFolderFromID(0x10 )标志以在线模式打开文件夹。另一个优势是您可以在辅助线程中运行该代码(OOM不允许您这样做)。

您还可以使用“兑换”来确定是否确实需要在联机模式下打开文件夹-RDOExchangeMailboxStoreMAPI_NO_CACHE / MAPI_BEST_ACCESS。如果为DaysToKeepOffline,则所有项目都将被缓存,并且可以从本地缓存存储区进行访问,而无需在联机模式下打开父文件夹。