Outlook desktop 2016 - Appointment Item.to.setAsync() not working - outlook

I am working on a outlook add-in and the desktop version of outlook is once again thwarting my plans.
I'm trying to set the attendees in an appointment. That works fine on the web version but on the desktop version, there is no 'attendees' field only a 'to' field and when i use the
Office.context.mailbox.item.requiredAttendees.setAsync(attendees, callback)
with the attendees (being an array of emails), the behaviour on desktop is that it adds the attendees to the 'to' field instead of setting it which is problematic when i want to reset the 'to' field through the add-in using the setAsync() method. I then tried to modify the 'to' field using the
Office.context.mailbox.item.to.setAsync(attendees, callback)
With hopes that it would bypass the problem but it seems that the mailbox.item does not have a field named 'to'.
Is this a bug of some sort or is this behaviour intended in which case I am doomed to suffer :(
Environment setup :
Microsoft Outlook 2016 (16.0.5182.1000) //
Exchange 2016 (build version 15.1.2375.7) on-premise

Related

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 blocked access to the following potentially unsafe attachments"

Recently, we have some users which suddenly got this massege:
"Outlook blocked access to the following potentially unsafe attachments"
(outlook 2010 plus)
I had tried all of this: https://support.microsoft.com/en-us/help/829982/outlook-blocked-access-to-the-following-potentially-unsafe-attachment
but nothing had changed...
I was able to permanently unblock files with specific extensions by applying the following procedure, that I found at sitepoint.com :
Close Outlook
Run your Registry Editor (regedit.exe)
Go to HKEY_CURRENT_USER/SOFTWARE/Microsoft/Office/XX/Outlook/Security, where XX corresponds with your version of Office
Create a new key of the type String Value, named Level1Remove
Add the extensions you want to unblock, separated by ; characters
(for example : .js;.vbs;.exe)
Restart Outlook
If that doesn't work, the issue is probably caused by one of Microsoft's June 2017 security patches. Instead of removing the security patch responsible, you might want to consider one of the fixes or workarounds mentioned here.
The update blocks access to attachments with long filenames and/or file names with consecutive periods
Remove this update to fix :-
(might want to decline these updates in WSUS to prevent re-installation)
Outlook 2007: KB3191898
Outlook 2010: KB3203467
Outlook 2013: KB3191938
Outlook 2016: KB3191932
Replaced with :-
Outlook 2010 KB4011042
Outlook 2013 KB3191849
Outlook 2016 Fixed in build 1706 - run Office update (note not fixed in Deferred channel)
No fix for Outlook 2007
We recently had the same issue, when I removed KB3203467 (Security Update for Microsoft Outlook 2010) - this resolved the issue immediately.
if this message comes "Outlook blocked access to the following potentially unsafe attachments" message in Outlook"
Outlook goto Junk option , Never block Option
click it
then file will accessible.
We have Outlook 1808 (Office 365 up-to-date as of March 2019) and we were still receiving this message with a pdf.
We just added the sender to the Safe Senders list and restarted Outlook:
Home -> Junk -> Junk E-mail Options -> Safe Senders -> Add the email address (this really should be a button)
Tick the 'Automatically add people I email to the Safe Senders List'

Programmatically accessing archived mails in an Exchange folder

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.

Getting a handle to the "CC", "FROM" and "TO" windows in outlook

I am working on an outlook addin in which I need to get a handle to the "CC", "FROM" and "TO" windows in the reading pane.
The approach that was taken in the addin is to use FindWindowEx WIN API and pass in the name as a parameter. But the problem is that the name must be in the UI language that outlook is using.
I am trying to figure a way to get these handles without using the name, but so far no luck. I see that "TO", "FROM" and "CC" are all of the same Class ("Static").
Is there some API which will give me access to these windows without me having to use the name? Or do these windows have some ID which is independent of the language that Oultook is running in.
One constraint is that the addin must work Outlook 2003 and above.
EDIT:
The addin adds a button in the reading pane for each email. When clicked the current email (displayed in the reading pane) is checked and based on its contents somethings are done.
Basically, what you do is NOT use the name, use the hierarchical class name structure.
I.e. the first RichEdit20WPT inside the inspector's rctrl_renwnd32\AfxWndW\AfxWndW#32770 is always the TO: field in. OL2003 and OL2010 have slightly different structures, use any decent windows spying tool to figure it out.

Resources