为什么我的Outlook中会随机添加停止工作?

问题描述 投票:0回答:1

我有一个在Outlook 2013中运行的插件,用于过滤垃圾邮件。它查看传入的电子邮件,进行六次启发式搜索,如果其中的一到两个返回正数,则将邮件移动到另一个文件夹中进行检查;如果三个或三个以上的邮件被绊倒,它将永久删除邮件。

我的问题是它随机停止工作。加载项未标记为“禁用”或“无效”;它只是不再工作了。禁用它,然后再启用它会使它重新联机,然后在刚失败的邮件上include可以正常工作。然后,它将在随后的一些消息中再次随机失败。据我所知,没有出现任何错误。没有异常被抛出。

我觉得这与Outlook的外接程序限制有关,因为它是(a)没有确定性,并且(b)我检查的次数越来越多。但是我没有做的事情很沉重。大部分只是检查电子邮件地址,主题和标题中的内容,或者在正文中查找关键短语。盯着它看,每条消息似乎都在不到一秒钟的时间内得到处理。我想第一个问题是,是否有办法查看Outlook对此的决策过程,即它正在跟踪的特定性能统计信息? (ETA:Outlook是在调用外接程序时还是在启动时强制执行其限制的?我所能找到的所有内容仅涉及启动。)

似乎没有任何一项检查是负责任的;我已逐一禁用每个人,并且它一直在发生。

这里是中央代码。 SpamMarkerCheckList是各个启发式检查的委托列表。 ClearAllMailMarkers()会执行以下操作,例如将邮件标记为已读,将优先级设置为正常,删除所有标志等。headers是一个字典,其标题名称为键,字符串列表为值。

    private static void FilterInbox(object mailItem)
    {
        try
        {
            if (mailItem != null)
            {
                var mail = (Outlook.MailItem)mailItem;
                var markers = SpamMarkersCount(mail, 3);
                if (markers > 2)
                {
                    PermanentlyDeleteEmail(mail);
                }
                else if (markers > 0)
                {
                    ClearAllMailMarkers(mail);
                    mail.Move(_sequesteredFolder);
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("FilterSpam caught unexpected exception -- " + e);
        }
    }

    private static int SpamMarkersCount(Outlook.MailItem mail, int threshold)
    {
        var spamMarkerCount = 0;
        var headers = GetHeaderProperties(mail);
        var emailAddressList = BuildAddressList(mail, headers);
        var fullStringList = GetAllStrings(mail, headers);

        foreach (var spamMarkerCheck in SpamMarkerCheckList)
        {
            if (spamMarkerCheck(mail, headers, emailAddressList, fullStringList))
            {
                spamMarkerCount++;
                if (spamMarkerCount >= threshold)
                {
                    return spamMarkerCount;
                }
            }
        }

        return spamMarkerCount;
    }

我正在做的检查是:

  • 发件人名称或地址中的非ASCII字符(例如,心形,购物车等)
  • 标题中的指示符,例如是否存在列表取消订阅或失败的SPF,DKIM或DMARC身份验证
  • 格式错误或丢失的电子邮件地址
  • 如果是从假域发送的(通过DNS查找)
  • 主题或发件人名称中存在用户的电子邮件别名(“ delius1967是赢家!”]
  • 如果是从已知的受阻止域列表发送的
  • [如果包含特定短语(例如,“这是广告”))
email outlook outlook-addin add-in
1个回答
0
投票

我建议您检查Windows事件查看器中特定于Outlook的记录。您的外接程序很可能在运行时触发异常。

首先,Microsoft Office应用程序可以禁用行为异常的VSTO加载项。如果应用程序未加载VSTO加载项,则该应用程序可能已被硬禁用或软禁用了VSTO加载项。

当VSTO加载项导致应用程序意外关闭时,可能会发生硬禁用。如果您在执行VSTO加载项中的Startup事件处理程序时停止调试器,则它也可能在开发计算机上发生。

当VSTO加载项产生不会导致应用程序意外关闭的错误时,可能会发生软件禁用。例如,如果在执行启动事件处理程序时抛出未处理的异常,则应用程序可能会软禁用VSTO加载项。

当您重新启用软禁用的VSTO加载项时,应用程序会立即尝试加载VSTO加载项。如果最初导致应用程序软禁用VSTO加载项的问题尚未解决,则应用程序将再次软禁用VSTO加载项。在How to: Re-enable a VSTO Add-in that has been disabled文章中了解有关此内容的更多信息。

其次,扩展了Outlook 2010,Outlook 2013和更高版本的加载项弹性指标,监视加载项性能指标,例如加载项启动,关闭,文件夹切换,项目打开和调用频率。 Outlook记录每个性能监视指标的经过时间(以毫秒为单位)。

例如,启动指标衡量Outlook启动期间每个连接的加载项所需的时间。然后,Outlook计算5次连续迭代中的启动时间中值。如果中值启动时间超过1000毫秒(1秒),则Outlook将禁用该加载项,并向用户显示一个通知,指出该加载项已被禁用。用户可以选择始终启用加载项,在这种情况下,即使加载项超过了1000毫秒的性能阈值,Outlook也不会禁用加载项。在Performance criteria for keeping add-ins enabled部分中了解有关此内容的更多信息。

您可能会发现Outlook’s slow add-ins resiliency logic and how to always enable slow add-ins文章很有帮助。

最后,Outlook使用单线程单元模型,并可能通过在运行时引发异常来防止来自辅助线程的任何调用。您应该仅在主线程上使用OOM。如果需要在后台进行任何处理,则可以考虑提取所需的纯数据并将其传递进行处理。扩展MAPI还允许运行辅助线程。

© www.soinside.com 2019 - 2024. All rights reserved.