在 outlook 上回复时获取以前的 MailItem
Get previous MailItem when reply on outlook
我们正在开发 outlook 插件。我们提供一个按钮作为默认发送按钮的替代方案。我们需要将按钮回复的所有 MailItem 保存到特定类别。
当用户回复电子邮件时(在新检查器中),我怎样才能回复主要的 MailItem?
您可以使用代表该项目所属对话的 GetConversation method of the MailItem class which returns a Conversation 对象。
GetConversation returns 如果项目不存在对话,则为空(在 Visual Basic 中为空)。在以下情况下,项目不存在对话:
- 该项目尚未保存。项目可以通过编程方式、用户操作或自动保存来保存。
- 对于可以发送的项目(例如,邮件项目、约会项目或联系人项目),该项目尚未发送。
- 已通过 Windows 注册表禁用对话。
- 商店不支持对话视图(例如,Outlook 运行 在经典联机模式下针对早于 Microsoft Exchange Server 2010 的 Microsoft Exchange 版本)。使用 Store 对象的 IsConversationEnabled 属性 来确定商店是否支持对话视图。
一个对话表示一个或多个文件夹和存储中的一个或多个项目。如果您将对话中的某个项目移动到“已删除邮件”文件夹,然后使用 GetChildren、GetRootItems 或 GetTable 方法枚举该对话,则该项目将不会包含在返回的对象中。
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, only enumerate 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, only enumerate 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);
}
}
}
用户可以从 Explorer 或 Inspector 回复。
对于资源管理器,捕获 Explorer.SelectionChange
事件并在所选项目上设置事件接收器。您可以捕获 MailItem.Reply/ReplyAll/Forward
事件。
如果是检查员,捕获 Application.Inspectors.NewInspector
事件,并在从 Inspector.CurrentItem
属性 返回的 MailItem
上设置事件接收器。然后,您将再次捕获 MailItem.Reply/ReplyAll/Forward
事件。
我们正在开发 outlook 插件。我们提供一个按钮作为默认发送按钮的替代方案。我们需要将按钮回复的所有 MailItem 保存到特定类别。 当用户回复电子邮件时(在新检查器中),我怎样才能回复主要的 MailItem?
您可以使用代表该项目所属对话的 GetConversation method of the MailItem class which returns a Conversation 对象。
GetConversation returns 如果项目不存在对话,则为空(在 Visual Basic 中为空)。在以下情况下,项目不存在对话:
- 该项目尚未保存。项目可以通过编程方式、用户操作或自动保存来保存。
- 对于可以发送的项目(例如,邮件项目、约会项目或联系人项目),该项目尚未发送。
- 已通过 Windows 注册表禁用对话。
- 商店不支持对话视图(例如,Outlook 运行 在经典联机模式下针对早于 Microsoft Exchange Server 2010 的 Microsoft Exchange 版本)。使用 Store 对象的 IsConversationEnabled 属性 来确定商店是否支持对话视图。
一个对话表示一个或多个文件夹和存储中的一个或多个项目。如果您将对话中的某个项目移动到“已删除邮件”文件夹,然后使用 GetChildren、GetRootItems 或 GetTable 方法枚举该对话,则该项目将不会包含在返回的对象中。
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, only enumerate 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, only enumerate 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);
}
}
}
用户可以从 Explorer 或 Inspector 回复。
对于资源管理器,捕获 Explorer.SelectionChange
事件并在所选项目上设置事件接收器。您可以捕获 MailItem.Reply/ReplyAll/Forward
事件。
如果是检查员,捕获 Application.Inspectors.NewInspector
事件,并在从 Inspector.CurrentItem
属性 返回的 MailItem
上设置事件接收器。然后,您将再次捕获 MailItem.Reply/ReplyAll/Forward
事件。