Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Email 如何在Outlook ItemLoad后显示修改的正文_Email_Outlook_Vsto_C2call - Fatal编程技术网

Email 如何在Outlook ItemLoad后显示修改的正文

Email 如何在Outlook ItemLoad后显示修改的正文,email,outlook,vsto,c2call,Email,Outlook,Vsto,C2call,我有解析电子邮件和添加电话号码链接的代码,但修改后的电子邮件正文直到用户手动重新加载后才会显示在Outlook阅读窗格中查看另一封电子邮件,请返回此邮件 我尝试了一些类似Inspector.Display和ActiveExplorer.ClearSelection-ActiveExplorer.AddToSelection的方法,但是我无法获得一致的结果。Display会为一些用户打开新的Inspector,这是非常不可取的 我还打算早点调查这件事。在Outlook呈现电子邮件正文之前以某种方式

我有解析电子邮件和添加电话号码链接的代码,但修改后的电子邮件正文直到用户手动重新加载后才会显示在Outlook阅读窗格中查看另一封电子邮件,请返回此邮件

我尝试了一些类似Inspector.Display和ActiveExplorer.ClearSelection-ActiveExplorer.AddToSelection的方法,但是我无法获得一致的结果。Display会为一些用户打开新的Inspector,这是非常不可取的

我还打算早点调查这件事。在Outlook呈现电子邮件正文之前以某种方式访问它,以避免刷新。我对VSTO非常陌生,所以我不知道什么事件可以访问MailItem,但会在用户选择它之后和呈现它之前发生。我曾考虑过只处理新邮件,但当我推出此插件时,这并没有帮助,只是继续前进

以下是我当前的ItemLoad子项:

Private Sub Application_ItemLoad(Item As Object)
    Dim myObj As Outlook.MailItem
    Dim ob As Object
    ob = GetCurrentItem()
    If TypeOf ob Is Outlook.MailItem Then
        myObj = ob
        Dim oldbody As String = myObj.Body
        If myObj.HTMLBody.Length > 0 Then
            myObj.HTMLBody = RegularExpressions.Regex.Replace(myObj.HTMLBody, "(?<!tel:)(?<![2-9\.])(?<!\>\ )[+]?(1-)?(1)?[\(]?(?<p1>\d{3})[\)]?[\.\- ]?(?<p2>\d{3})[\.\- ]?(?<p3>\d{4})(?=[^\d])", "<a href=""tel:${p1}${p2}${p3}""> ${p1}-${p2}-${p3}</a>")
        Else
            myObj.Body = RegularExpressions.Regex.Replace(myObj.Body, "(?<!tel:)(?<![2-9\.])[+]?(1-)?(1)?[\(]?(?<p1>\d{3})[\)]?[\.\- ]?(?<p2>\d{3})[\.\- ]?(?<p3>\d{4})(?=[^\d])", "tel:${p1}.${p2}.${p3}")
        End If
        myObj.Save()
        refreshCurrentMessage()
    End If
End Sub

GetCurrentItem仅返回基于类型名的objApp.ActiveExplorer.Selection.Item1或objApp.ActiveInspector.CurrentItem。ActiveWindow

Outlook不会立即反映通过OOM所做的更改。您需要切换到另一个文件夹/电子邮件以刷新该项目,因为无法动态更新该项目

您可以使用资源管理器类的属性,该属性允许设置表示资源管理器中显示的当前文件夹的文件夹对象。因此,视图将切换到另一个文件夹。然后可以将CurrentFolder文件夹设置为初始文件夹


我还建议立即释放所有底层COM对象。使用System.Runtime.InteropServices.Marshal.ReleaseComObject可在使用完Outlook对象后释放该对象。然后在C中的Visual Basic null中将变量设置为Nothing,以释放对该对象的引用。

谢谢提示。我希望有一个比加载其他电子邮件更好的答案,因为如果我钩住ItemLoad事件,这可能会创建一个循环,而且看起来效率非常低。有一种叫做teletrigger的产品,它能够以某种方式只修改显示的内容,而不改变电子邮件正文。但是我不知道怎么做。