Невозможно изменить тело HTML почты из надстройки VSTO Outook 2007 - PullRequest
1 голос
/ 17 марта 2011

Сюжет:

Я создаю надстройку 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 ]

0 голосов
/ 13 июля 2015

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

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

mailItem.UserProperties.Add("myid", Outlook.OlUserPropertyType.olText);
mailItem.UserProperties["myid"].Value = myid;
0 голосов
/ 17 марта 2011

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

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

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

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

...