![](/img/trans.png)
[英]C# VSTO Outlook plugin - How can I get the email address of the sender of an outgoing email using Exchange?
[英]Only get the latest reply text in an Outlook Email using VSTO and C#
我已經瀏覽了許多鏈接,但似乎沒有一個有效。 我的問題是,在使用 C# 和 VSTO 編寫的 Outlook 加載項中,我希望將最新回復 email 的文本捕獲到一個線程。
問題是 MailItem object 上的所有屬性(例如 Body、HTMLBody 等)都給出了 email 的整個文本,包括過去的回復。 我希望以某種方式只獲得最新的文本。 考慮到 email 中的多種語言,我需要能夠做到這一點。
這是我嘗試過的
Outlook object model 沒有為此提供任何東西。 您需要自己解析消息正文字符串。
此外,您可以遍歷對話中的所有項目,並在最新/最近的項目中檢測每個項目。 通過刪除舊項目,您可以獲得最新的。 以下示例顯示了如何在對話中獲取和顯示郵件項目。
void DemoConversation()
{
object selectedItem = Application.ActiveExplorer().Selection[1];
// For this example, you will work only with
//MailItem. Other item types such as
//MeetingItem and PostItem can participate
//in Conversation.
if (selectedItem is Outlook.MailItem)
{
// Cast selectedItem to MailItem.
Outlook.MailItem mailItem = selectedItem as Outlook.MailItem;
// Determine store of mailItem.
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 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 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 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 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);
}
}
}
在示例代碼示例中,我們獲取選定的MailItem
object,然后使用Folder
object 的Store
屬性確定MailItem
object 的存儲。 DemoConversation 然后檢查IsConversationEnabled
屬性是否為真; 如果為真,則代碼示例使用GetConversation
方法獲取Conversation
object。 如果Conversation
object 不是 null 引用,則該示例使用GetTable
方法獲取包含對話中每個項目的關聯Table
object。 然后,該示例枚舉Table
中的每個項目並在每個項目上調用EnumerateConversation
以訪問每個項目的子節點。 EnumerateConversation
采用Conversation
object 並使用GetChildren(Object)
方法獲取子節點。 遞歸調用EnumerateConversation
直到沒有更多的子節點。 然后將每個對話項目顯示給用戶。
即使在理論上你也不能這樣做:想象一個用戶在消息的頂部輸入(例如“見下文”),然后在下面的消息正文中插入/刪除各個部分(我一直這樣做)。 如果字體顏色不同,你很幸運。
您可以嘗試將原始消息與新消息進行比較並找出差異,但這需要訪問原始消息。 您可以查看PR_IN_REPLY_TO_ID
MAPI 屬性(DASL 名稱http://schemas.microsoft.com/mapi/proptag/0x1042001F
)並嘗試在收件箱或已發送郵件文件夾中查找原始郵件。 請注意,在后一種情況下(已發送郵件文件夾),該屬性可能在緩存的消息中不可用,您需要搜索該文件夾的在線版本(在 OOM 中不能這樣做,您需要 C++ 中的擴展 MAPI 或Delphi 或任何語言的兌換)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.