Невозможно изменить тело HTML почты из надстройки VSTO Outook 2007

Сюжет:

Я создаю надстройку outlook 2007 с использованием VSTO и C# в Visual Studio 2010. Цель надстройки - отслеживать отслеживание сообщений, отправляемых клиентам. Надстройка должна вставлять код отслеживания в каждое исходящее письмо, которое впоследствии позволяет распознавать его и автоматически архивировать, когда клиент отвечает. Моя цель - вставить код отслеживания в качестве атрибута в открывающий тег 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. И это не бросает никаких исключений. Это просто ничего не делает. Я переписал эту логику непосредственно в VBA в Outlook и попытался изменить HTMLBody, но она все равно не изменилась. Насколько я знаю, это не изменило HTMLBody, пройдя и наведя курсор мыши на свойство, чтобы увидеть текущее значение.

Однако я могу внести изменения в свойство MailItem.Body. Но так как мне нужно каким-то образом скрыть код отслеживания, свойство Body мне совсем не помогает. Я также добавил метод MailItem.Save() после изменения свойства HTMLBody, но без изменений.

Я подумал, что, возможно, событие ItemSend слишком поздно, и я больше не могу изменить HTMLBody в это время, но я не могу найти ни одно событие, как BeforeSend или подобное.

Любые идеи будут высоко ценится.

2 ответа

Я использую VB намного больше, чем C#, но я думаю, что вижу вашу проблему.

Проверьте сигнатуру функции Application_ItemSend. Я вижу, что Отмена передается по ссылке; не должен ли Предмет пройти и так?

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

Если Item передается по значению, то ваш код только манипулирует созданной копией; оригинальный объект не трогается. По крайней мере, так было в C++ (но мой опыт работы с C++ был раньше.Net, так что, возможно, это не относится).

У меня была похожая необходимость добавить несколько идентификаторов в сообщение. Похоже, что Outlook тщательно очищает электронную почту перед отправкой, поэтому к моменту отправки все заданные вами скрытые свойства были удалены.

Для моей особой потребности я вместо этого использовал UserProperties элемент MailItem, Это сохраняется от того, когда электронное письмо создано, и когда оно попадает в папку "Отправленные". Возможно, этот подход может сработать для вас, если ответ клиента будет отправлен на отправленное письмо в ходе разговора?

mailItem.UserProperties.Add("myid", Outlook.OlUserPropertyType.olText);
mailItem.UserProperties["myid"].Value = myid;
Другие вопросы по тегам