【问题标题】:how to get latest email from outlook interop email如何从 Outlook 互操作电子邮件中获取最新电子邮件
【发布时间】:2020-09-28 04:28:36
【问题描述】:
   outlook.MAPIFolder selectedFolder = m_applicationObject.ActiveExplorer().CurrentFolder;
                        string expMessage = "Your current folder is " + selectedFolder.Name + ".\n";
                        string itemMessage = "Item is unknown.";
                        try
                        {
                            if (m_applicationObject.ActiveExplorer().Selection.Count > 0)
                            {
                                Object selObject = m_applicationObject.ActiveExplorer().Selection[1];
                                if (selObject is outlook.MailItem)
                                {
                                    outlook.MailItem mailItem = (selObject as outlook.MailItem);
                                    itemMessage = " The subject is " + mailItem.Subject + ". \n";
                                    itemMessage += " The Email is " + getSenderEmailAddress(mailItem)  + ".\n";
                                    itemMessage += " The name is " + mailItem.SenderName + ".\n";
                                    itemMessage += " The Desc is " + mailItem.Body  + ".\n"; 
                                    //body consist of too many emails and its replies. is there any way i can extract latest email content from mailitem.Body
                                    //  mailItem.Display(false);
                                }
                            }
                     }

在上面的代码中,我从 Outlook 插件中提取电子邮件详细信息 正文包含过多的电子邮件及其回复。有什么办法可以从mailitem.Body提取最新的电子邮件内容

【问题讨论】:

    标签: c# outlook outlook-addin office-interop


    【解决方案1】:

    Outlook 对象模型不提供开箱即用的任何东西。提取消息正文以获取最新回复没有简单而简单的方法。

    但是,您可以使用以下方式提取最新回复。

    1. 通过对话提取每封电子邮件/回复。 MailItem.GetConversation 方法获取一个Conversation 对象,该对象代表该项目所属的会话,例如:
    void DemoConversation() 
    { 
     object selectedItem = 
     Application.ActiveExplorer().Selection[1]; 
     // This example uses only 
     // MailItem. Other item types such as 
     // MeetingItem and PostItem can participate 
     // in the conversation. 
     if (selectedItem is Outlook.MailItem) 
     { 
     // Cast selectedItem to MailItem. 
     Outlook.MailItem mailItem = 
     selectedItem as Outlook.MailItem; 
     // Determine the store of the mail item. 
     Outlook.Folder folder = mailItem.Parent 
     as Outlook.Folder; 
     Outlook.Store store = folder.Store; 
     if (store.IsConversationEnabled == true) 
     { 
     // Obtain a Conversation object. 
     Outlook.Conversation conv = 
     mailItem.GetConversation(); 
     // Check for null Conversation. 
     if (conv != null) 
     { 
     // Obtain Table that contains rows 
     // for each item in the conversation. 
     Outlook.Table table = conv.GetTable(); 
     Debug.WriteLine("Conversation Items Count: " + 
     table.GetRowCount().ToString()); 
     Debug.WriteLine("Conversation Items from Table:"); 
     while (!table.EndOfTable) 
     { 
     Outlook.Row nextRow = table.GetNextRow(); 
     Debug.WriteLine(nextRow["Subject"] 
     + " Modified: " 
     + nextRow["LastModificationTime"]); 
     } 
     Debug.WriteLine("Conversation Items from Root:"); 
     // Obtain root items and enumerate the conversation. 
     Outlook.SimpleItems simpleItems 
     = conv.GetRootItems(); 
     foreach (object item in simpleItems) 
     { 
     // In this example, enumerate only MailItem type. 
     // Other types such as PostItem or MeetingItem 
     // can appear in the conversation. 
     if (item is Outlook.MailItem) 
     { 
     Outlook.MailItem mail = item 
     as Outlook.MailItem; 
     Outlook.Folder inFolder = 
     mail.Parent as Outlook.Folder; 
     string msg = mail.Subject 
     + " in folder " + inFolder.Name; 
     Debug.WriteLine(msg); 
     } 
     // Call EnumerateConversation 
     // to access child nodes of root items. 
     EnumerateConversation(item, conv); 
     } 
     } 
     } 
     } 
    } 
    
    
    void EnumerateConversation(object item, 
     Outlook.Conversation conversation) 
    { 
     Outlook.SimpleItems items = 
     conversation.GetChildren(item); 
     if (items.Count > 0) 
     { 
     foreach (object myItem in items) 
     { 
     // In this example, enumerate only MailItem type. 
     // Other types such as PostItem or MeetingItem 
     // can appear in the conversation. 
     if (myItem is Outlook.MailItem) 
     { 
     Outlook.MailItem mailItem = 
     myItem as Outlook.MailItem; 
     Outlook.Folder inFolder = 
     mailItem.Parent as Outlook.Folder; 
     string msg = mailItem.Subject 
     + " in folder " + inFolder.Name; 
     Debug.WriteLine(msg); 
     } 
     // Continue recursion. 
     EnumerateConversation(myItem, conversation); 
     } 
     } 
    } 
    
    1. 在签名开始之前找到签名位置并获取一个子字符串。

    Outlook 电子邮件签名文件所在的默认文件夹是:

    • Windows XP:
    C:\Documents and Settings\%username%\Application Data\Microsoft\Signatures
    
    • Windows 10/8/7/Vista:
     C:\Users\%username%\AppData\Roaming\Microsoft\Signatures
    
    1. 尝试使用正则表达式提取第一部分。

    【讨论】:

      【解决方案2】:

      这个问题有多种回答,例如 - Only get the latest reply text in an Outlook Email using VSTO and C#

      即使在理论上你也不能这样做:想象一个用户在消息的顶部输入(例如“见下文”),然后在下面的消息正文中插入/删除各种片段(我一直这样做)。如果字体颜色不同,你就很幸运了。

      您可以尝试将原始与新的进行比较并找出差异(请参阅上面的链接)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 1970-01-01
        相关资源
        最近更新 更多