无法从VSTO Outlook 2007加载项更改邮件HTML正文

时间:2011-03-16 22:01:29

标签: c# vba vsto outlook-2007-addin

情节:

我在Visual Studio 2010中使用VSTO和C#创建Outlook 2007加载项。加载项的目的是跟踪发送给客户的邮件。加载项应在每个出站邮件中插入跟踪代码,以便稍后在客户回复后对其进行识别和自动存档。我的目标是在邮件HTML的开头标记中插入跟踪代码作为属性:

<html tracking="ddfwer4w5c45cgx345gtg4g" ...>

这将在Application.ItemSend事件的事件处理程序中完成:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
}

void Application_ItemSend(object Item, ref bool Cancel)
{
    if (Item is Outlook.MailItem)
    {
        Outlook.MailItem mail = (Outlook.MailItem)Item;
        mail.HTMLBody = "<html tracking=\"4w5te45yv5e6ye57j57jr6\" ...";
    }
}

问题:

似乎永远不会改变HTMLBody属性。并且它不会抛出任何异常。它什么都不做。我直接在Outlook中的VBA中重写了这个逻辑,并尝试更改HTMLBody,但它仍然没有改变。我怎么知道它没有改变HTMLBody是通过单步并将鼠标悬停在属性上来查看当前值。

但我可以更改MailItem.Body属性。但由于我需要以某种方式隐藏跟踪代码,因此Body属性根本无法帮助我。我在更改HTMLBody属性后添加了MailItem.Save()方法,但没有更改。

我认为也许ItemSend事件要迟到了,我不能再改变当时的HTMLBody了,但我找不到像BeforeSend或者类似的任何事件。

非常感谢任何想法。

2 个答案:

答案 0 :(得分:0)

我使用VB比C#更多,但我认为我看到了你的问题。

检查Application_ItemSend的函数签名。我看到Cancel通过引用传递;不应该通过这种方式传递项目吗?

void Application_ItemSend(ref object Item, ref bool Cancel)
{
    // ...
}

如果按值传递Item,那么您的代码仅处理所创建的副本;原始对象没有被触及。至少,这就是它在C ++中的工作方式(但我的C ++经验是在.Net之前,所以可能不适用)。

答案 1 :(得分:0)

我有类似的需要在邮件中添加一些ID。似乎Outlook在发送之前彻底清理了电子邮件,所以当它发送时,您设置的所有漂亮的隐藏属性都已被删除。

根据我的特殊需要,我最终使用了UserProperties的{​​{1}}元素。从创建电子邮件到最终在“已发送邮件”文件夹中时,这种情况仍然存在。如果客户回复通过对话尝试发送的电子邮件,这种方法可能对您有用吗?

MailItem