情节:
我在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或者类似的任何事件。
非常感谢任何想法。
答案 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