我正在开发一个Outlook AddIn,它在发送邮件之前从MailItem中提取链接。 AddIn依赖于"自动套用格式键入"使用超链接替换Internet路径的功能。 Outlook似乎可以很好地自动将这些路径转换为超链接,只要它知道用户在"发送"之前已经完成了输入路径。按钮被按下。但是,如果用户刚刚键入了有效的URL然后点击发送,则Outlook不会用链接替换该URL,因为只有在确定用户输入完链接后才会进行替换。换句话说,如果用户输入的最后一件事是" stackoverflow.com",那么Outlook不会用链接替换它。另一方面,如果用户键入的最后一件事是" stackoverflow.com" (注意尾随空格),然后只要插入空格字符,Outlook就会自动用链接替换网址,因为这表示网址的结尾。
我使用Outlook.ApplicationEvents_11_ItemSendEventHandler在发送之前访问MailItem:
Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
Application_ItemSend()看起来像这样:
private void Application_ItemSend(object Item, ref bool Cancel)
{
if (Item is Outlook.MailItem)
{
Outlook.MailItem MailItem = Item as Outlook.MailItem;
string body = MailItem.HTMLBody;
// Process links
// How do I make sure all URLs have been converted to links at this point?
}
}
在Application_ItemSend()中,我需要确保所有URL都已转换为链接。
如果我打开来自我的"已发送物品"发送后的文件夹然后我可以看到,在调用Application_ItemSend()和保存邮件之间的某个时刻,Outlook已将最后一个URL(" stackoverflow.com")转换为链接。我需要能够从Application_ItemSend()中强制进行转换,但是我无法弄清楚Outlook正在执行哪些代码来触发用链接替换URL。
我已尝试使用正则表达式查找网址然后替换它们,但这会变得混乱,我没有找到一个不会错过很多有效网址的正则表达式,以及非错误匹配有效的网址。除此之外,如果微软已经有代码执行此操作,谁想要重新发明轮子。
我尝试从Application_ItemSend()中执行MailItem.Save(),希望这是导致在Application_ItemSend()和"已发送项目"中保存的项目之间发生URL替换的原因。文件夹,但它没有。
我可以在Application_ItemSend()中执行哪些代码来强制将URL替换为链接?