Programmatically accessing archived mails in an Exchange folder - outlook

I am trying to access all the mails in a given folder via the ActiveX interface to Outlook 2013. I use the message API (MAPI) of Outlook to get the desired folder object.
However, when I go through all the items of this folder object, many messages are missing. Indeed, there are messages that are on the MS Exchange server that are not synchronized with Outlook because they are too old. (In Outlook, the folder ends with a link named 'Click here to view more on Microsoft Exchange'. When clicking on the link, the missing messages appear in Outlook. However they are not added to the folder object after this operation.)
How to access those messages? Is it possible via the Outlook ActiveX interface? If not, is there an equivalent interface to the MS Exchange server?

To access older (but not archived) emails, you can either
Set the Exchange account to sync all items in the Exchange account properties dialog. Outlook must be restarted.
Set the Exchange account to sync all items programmatically. You can do that using Extended MAPI (C++ or Delphi only), there is a flag that needs to be set in the MSEMS store profile section (the property tag is 0x66490003). Redemption (I am its author - any language) exposes the RDOExchangeMailboxStore.MonthsToKeepOffline / DaysToKeepOffline properties. Outlook must be restarted.
Open the parent folder in the online mode using the MAPI_NO_CACHE flag when calling IMsgStore::OpenEntry (Extended MAPI, C++ or Delphi only). Redemption (I am its author) lets you pass that flag when you open the folder using RDOSession.GetFolderFromID from any language.

Related

Accessing an Outlook Add-in via redemption

Is is possible to access an outlook add-in via redemption, rather than me adding the add-in to my application, I am not sure if this is possible.
Redemption is a wrapper around Extended MAPI, not Outlook. So, it doesn't provide anything for dealing with Outlook features like add-ins.
You can get the Outlook running instance or create a new one of none exists and then access the COM add-ins list. The COMAddIns property of the Application class returns a COMAddIns collection that represents all the Component Object Model (COM) add-ins currently loaded in Microsoft Outlook.
Private Sub CountCOMAddins()
MsgBox "There are " & Application.COMAddIns.Count & " COM add-ins."
End Sub

Update logged in user's signature in Outlook, Office 365 add in through a external rest service?

I have been asked to develop a add in to update user signatures from a external service, that service will be providing the data for the signature and I need to update the signature in outlook with html and data.
Is this possible with some kind of script or any api available in outlook addin to update signatures?
while searching I came across this it seems there is no api for it at the moment, is it possible with some sort of script?
All Outlook profiles in a Windows user account use the same path for the signature files. If the signatures are in the Signatures folder, they are available to all profiles set up in that Windows user account. See Multiple Profiles and Separate Signature Files for more information.
The default folder where Outlook email signature files are located is:
Windows XP:
C:\Documents and Settings\%username%\Application Data\Microsoft\Signatures
Windows 10 / 8 / 7 / Vista:
C:\Users\%username%\AppData\Roaming\Microsoft\Signatures
Also, you may find the How to Find the Outlook 2013 Signature Location article helpful.
Currently, updating existing signatures in registry from within an Outlook add-in is not supported.
We track Outlook add-in feature requests on our user-voice page. Please add your request there. Feature requests on user-voice are considered, when we go through our planning process.

Custom properties are not being saved immediately to Exchange Server in Outlook desktop 2016

