'Copy old emails (> 6months) from Outlook to external location with outlook add-in
We have created a add-in for outlook to archive inactive emails to a harddrive location. It all works fine, except for e-mails that are not visible in the outlook folder because they are older than 6 months (or whatever setting they used).
Since it is not desirable to change the settings to show all e-mails on the server, I would rather try to set this in the plugin on folder level, or have another workaround to still copy e-mails that are not visible.
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
So I am looking for a solution where I can find and copy the e-mails which are not visible in outlook for the user, or where I can make all e-mails visible on folder level to copy all of them without overloading the mailbox with a lot of old e-mails.
As a test I created the following (msgbox are just to see what happens:
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
Solution 1:[1]
On the Extended MAPI level (C++ or Delphi only), you would need to open the folder in the online mode bypassing the cached store - you can do that by using the MAPI_NO_CACHE flag when calling IMsgStore::OpenEntry
. When you then call IMAPIFolder::GetContentsTable, you will get all items in the folder from the remote server.
If C++ or Delphi are not an option, you can use Redemption (I am its author - any language) - you can create an instance of the RDOSession object, set its RDOSession.MAPIOBJECT
property to Application.Session.MAPIOBJECT
from OOM to make sure the two share the same MAPI session, then call RDOSesssion/RDOStore.GetFolderFromID
specifying the folder entry id as well as MAPI_NO_CACHE
(0x200) or'ed with MAPI_BEST_ACCESS
(0x10) flags to open the folder in the online mode. An extra advantage is that you can run that code in a secondary thread (OOM won't let you do that).
You can also use Redemption to figure out whether the folder actually needs to be opened in the online mode - RDOExchangeMailboxStore.DaysToKeepOffline
/ MonthsToKeepOffline
. If MonthsToKeepOffline == 0
, all items are cached and can be accessed from the local cached store without opening the parent folder in the online mode.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |