I'm planning to develop a VSTO Outlook add in to generate some statistics on mails (count of mails by day, month, dayOfWeek, domain, sender, attachment# - that kind of thing).
I can iterate each mail folder and individual mails to gather these statistics, but having done this once, I don't want to have to do a full iteration again.
I'd like to be able to query the mailboxes e.g.
"Show me all of the mails received/sent since %DateTime%", or better,
"Show me all of the mails received/sent since %Mail_Identifer%".
Is this kind of querying possible or some other mechanism that will allow me skip over 'old' mails?
I'm using VS2008 and targeting Outlook 2003.
How about a query using the Items.Find method? See also:
Doing more with Outlook filter and SQL DASL syntax
Filtering items using query keywords
Filtering items using string comparison
Other examples
Related
Is there a way to get the itemId of the item you are replying/forwarding to in compose mode using the Office-JS library or EWS? I want to be able to get the itemid of the email or meeting invite that I am replying/forwarding.
OfficeJS doesn't provide anything for that. Basically your add-in is run under the context of a specific item in Outlook (currently selected). The best what you could do is to use EWS by calling Office.context.mailbox.makeEwsRequestAsync or Graph API (for Office365 users). You may take a look at the EWS - Determine if an e-mail is a reply or has been forwarded thread, you are interested in getting the In-Reply-To field. Note that In-Reply-To is an optional field so it may not always be populated.
Using office Outlook, we can find the 'Memberships' tab when we click and expand a contact, this 'Memberships' tab shows the list of emails that the user is subscribed to.
For example, Employee X (x.x#zcompany.com / id123#zcompany.com) under the Data Department of Z Company is subscribed to the following distribution groups:
datateam#zcompany.com
allemployeees#zcompany.com
dataweekly#zcompany.com
it.uk#zcompany.com
znewsletter#zcompany.com
I would like to get the list of emails the user is subscribed to by inputting either the user's email or user's organization ID.
I found a few potential solutions but do not know exactly how to implement them:
Outlook Interop GetMemberOfList() and GetExchangeDistributionList()
Using Microsoft Graph API
VBA automation for Outlook
Reverse engineering using ExchangePowershell
Using RPA to imitate user actions on Outlook
Wonder if someone with experience doing this can provide some advice? Thanks in advance.
In OOM, call Application.Session.CreateRecipient, Recipient.Resolve, Recipient.AddressEntry.GetExchangeUser(). ExchangeUser exposes GetMemberOfList() method, which returns IAddressEntries object.
Note: This particular issue has significant impact on our customers, which translates to high business impact with direct consequences on revenue.
TL;DR.
How can our Office add-in for Outlook, when a user interacts with our add-in while composing an email draft, minimize the amount of time it takes before the EWS GetItem API will return an OK response for the itemId we receive from Office.context.mailbox.item.saveAsync()?
If it turns out that our add-in has no control over when the item will be persisted to EWS, then what could an end-user do to speed this up?
We are looking for either (a) a technical solution, or (b) messaging to instruct our customers on how to mitigate/fix/work around this issue.
End-User Impact
Some of our customers are unable to send emails using our Office add-in for Outlook, or have to wait an exceedingly long time (> 2 minutes) before their email will send.
Our Goal
We want all of our customers to be able to send emails using our add-in, without having to wait for an unreasonable amount of time.
Additional Context
Based on our logs and customer reports, this issue only exists in the Outlook 2016 for Windows desktop application. We have no evidence to suggest the issue is present in any other version of Outlook, including Outlook 2013 or Outlook for Mac, however it is possible that the issue may be present in those clients as well.
Overview of our add-in
Our add-in integrates with Compose mode to provide additional functionality while composing email messages, such as templates, follow-ups, open and click tracking, and scheduling.
Our add-in works in tandem with our SaaS product like this:
Our add-in sets EWS extended properties on the email message with metadata indicating which features are enabled on that message.
Our SaaS product, out of band, is configured to read from the customer's mailbox via the EWS API. When it encounters EWS extended properties our Office add-in has written, it triggers the code paths to satisfy the desired behavior.
Root Cause Analysis
The root cause of our problem is our interaction with EWS in Outlook 2016 for Windows. In order to successfully interact with EWS to read/write to a mailbox item, it must be aware of that item.
The documentation for Office.context.mailbox.item.saveAsync() says:
In Outlook Web App or Outlook in online mode, the item is saved to the server. In Outlook in cached mode, the item is saved to the local cache.
It goes on further to say:
Note: If your add-in calls saveAsync on an item in compose mode in order to get an itemId to use with EWS or the REST API, be aware that when Outlook is in cached mode, it may take some time before the item is actually synced to the server. Until the item is synced, using the itemId will return an error.
Thus, we have concluded that Office.context.mailbox.item.saveAsync(), although it does indeed return an eventually valid itemId, does not guarantee that any subsequent EWS interaction will succeed. So far, we have found no way to accelerate the process of the Outlook client actually making EWS aware of the mailbox item.
Mitigation
We have attempted to mitigate this problem by polling EWS GetItem to attempt to obtain a ChangeKey for the item with the itemId we receive from Office.context.mailbox.item.saveAsync(). While we have seen that this does eventually succeed, it may take a minute or longer before this occurs. That is simply far too much time for our customers to have to wait.
Understanding "online mode" vs "cached mode"
If the Outlook 2016 for Windows desktop client is in "cached mode", is there anything the user can do to:
…know whether the client is in "cached mode" or "online mode"?
…attempt to force the client into "online mode"?
There is no way to speed this up in cached mode. Unfortunately this is a limitation of saveAsync in compose mode. Some things of note:
1) The EWSId is only valid while the item is a draft. After it is sent, when the item is in sent items, it will have a new EWSId which is not obtainable from the Office.js
2) Could you save your information into the custom properties, instead of the EWS Extended Properties. (Office.context.mailbox.item.customProperties) https://dev.office.com/reference/add-ins/outlook/1.5/CustomProperties?product=outlook
These properties will be saved to the mail in the sent item, but will NOT be transmitted. Then could you find those properties
These are stored as a JSON dictionary on the item in Key/Value pairs. The name of the mapi property is "cecp-[extension id from manifest]" (in PS_PUBLIC_STRINGS)
https://msdn.microsoft.com/en-us/library/office/cc842512.aspx
3) It does kind of sound like a better way to solve this would be an Office.js function that gives write access to this? (though we don't completely understand your scenario). Request for new features should go through UserVoice:
https://officespdev.uservoice.com/forums/224641-general/category/131778-outlook-add-ins.
4) Being in Online Mode would greatly mitigate the time. A User can know whether or not he or she is in online mode, but an Add-in cannot.
https://support.office.com/en-us/article/Turn-on-Cached-Exchange-Mode-7885af08-9a60-4ec3-850a-e221c1ed0c1c
Additionally, the status bar will say "Connected to Microsoft Exchange" in cached mode, and "Online with Microsoft Exchange" in online mode.
Switching to Online mode, removes a lot of the benefits that cached mode has. Cached mode is default in Outlook 2016.
I'm using Dynamics CRM 2015 (7.0.2.53) and Outlook 2016 (16.0.7766.7080) with the CRM for Outlook (7.1.1.3113) addin.
What I am trying to achieve is to give users the ability to specify an Activity Category against an email which they Track and Set Regarding from Outlook.
Currently, upon tracking and setting regarding on an email in Outlook, an Email Activity is created against the specified Entity record (let's say an Opportunity) in CRM, which is fine. The problem is that I cannot find any way to allow the user to specify an Activity Category for that created Activity either during the Track/Set Regarding process, or even after the Activity is created in CRM.
Is what I'm trying to achieve possible and if not, is there any other way to achieve a similar result, so that users can specify some value from a set of options against an email when they track it from Outlook to CRM, so that value can then be used for reporting purposes?
Basically there is no way of adding some custom functionality to Tracking Emails from Outlook. So you cannot add anything in Outlook plugin that will allow you to perform some operation on CRM side to set the Category right.
You can always make a plugin/workflow on Email creation in CRM and based on some email properties (topic, content, recipients etc.) set this category by youself - but of course users still will be unable to change it.
When email is created in CRM, it's disabled (because it usually already has been sent), but you can still modify it using workflows and dialogs. So you can always create a Dialog (https://msdn.microsoft.com/en-us/library/gg509010.aspx) and there you can prompt for proper category and set it on the email. So I can see a scenario like that - you have a view of Emails that are not categorized (or a Queue, where you put them in a plugin when user is tracking email from outlook). You pick Email, click "Start Dialog" which will be called "Set Category" or whatever, and set the category. Of course after this operation Email will vanish from the view. You can always create a reminder for the users to set the category for their mails, this should be included in new users training etc. Without any hardcore custom coding I think that's the only thing you can do (because if you don't mind writing more complex stuff you can always prepare some custom HTML5 control on Email form that will allow you to set the category field).
We are constructing an application that will be interacting with Exchange 2007 calendar functions. We will be using the Outlook Redemption Objects dll’s. Our design relies upon the outlook 2007 meeting Category features. We would like to ensure that specific mailboxes have a standard set of category names and colors.
We can’t rely on users to set these up. We also can’t rely on users running the exchange client, many users will be on MAC’s and will be using OWA to manage their calendar.
As I understand it the master category list is stored in each users mailbox in an hidden message in a property named IPM.Configuration.CategoryList. I haven’t found any reference on how to set this yet.
The only things that I have found to help us are:
Group policy objects: http://technet.microsoft.com/en-us/library/cc179073.aspx As I understand this, it won’t manage the color’s and relies upon the exchange client.
A third party tool - http://www.vboffice.net/product.html?id=2006063&cmd=detail&lang=en&pub=6 The enterprise edition appears to do what we want but is expensive for a once per mailbox operation on 100 or so mailboxes.
Basically, our preferred solution is to be able to produce a script that accepts a mailbox name and sets up a standard master category list.
we were able to accomplish our task using the code at http://gsexdev.blogspot.com/2007/08/adding-categories-to-master-categories.html
AFAIK, the categories for mail box items are stored in local outlook profile and not on the exchange server.Before Ol 2K7, these were stored in registry so I doubt if category master list can be set on E2K7.