My Outlook web add-in saves emails to an external application.Upon save, it will also write some custom information to exchange server using Office.js's customProps.saveAsync();. So next time the user open the same email, the add-in will look up the properties and if it is not null will remind the user the email has been saved.
Work like a charm in web browser(Office 365).
However in Windows Outlook desktop, the function performs strangely. If I save the email and then immediately move the email to another folder. The customProps.saveAsync(); will fail(nothing saved to exchange server). However, if I re-launch the add-in on the email before moving out to another folder, the custom info will be saved successfully.
Seems to me on Outlook desktop the custom properties will not be written to the exchange server immediately, instead, it will wait until it is being triggered(re-launch add-in etc I do not know the exact mechanism). However, if the email being moved to another folder right after being saved in an add-in, the pending function will be lost.
I found this describing seemingly similar behavior. So I then turned off the "cache" mode in outlook but the problem persisted.
I also tried using EWS's API to perform the "save custom properties", but the problem still persisted.
Am I missing somethinghere or it is Outlook desktop's bug?
You are not missing something - this is definitely a bug in Outlook Desktop. Thank you for reporting the issue. We are investigating and will work on a fix as quickly as we can.
As a workaround in the interim, you can switch messages within the same folder in order to trigger a save. The workaround you found of re-opening an Add-in may also work.

How to Detect if Office 365 web addin is installed or not?

We have a desktop app with which we want to integrate Office 365 calendar. We will have our users provide their consent by authorising the app in office 365. I wonder if I can use any specific permission and/or api that would help us know if our office 365 office.js addin is installed by that user. This works great with VSTO addin as we can get the info from system registry, however, as Office 365 addin is installed on cloud no such registry can be found and we won’t be able to know.
Exchange will create a subfolder for each installed web addin in a special folder named WebExtAddins. The folder is on the same level as the other special folders (e.g. the Inbox), but is hidden. You can see that folder (and its subfolders) in OutlookSpy (I am its author) - click IMsgStore button on the OutlookSpy ribbon, click "Open Folder", double click on the folder named WebExtAddins.
UPDATE April 2022 - it looks like Outlook no longer uses the WebExtAddins folder. Instead, the list of web addins is stored in a hidden (associated) message with the message class of "IPM.Configuration.ExtensionMasterTable" in the Inbox folder. The list is stored in the PR_ROAMING_XMLSTREAM binary property. The format of the property is not documented.
In EWS, the list of installed addins can be retrieved using the GetAppManifests operation. If you are using Outlook Object Model or Extended MAPI, your only option is parsing that blob.
For this particular case (figure out if a web addin is installed), the addin custom storage will be in a hidden (associated) message in Inbox folder with the message class of "IPM.Configuration.ClientExtension.<guid>", where <guid> is your addin's GUID. You should be able to asccess that hidden message using MAPIFolder.GetStorage("IPM.Configuration.ClientExtension.<guid>", olIdentifyByMessageClass) (where MAPIFolder is retrieved from Namespace.GetDefaultFolder(olFolderInbox))
It seems that there is no good way to check directly now. Just like you said,Office 365 add-in is installed on Cloud. Since it runs through a separate browser process (Like IE). After plug-ins are loaded, we typically see two IE processes in the process manager. Here's a detail. If your Office is 32-bit, then its core process will be a 32-bit one. You can see that if you load multiple plug-ins, the memory it uses will gradually increase. However, it is still a process.
Screenshot:
Also, if your Windows is 64-bit, it will create another 64-bit IE process which is actually a call relationship. As you can see from the diagram below, the 32-bit process is actually calling the 64-bit process.

Outlook 2013 VSTO Addin - How to check if the Mail view is selected?

In an Outlook 2013 VSTO addin (C#), I can check to see if the user is currently in the Calendar area/view by using "if(ActiveExplorer().CurrentView is CalendarView) ..."
How do I do something similar to check and see if the user is in the Mail view, where "Mail" is selected/blue at the bottom of the Outlook window and the user sees their Inbox items? There is no MailView type, or anything similar that I could find, to compare ActiveExplorer().CurrentView, etc., against.
Instead of using the CurrentView property of the Explorer class I'd suggest checking the DefaultItemType property of the Folder class. It returns a constant from the OlItemType enumeration indicating the default Outlook item type contained in the folder.
The CurrentFolder property of the Folder class returns a Folder object that represents the current folder displayed in the explorer. So, the code may look like the following one:
ActiveExplorer().CurrentFolder.DefaultItemType

Resources