2011-03-16 2 views
1

L'intrigue:Impossible de changer du corps du message HTML à partir VSTO Outook 2007 add-in

Je crée une perspective 2007 add-in en utilisant VSTO et C# dans Visual Studio 2010. L'objectif du complément est de provoquer le suivi des mails envoyés aux clients. Le complément doit insérer un code de suivi dans chaque courrier sortant, ce qui permet ultérieurement de le reconnaître et de l'archiver automatiquement une fois que le client a répondu. Mon but est d'insérer un code de suivi comme un attribut dans la balise d'ouverture du code HTML de la poste:

<html tracking="ddfwer4w5c45cgx345gtg4g" ...> 

Cela se fera dans le gestionnaire d'événements de l'événement 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\" ..."; 
    } 
} 

Le problème:

Il semble ne jamais modifier la propriété HTMLBody. Et il ne jette aucune exception. Cela ne fait rien. J'ai réécrit cette logique directement dans VBA dans Outlook, et j'ai essayé de changer le HTMLBody, mais il n'a toujours pas changé. Comment je sais qu'il n'a pas changé le HTMLBody est en passant par et survoler la propriété pour voir la valeur actuelle.

Je suis cependant en mesure d'apporter des modifications à la propriété MailItem.Body. Mais comme j'ai besoin de cacher le code de suivi, la propriété Body ne m'aide pas du tout. J'ai également ajouté la méthode MailItem.Save() après avoir modifié la propriété HTMLBody, mais pas de modification.

Je pensais que peut-être l'événement ItemSend est trop tard et je ne peux plus changer le HTMLBody à ce moment-là, mais je ne trouve aucun événement comme BeforeSend ou similaire.

Toutes les idées seraient grandement appréciées.

Répondre

0

J'utilise VB beaucoup plus que C#, mais je pense que je vois votre problème.

Vérifiez la signature de la fonction de Application_ItemSend. Je vois que Cancel est passé par référence; L'article ne devrait-il pas être transmis de cette façon?

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

Si l'élément est passé par la valeur, votre code manipule uniquement la copie effectuée; l'objet original n'est pas touché. Au moins, c'est comme ça que ça fonctionnait en C++ (mais mon expérience en C++ est avant .Net, alors peut-être que ça ne s'applique pas).

0

J'ai eu un besoin semblable à mettre un peu ids dans le message. On dirait qu'Outlook nettoie soigneusement l'email avant de l'envoyer, donc au moment où il est envoyé, toutes les belles propriétés cachées que vous avez définies ont été supprimées. Pour mon besoin particulier, j'ai fini par utiliser l'élément UserProperties de MailItem. Cela persiste depuis la création de l'e-mail jusqu'à sa fin dans le dossier Éléments envoyés. Peut-être que cette approche peut fonctionner pour vous si la réponse du client est essayée à l'email envoyé par le biais d'une conversation?

mailItem.UserProperties.Add("myid", Outlook.OlUserPropertyType.olText); 
mailItem.UserProperties["myid"].Value = myid; 
Questions connexes