我已经编写了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);
}
}
它甚至没有记录“Email Received”,也没有在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);