C# VSTO outlook加载项-检索发件人';答复人姓名

C# VSTO outlook加载项-检索发件人';答复人姓名,c#,outlook,vsto,C#,Outlook,Vsto,我将介绍如何使用ribbon designer创建第一个outlook加载项的演练: 我的目标是制作在问候语中包含发件人姓名的回复模板 通过研究该问题,我认为我需要MailItem.SenderEmailAddress或MailItem.Sender,但当我试图将其添加到MailItem.htmlbody时,它根本没有显示任何内容 这是我的测试代码 private void Teser_button2_Click(object sender, RibbonControlEventArgs e)

我将介绍如何使用ribbon designer创建第一个outlook加载项的演练:

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

通过研究该问题,我认为我需要
MailItem.SenderEmailAddress
MailItem.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;
                    }
                }
            }
        }

您正在访问回复上的发件人名称,而不是正在回复的邮件。该名称应来自
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
中的
标记末尾插入HTML)。

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

  • 您可以连接Outlook项目事件,因此当用户选择回复电子邮件时,您将获得所有必需的信息并粘贴到邮件正文。你可能会发现这篇文章很有帮助。响应对象的实例作为参数传递,因此您可以使用从事件源提取的发件人相关信息修改消息正文

  • 如果项目已保存并已发送/接收,则可以使用该方法获取表示该项目所属对话的对象。对话表示一个或多个文件夹和存储中的一个或多个项目。如果将对话中的项目移动到
    已删除项目
    文件夹,然后使用
    GetChildren
    GetRootItems
    GetTable
    方法枚举对话,则返回的对象中将不包括该项目


  • 我尝试使用
    testvare=Globals.ThisAddIn.Application.ActiveExplorer().sender但我收到一个错误,错误是:
    type'不包含'name'的定义,并且找不到接受第一个'type'类型参数的可访问扩展方法'name'(是否缺少using指令或程序集引用?
    我还尝试使用
    testvar=Globals.ThisAddIn.Application.ActiveExplorer.sender但我收到另一个错误,即
    Application.ActiveExplorer是一个方法,在给定上下文中无效。
    请参阅上面的更新答案,这确实有效-但我应该更详细。你看,我只给出了函数的一半,因为我认为它没有那么重要。你看,我实际上同时使用了
    ActiveExplorer()
    ActiveInspector()
    ,这样我就可以从outlookexplorer或弹出窗口中进行回复。您的代码可以工作,但只能与outlook explorer配合使用,因为这是我唯一要求的。哈哈哈,我试着看看
    ActiveInspector()。选择是否是一件事,但它似乎不是。我会把你的答案记为正确的,看看我能不能从中吸取教训。谢谢如果你在inspector中有一个新项目,事情就更复杂了——你不知道你正在处理的回复(在
    ActiveInspector.CurrentItem
    )来自哪里。它可以是显示原始项目的另一个检查器,也可以来自
    Explore
    r中选择的项目。要处理这两个事件,您需要捕获
    Explorer.SelectionChange
    Inspector.NewInspector
    事件,并在原始项目上设置
    Reply/ReplyAll/Forward
    事件处理程序。当事件激发时,您将同时拥有旧项和新项(作为参数传递)。
    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;
      }
    }