首页 > 解决方案 > 如何从 Outlook 互操作电子邮件中获取最新电子邮件

问题描述

   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#outlookoutlook-addinoffice-interop

解决方案


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 电子邮件签名文件所在的默认文件夹是:

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

推荐阅读