Search code examples
c#exchangewebservices

Set custom message for Follow-up text on email - EWS c#


I have developed an engine to automatically process the emails sent to a particular mailbox using EWS (Exchange Web Services) Push Subscription. Everything is working fine except, I need to set the follow-up flag text with some custom message like we do in outlook (screen-shots below):

Custom text:

enter image description here

Sample email after setting the flag text:

enter image description here

I am using below code to do that, however the text is not displayed on email, only dates are reflecting with below code:

    public bool MoveToFolder(EmailMessage mail, string folderName, bool MarkForFollowUp, string FollowUpText)
    {
        try
        {
            var folderView = new FolderView(100);
            if (MarkForFollowUp)
            {
                try
                {
                    ExtendedPropertyDefinition followUpTextFlag = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "ChangeDetails", MapiPropertyType.String);
                    Flag flag = new Flag();
                    flag.FlagStatus = ItemFlagStatus.Flagged;
                    flag.StartDate = DateTime.Now;
                    flag.DueDate = DateTime.Now.AddHours(1);
                    mail.Flag = flag;

                    workLog.WriteVerbose($"Setting flag with followup-text: {FollowUpText}", "Notify.cs > MoveToFolder()");
                    mail.SetExtendedProperty(followUpTextFlag, FollowUpText);
                    mail.Update(ConflictResolutionMode.AutoResolve);
                    workLog.WriteVerbose($"Message follow-up flag set successfully.", "Notify.cs > MoveToFolder()");
                }
                catch (Exception ex)
                {
                    // Ignore error while settings the flag
                    workLog.WriteVerbose($"Error occurred while setting the follow-up flag. Reason: {ex.Message}", "Notify.cs > MoveToFolder()");
                }
            }

            folderView.PropertySet = new PropertySet(BasePropertySet.IdOnly);
            folderView.PropertySet.Add(FolderSchema.DisplayName);
            folderView.Traversal = FolderTraversal.Deep;

            FindFoldersResults findFolderResults = _service.FindFolders(WellKnownFolderName.Root, folderView);
            if (findFolderResults == default(FindFoldersResults))
            {
                return false;
            }

            try
            {
                FolderId folderId = findFolderResults.Cast<Folder>().FirstOrDefault(Folder => Folder.DisplayName == folderName).Id;
                mail.Move(folderId);
                return true;
            }
            catch
            {
                return false;
            }
        }
        catch (Exception)
        {
            return false;
        }
    }

Solution

  • You need to set the PidLidFlagRequest extended property https://learn.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidflagrequest-canonical-property with the text you want to show eg

            ExtendedPropertyDefinition followUpTextFlag = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "ChangeDetails", MapiPropertyType.String);
    
            ExtendedPropertyDefinition PidLidFlagRequest = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Common, 0x8530, MapiPropertyType.String);
            ExtendedPropertyDefinition PidLidFlagString = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Common, 0x85C0, MapiPropertyType.Integer);
    
            Flag flag = new Flag();
            flag.FlagStatus = ItemFlagStatus.Flagged;
            flag.StartDate = DateTime.Now;
            flag.DueDate = DateTime.Now.AddHours(1);
            mail.Flag = flag;
            mail.SetExtendedProperty(PidLidFlagRequest, "PidFlag Blah Blah");
            mail.SetExtendedProperty(PidLidFlagString, 0);
            mail.SetExtendedProperty(followUpTextFlag, "Blah Balh");
            mail.Update(ConflictResolutionMode.AutoResolve);