1

我已经为 Outlook 编写了一个小型插件,它监视接收到的电子邮件,然后自动打印附件(如果有附件),或者如果没有附件,则自动打印电子邮件本身。

起初我遇到的问题是,如果它正在处理一封电子邮件,而另一封电子邮件进来了,它就会跳过它,所以很多电子邮件都没有被打印出来。我尝试对应用程序进行多线程处理,但之后 Outlook 拒绝打开,不断给出一些随机错误。所以最后我更改了加载项,以便它只将附件或电子邮件保存到队列(硬盘上的文件夹),然后控制台应用程序通过该队列打印电子邮件/附件。

这一切都很好用了一段时间,但是 Outlook 只是停止向应用程序报告新电子邮件,并且任何地方都没有记录任何错误。重新启动 Outlook 会使其再次正常工作,直到随机时间(有时是几个小时,有时是一天)再次停止。它变得非常烦人,因为加载项的目的是减少销售人员打印订单所花费的时间,但这个问题意味着他们必须根据收到的电子邮件继续检查打印输出,以确定哪些已打印或未打印。我现在进行了更改,因此它会在打印时自动将其标记为已读电子邮件,以便他们可以看到它何时停止,但它仍然不完美。

有谁知道 Outlook 可能突然停止向此加载项报告新电子邮件的原因?收到新电子邮件时运行(或应该运行)的代码是:

        void outlookApp_NewMailEx(string EntryIDCollection)
    {
        try
        {
            WriteToLog("Email Received: " + ((Outlook.MailItem)Application.Session.GetItemFromID((string)EntryIDCollection)).Subject);
            ProcessEmail(EntryIDCollection);
        }
        catch (System.Exception ex)
        {
            WriteToLog("Error: " + ex.Message);
        }
    }

它甚至没有记录“已收到电子邮件”,也没有在 catch 块中记录错误,所以我认为事件甚至没有被触发。它不像是超载的,因为在最后一站之前打印的最后一封电子邮件是 19 小时内唯一收到的一封(那是星期六晚上)。

任何建议都将不胜感激 - 我遇到了麻烦,因为最初花了我 15 到 30 分钟来写的东西现在花了几天时间试图克服所有各种微软问题。

编辑:

下面是 WriteToLog 方法。我刚刚意识到问题可能是日志文件的访问,因为加载项和控制台应用程序都使用相同的文件,因此可能会尝试同时写入它。

    private void WriteToLog(string message)
    {
        using (StreamWriter sw = File.AppendText(logFile))
        {
            sw.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ": " + message);
        }   
    }

我现在将对此进行研究,并可能为控制台应用程序创建第二个日志文件。

编辑2:

以下是我在“ThisAddin_Startup”方法中订阅事件的方式:

ApplicationClass outlookApp = new ApplicationClass();

        outlookApp.NewMailEx += new ApplicationEvents_11_NewMailExEventHandler(outlookApp_NewMailEx);
4

0 回答 0