Find item by original filename with Exchange Web Services - exchange-server

We used to have exchange 2003, and my webapp used webdav to create appointments in it. When an appointment was made I gave it a filename (whatever.eml) with a unique id that matched the database entry in my webapp for that event, so if I needed to later edit or delete it, I could easily do so by using the id to get the filename. We have since upgraded to exchange 2010 and I have to now use exchange web services and CreateItem to add a new appointment. I can simply store the id and changeid of the item when they're created to use to update or delete them later, but for the older appointments created via webdav, how do I refer to them (to update, or to find so I can get all their ids) when all I have is the filename?

Related

How to create a WorkItem in Azure DevOps based off new email in Shared Inbox, but replies to emails stay within same task

I'm currently trying to set up a workflow within Microsoft Power Automate to do the following:
If an email is sent to a shared email box create a new task in DevOps
If someone replies back to that initial email - any responses to that thread will be tracked in the original task, and no additional tasks will be created from that chain.
Right now I'm leveraging the template that Microsoft provides called "Create a workitem in Azure DevOps when new email arrives in shared mailbox", but it creates additional tasks anytime someone replies back to the thread.
Anyone have suggestions?
Thanks,
You could use a condition that checks the 'Conversation Id' then if it matches an Id from a previously sent email's Conversation Id it does nothing. If it is new, then you'll get a new task.
If you are archiving handled emails, you'll need to filter results from the archival folder.
Here it is mapped out with a SharePoint list mapping the Conversation Id from each email:
Once the details are logged, the Get Items action on the SharePoint list pulls all items. However in that pull it uses an ODATA Filter on:
conversationId eq '<Conversation Id from trigger>'
Then if the number of matches is more than the one that you've just registered in the list, that means it was a response and the flow will follow the "no" branch. However, if it is the only entry, a new work item can be made.
You can make this much more complicated, dependent on requirements, in many areas, as that why you are using Power Automate. For example you could make API (Graph) calls to get Shared Box emails, but this is simpler, and works on a free flow plan until they add a "Get Emails from a Shared Mailbox" connector.
It's not picture perfect, because it doesn't handle a changed subject line, but it does do the job required.

Microsoft Exchange Meeting Master Copy

I have a custom application with its own database and a connection to exchange through EWS. Part of this application is a meeting tool which allows users to import exchange meetings and auto invite the other users which also use my application. As part of this tool I need to keep my meetings up to date with exchange, basically maintaining a centralized meeting storage. I can't simply store the user's exchange credentials due to security concerns and I also cannot customize the EWS server in any significant way (ie I cannot add Delegate Access).
The problem is that I am currently simply forcing all users to login to EWS whenever the go to view a meeting's details and it will query EWS to get the details using that user's EWS credentials and access their copy of the meeting. The problem is that there is no guarantee that any user has the same meeting details as any other user. As is partially explained here. Is there any way I can force the EWS FindItem call to only use the meeting's public (master) properties? i.e. Whatever version of the meeting the organizer has sent out/updated. I just need all users to return the same details when they query for the same meeting.
One solution I've considered is adding a 'bot' user whenever a meeting is imported into my application, and then just always using that bot's version of the meeting. However, I would really prefer to do something more 'under the hood' that doesn't require this extraneous user.
Is there any way I can force the EWS FindItem call to only use the meeting's public (master) properties
No FindItem will only every return you information about what is in the Folder your trying to access. You might want to consider using GetUserAvailiblity to check the organiser https://msdn.microsoft.com/en-us/library/aa494212(v=exchg.80).aspx would be the closest. I would say to make your application work correctly is you need an Service account that has been given at least read access to every users calendar, you can then make a call to get the organiser version of the Appointment which will also contain the user responses. If your using Office365 then the new REST Api does facilitate this in a more secure way eg demon apps https://blogs.msdn.microsoft.com/exchangedev/2015/01/21/building-daemon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow/

Listing all current events using EWS Managed API

Our organization has an Exchange server, where each employee has a calendar. We want to make an application showing a list with the current event for every user. Is this possible using the EWS Managed API?
We also want to add a special icon whenever a user has a birthday. Can I somehow store and retrieve birthdays via Exchange, or do I need to create a birthday config file for my application only?
Answer to your first question "Yes" it is possible using the Managed API.
Yes you can store and retrieve birthdays via extended properties if the calendar doesnt already have one.

Exchange: Update GAL automatically

I'm working in a small app that needs to integrate contacts into my company Exchange server. I managed to "push" all this contacts into a user contacts list, but I'd need to share this contacts amongst everybody.
My question is: is there a way to automatically add a contact to the GAL, when this contact is added to the user contacts list?
This way, I would push contacts into a "user contact list" (let's say contacts#domain.com), and they would somehow be updated automatically into the GAL (if this makes sense).
So whenever a contact is added into "contacts#domain.com", this will be pushed into the GAL as well.
Unfortunately, there isn't a way to update the GAL trough Exchange Web Services, and after some research I was only able to push contacts into a user contact list, this is the reason why I'm looking for a solution like this.
Thanks for your time
My question is: is there a way to automatically add a contact to the GAL, when this contact is added to the user contacts list?
No when a user adds a contact to their contacts folder in their Mailbox this just creates an Exchange Store item for that user. A GAL contact is an Mail-enabled Active directory object that must be created using the Exchange Admin Console or Exchange management Shell.
You could create a client application that uses EWS to subscribe to a user contact folder (either push,pull or streaming) and then process any new entries and then create the Contact using the EMS new-mailcontact cmdlet https://technet.microsoft.com/en-us/library/bb124519%28v=exchg.150%29.aspx .(you need to build your own logic to avoid duplication etc).
Cheers
Glen

Different Unique Ids created using WebDAV and Exchange vs Outlook

I am creating an appointment in Exchange via WebDAV, but the UId created is not the same as if I create the appointment in Outlook. The UId I believe is the same as the GlobalObjectId and should be unique and not change.
The UId if created via WebDAV is:
CD0000008B9511D182D800C04FB1625DDD67374428B4C644A0A359A2586E30B3
The UId if created through Outlook is:
040000008200E00074C5B7101A82E008000000002005332BA3A8CA01000000000000000010000000DD67374428B4C644A0A359A2586E30B3
If I open the appointment created via WebDAV in Outlook and then save it again the UId changes which is annoying (The UId changes to one above beginning with 04).
The second half of the UIds are the same GUID {DD673744-28B4-C644-A0A3-59A2586E30B3} and never change. The document here http://msdn.microsoft.com/en-us/library/cc425490 (EXCHG.80).aspx explains how the GlobalObjectId is constructed. Outlook seems to follow these rules, but Exchange doesn't. I am using Outlook 2007 and Exchange 2007.
There seems to be a myriad of different ids that can be used to identify appointments and I'm just looking for one that stays the same so I can track the appointment over time.
If anyone can help to explain why this UId changes or a way of creating it so it doesn't change it would be much appreciated. My limitations are supporting Exchange 2003 SP2 and Outlook 2003.
Oh yes Id can change, it can depend on the client and the way that you access the items. It a right PITA
I think the link may should help you though , (not knowing excatly what you are doing).
There are mapi proerties that you can use as well but you may have to explain what you are doing a bit more ... are you only doing WebDav ?
How to use WebDav to match dav:href to Outolook Interop href value

Resources