1

剧情:

我正在 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 之类的任何事件。

任何想法将不胜感激。

4

2 回答 2

0

I use VB a lot more than C#, but I think I see your problem.

Check the function signature of Application_ItemSend. I see that Cancel is passed by reference; shouldn't Item be passed that way too?

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

If Item is passed by value, then your code is only manipulating the copy that was made; the original object isn't being touched. At least, that's how it worked in C++ (but my C++ experience is before .Net, so maybe that doesn't apply).

于 2011-03-16T23:06:59.243 回答
0

我有类似的需要将一些 id 放入消息中。似乎 Outlook 在发送电子邮件之前会彻底清除电子邮件,因此在发送电子邮件时,您设置的所有漂亮的隐藏属性都已被删除。

为了我的特殊需要,我最终改用UserPropertiesMailItem. 从创建电子邮件到最终进入“已发送邮件”文件夹,这种情况一直存在。如果客户尝试通过对话回复已发送的电子邮件,这种方法可能对您有用吗?

mailItem.UserProperties.Add("myid", Outlook.OlUserPropertyType.olText);
mailItem.UserProperties["myid"].Value = myid;
于 2015-07-13T20:40:25.187 回答