VSTO outlook 加载项 - 检索发件人姓名以进行回复

VSTO outlook add-in - Retrieve sender's name for reply

我正在逐步介绍如何使用功能区设计器创建您的第一个 Outlook 插件:https://docs.microsoft.com/en-us/visualstudio/vsto/walkthrough-creating-your-first-vsto-add-in-for-outlook?view=vs-2019

我的目标是制作在问候语中包含发件人姓名的回复模板。

通过研究该问题,我认为我需要 MailItem.SenderEmailAddressMailItem.Sender,但是当我尝试将其添加到 mailitem.htmlbody 时,它根本没有显示任何内容。

这是我的测试代码。

 private void Teser_button2_Click(object sender, RibbonControlEventArgs e)
        {
            {
                if (Globals.ThisAddIn.Application.ActiveExplorer() != null)
                {
                    MailItem mi = Globals.ThisAddIn.Application.ActiveExplorer().ActiveInlineResponse;
                    if (mi != null)
                    {

                        mi.HTMLBody = mi.SenderEmailAddress + @"<BODY style=font-size:11pt;font-family:Calibri></BODY>Hello ENTERNAMEHERE,
<br><
<br>Here is a brief summary on everything worked on:
<br>
<br>Thank you for your time,
<br>
" + mi.HTMLBody;
                        mi.BodyFormat = Outlook.OlBodyFormat.olFormatHTML;
                    }
                }
            }
        }

我尝试将 mi.SenderEmailAddress 更改为 mi.Sender,但我仍然一无所获。

如有任何想法,我们将不胜感激!!

已更新

以下代码对我来说既适用于 outlook 资源管理器,也适用于弹出窗口(它不是最好的,但它有效):

 private void Domain_setup_Click_1(object sender, RibbonControlEventArgs e)
        {
            if (Globals.ThisAddIn.Application.ActiveExplorer() != null)
            {
                MailItem mi = Globals.ThisAddIn.Application.ActiveExplorer().ActiveInlineResponse;
                Outlook.Selection selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
                object item = selection[1];
                if (mi != null && item is Outlook.MailItem mailItem)
                {
                    string senderName = mailItem.SenderName;
                    mi.HTMLBody = @"<BODY style=font-size:11pt;font-family:Calibri></BODY>Hello " + senderName + @",
<br>
<br>Here is the information for the new domain/user account:
<br>
<br>Computer username: ENTERDOMAINORUSERNAMEHERE
<br>Computer password: ENTERPASSWORD
<br>
<br>Thank you for your time,
<br>
" + mi.HTMLBody;
                }
            }
            if (Globals.ThisAddIn.Application.ActiveInspector() != null)
            {
                MailItem mi = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem;
                Outlook.Selection selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
                object item = selection[1];
                if (mi != null && item is Outlook.MailItem mailItem)
                {
                    string senderName = mailItem.SenderName;
                    mi.HTMLBody = @"<BODY style=font-size:11pt;font-family:Calibri></BODY>Hello " + senderName + @",
<br>
<br>Here is the information for the new domain/user account:
<br>
<br>Computer username: ENTERDOMAINORUSERNAMEHERE
<br>Computer password: ENTERPASSWORD
<br>
<br>Thank you for your time,
<br>
" + mi.HTMLBody;
                }
            }
        }

您访问的是回复中的发件人姓名,而不是被回复的邮件。该名称应来自 Globals.ThisAddIn.Application.ActiveExplorer().Selection 集合中的第一项。

Outlook.Selection selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
if (selection.Count > 0)
{
  object item = selection[1];
  if (item is Outlook.MailItem mailItem)
  {
    string senderName = mailItem.SenderName;
  }
}

此外,您不能也不应该连接两个 HTML 字符串 - 结果将 不是 有效的 HTML 文档,必须将两者合并(例如,您可以在 mi.HTMLBody 中的 <body> 标记结束后插入 HTML。

收到的项目上存在与发件人相关的属性。因此,您真正需要的是获得被回复的源项目。为避免不必要地搜索原始电子邮件,您可以使用多种方法在 Outlook 中检索所需信息:

  1. 您可以连接到有帮助的 Reply event of Outlook items, so when a user chooses to reply to an email you will get all the required information and paste to the message body. You may find the Implement a wrapper for inspectors and track item-level events in each inspector 文章。响应对象的实例作为参数传递,因此您可以使用从事件源中提取的与发件人相关的信息修改消息正文。

  2. 如果项目已保存并且是 sent/received,您可以使用代表该项目所属对话的 GetConversation method to obtain a Conversation 对象。对话表示一个或多个文件夹和存储中的一个或多个项目。如果您将对话中的项目移动到 Deleted Items 文件夹,然后使用 GetChildrenGetRootItemsGetTable 方法枚举对话,则不会包含该项目在返回的对象中。