收到冷門需求。

公司人資會寄一種很炫的通知信,在收信匣萬黑叢中一點紅,十分顯眼。業務單位看到了,舉手說他們也要,希望某系統的重要通知信也能比照變成紅色主旨並跳出提醒,力求從茫茫信海脫穎而出:(如下圖所示)

紅色主旨之前看過,但從沒去想是怎麼辦到的。研究後發現是個 Outlook 小技巧 - 寄信時為信件指定到期日,並且是過去的時間,例如: 14:00 寄出 13:00 到期的信件,則郵件在 Outlook 收信匣的寄信人與主旨便會以紅色呈現。參考:How To Send An Email With Subject Line In Red Color In Outlook?

這個用 Outlook 手工操作很簡單,但查了半天找不到現成範例,花了點工夫才研究出如何用 C# 實現相同效果。

要動用 Exchange/Outlook 專屬功能,不能透過 SMTP 寄信,需改用 EWS (Exchange Web Service) 程式庫,EWS 可透過 NuGet 安裝:

程式範例如下:

class Program
{
    private static string ewsUrl = "https://your-exchange-server/ews/Exchange.asmx";

    static ExtendedPropertyDefinition PidTagFlagStatus = 
        new ExtendedPropertyDefinition(0x1090, MapiPropertyType.Integer);
    static ExtendedPropertyDefinition PidTagToDoItemFlags = 
        new ExtendedPropertyDefinition(0x0E2B, MapiPropertyType.Integer);
    static ExtendedPropertyDefinition PidLidTaskDueDate = new ExtendedPropertyDefinition(
        DefaultExtendedPropertySet.Task, 0x8105, MapiPropertyType.SystemTime);

    static void Main(string[] args)
    {
        var ews = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
        //使用指定身分登入,密碼如需存於設定檔,需加密
        //ews.Credentials = new WebCredentials("userid", "passwd", "domain");
        ews.UseDefaultCredentials = true; //用目前執行程式的AD帳號登入EWS
        ews.Url = new Uri(ewsUrl);
        var msg = new EmailMessage(ews);
        msg.ToRecipients.Add("user@mail.com");
        msg.Subject = $"Outlook 郵件醒目標示測試(紅色標題+提醒視窗) {DateTime.Now:HHmmss}";
        msg.Body = new MessageBody(BodyType.HTML, "<p style='color:blue'>Hello, world!</p>");
        msg.IsReminderSet = true;          
        msg.Importance = Importance.High;
        msg.SetExtendedProperty(PidTagFlagStatus, 2);
        msg.SetExtendedProperty(PidLidTaskDueDate, DateTime.Now.AddDays(-1));
        msg.SetExtendedProperty(PidTagToDoItemFlags, 1);
        msg.Send();
    }
}

程式看來很簡單,但沒找到現成的 C# 範例,只好由相關文件逐步縮小關鍵字範圍,費了點工夫總算拼湊出可用版本。最奧妙部分莫過 0x1090、0x0E2B、0x8105 等像咒語的參數。 它們是 Exchange 郵件的延伸屬性,我找到一份完整 PDF 文件:Exchange Server Protocols Master Property List ,本需求動用到以下三個:

  • PidTagFlagStatus:1-Flagged Complete, 2-Flagged 參考
  • PidTagToDoItemFlags:1-TimeFlagged, 8-RecipientFlagged 參考
  • PidLidTaskDueDate:到期日 參考

學會一些 EWS 進階技巧,打完一個跨界小副本,收工。

Sample code of sending a email with red subject to Outlook. The effect is achieved by EWS and Exchange extended property.


Comments

Be the first to post a comment

Post a comment