我目前正在尝试在 mailitem.open 事件中编辑邮件项目的 html 正文。这对于相当短的邮件来说效果很好,但邮件本身越长,屏幕闪烁越多,直到 Outlook 加载 100%。我尝试做的是模仿 Outlook 默认签名行为,但使用我自己来自 Web 服务的签名。
我这样做的方法是首先为 itemload 事件分配一个事件:
Application.ItemLoad += new ApplicationEvents_11_ItemLoadEventHandler(Application_ItemLoad);
在 itemload 方法中,我分配了 open 事件处理程序:
private void Application_ItemLoad(object item)
{
log.Debug("Application_ItemLoad");
if (item is MailItem)
{
var mailItem = (MailItem)item;
mailItem.Open += new ItemEvents_10_OpenEventHandler(MailItem_Open);
}
}
最后在 mailitem.open 事件中我将我的签名加载到邮件中
public void MailItem_Open(ref bool Cancel)
{
*some logic here to get the right mail*
{
LoadDefaultSignature(*the right mailitem*);
}
}
LoadDefaultSignature 然后调用 Web 服务并将签名放置在邮件中的正确位置:
public void LoadDefaultSignature(MailItem mailItem)
{
try
{
log.Debug("LoadDefaultSignature");
var proxy = new WebServiceOutlookClient();
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var defaultSignature = proxy.GetDefaultSignatureByMail(Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress);
if (defaultSignature != null)
{
var htmlDoc = GetHtmlDoc(mailItem);
*logic to place out text in original mail*
mailItem.HTMLBody = htmlDoc.DocumentNode.OuterHtml;
log.Debug("DefaultSignature set");
}
}
catch (System.Exception exc)
{
log.Error("Couldn't load default signature", exc);
}
}
我不太明白为什么 Outlook 会显示此行为,因为每当我稍后从自定义任务窗格中更改 htmlbody 时,它都不会执行此操作。也许正在进行一些验证? 我也愿意采用其他方法来解决这个问题。我的想法是尝试使用 wordeditor 将我的 html 转换为 openxml 并使用它,但到目前为止还没有成功。
这并不奇怪 - 您正在重置整个文档,因此 Outlook/Word 需要重新解析整个邮件正文:它们不够复杂,无法弄清楚仅更改了其中的一部分。
这确实是一种大锤方法 - 如果您只更改身体的某些部分,请改用 Word 对象模型:使用
Inspector.WordEditor
或 Explorer.ActiveInlineResponseWordEditor
(返回 Document
对象),具体取决于打开项目进行编辑的位置。一旦您知道需要在哪里插入签名,请使用 Range.InsertFile
插入 HTML 数据。