Skip to main content

Looking at the Email sentiment analysis properties in Office365 with EWS and REST

Sentiment analysis which means looking at a block of text and telling if this is Negative or Positive (okay oversimplified but the Wikipedia page has a good basic introduction into this https://en.wikipedia.org/wiki/Sentiment_analysis) has been one of the standout applications of Machine learning for the last couple of years. If your a observer of what MAPI properties are available on Messages in your Inbox in Office365 like me you may have noticed a new one appear recently on some messages which is the Sentiment analysis of the body Text of an email eg


Before I go any further everything I'm talking about in this post is from observation only and none of this as far as I know is documented anywhere. The entity extraction part of this is documented and is a relative new feature that can be used in Addin's (or other applications) https://docs.microsoft.com/en-us/outlook/add-ins/match-strings-in-an-item-as-well-known-entities . Entity extraction is one of those cool power up features that allows you to write more useful Addins with a smaller amount of code and coding effort(eg if you had to parse this stuff out yourself and do the analysis it would be a lot of time/effort/testing etc)  so this type of machine learning extraction is just another evolution of this.

What you find in this named property (when it is set which is not always the case) is a JSON payload with the emotiveprofile returned from the ML process. If you going to use the in EWS or REST because of the size of the payload you will need to do a GetItem (in EWS) or a single Item GET in REST. For performance reasons when you do this with either of these API's you should take advantage of the Batching feature available. Batching is a little new in the Graph API and allows you to retrieve up to 20 items in a single call, in EWS there is no limit but realistically you should keep you calls to under 50 to ensure you don't get throttled see .

I've put together two samples of using this property the first is issuing EWS, for this I've modified the Generic Folder Item enum script I recently posted. To returned the sentiment property using this script just use the -ReturnSentiment switch. For REST I've modified my Exch-Rest library to be able to return this property which included implementing batching in the library to give the best performance.  What both of these scripts do is request the Extended property relating to the sentiment analysis and then parse the JSON using the ConvertFrom-Json cmdlet. The data is then published as first class properties on the Item with the polarity (eg Positive or Negative) published as a separate property.


Some examples of these in action

EWS - Source Script https://github.com/gscales/Powershell-Scripts/blob/master/GenericFolderAndItem.ps1

Invoke-GenericFolderItemEnum -MailboxName gscales@datarumble.com -FolderPath \Inbox -Credentials $creds -MaxCount 5 -ReturnSentiment -FullDetails | Where-Object {@_.Sentiment -ne $null} |  Select Subject,Sentiment,EmotiveProfile | fl


REST - Source Exch-REST Module https://www.powershellgallery.com/packages/Exch-Rest and https://github.com/gscales/Exch-Rest
https://github.com/gscales/Exch-Rest
The -ReturnSentiment switch in Get-EXRLastInboxEmail, Get-EXRWellknowFolderItems and Get-EXRFolderItems will return the extracted sentiment and EmotiveProfile from the messages


Get-EXRLastInboxEmail -MailboxName jcool@datarumble.com -Focused -ReturnSentiment | Select Subject,Sentiment,EmotiveProfile | fl





Popular posts from this blog

Export calendar Items to a CSV file using Microsoft Graph and Powershell

For the last couple of years the most constantly popular post by number of views on this blog has been  Export calendar Items to a CSV file using EWS and Powershell closely followed by the contact exports scripts. It goes to show this is just a perennial issue that exists around Mail servers, I think the first VBS script I wrote to do this type of thing was late 90's against Exchange 5.5 using cdo 1.2. Now it's 2020 and if your running Office365 you should really be using the Microsoft Graph API to do this. So what I've done is create a PowerShell Module (and I made it a one file script for those that are more comfortable with that format) that's a port of the EWS script above that is so popular. This script uses the ADAL library for Modern Authentication (which if you grab the library from the PowerShell gallery will come down with the module). Most EWS properties map one to one with the Graph and the Graph actually provides better information on recurrences then...

Downloading a shared file from Onedrive for business using Powershell

I thought I'd quickly share this script I came up with to download a file that was shared using One Drive for Business (which is SharePoint under the covers) with Powershell. The following script takes a OneDrive for business URL which would look like https://mydom-my.sharepoint.com/personal/gscales_domain_com/Documents/Email%20attachments/filename.txt This script is pretty simple it uses the SharePoint CSOM (Client side object Model) which it loads in the first line. It uses the URI object to separate the host and relative URL which the CSOM requires and also the SharePointOnlineCredentials object to handle the Office365 SharePoint online authentication. The following script is a function that take the OneDrive URL, Credentials for Office365 and path you want to download the file to and downloads the file. eg to run the script you would use something like ./spdownload.ps1 ' https://mydom-my.sharepoint.com/personal/gscales_domain_com/Documents/Email%20attachments/filen...

Sending a MimeMessage via the Microsoft Graph using the Graph SDK, MimeKit and MSAL

One of the new features added to the Microsoft Graph recently was the ability to create and send Mime Messages (you have been able to get Message as Mime for a while). This is useful in a number of different scenarios especially when trying to create a Message with inline Images which has historically been hard to do with both the Graph and EWS (if you don't use MIME). It also opens up using SMIME for encryption and a more easy migration path for sending using SMTP in some apps. MimeKit is a great open source library for parsing and creating MIME messages so it offers a really easy solution for tackling this issue. The current documentation on Send message via MIME lacks any real sample so I've put together a quick console app that use MSAL, MIME kit and the Graph SDK to send a Message via MIME. As the current Graph SDK also doesn't support sending via MIME either there is a workaround for this in the future my guess is this will be supported.
All sample scripts and source code is provided by for illustrative purposes only. All examples are untested in different environments and therefore, I cannot guarantee or imply reliability, serviceability, or function of these programs.

All code contained herein is provided to you "AS IS" without any warranties of any kind. The implied warranties of non-infringement, merchantability and fitness for a particular purpose are expressly disclaimed.