好的,我有一个通过Windows调度程序每小时运行一次的应用程序。它运行成功,我可以通过Windows调度程序告诉它。当我单击可执行文件时,应用程序运行没有问题。
当我通过Windows调度程序运行相同的应用程序时,它无法按预期工作。
它应该关闭Outlook,但它不会重新打开它。 相反,它启动可执行文件,但Outlook应用程序不会显示在我的桌面上。
我的应用程序应该这样做:关闭我的电子邮件,发送电子邮件,打开Outlook。
我首先需要关闭Outlook,因为如果我在尝试发送电子邮件之前没有关闭它,它将尝试访问数据文件,因为我在手动Windows调度程序之前将我的电子邮件放在桌面上无法打开数据文件。
static void Main(string[] args)
{
foreach(Process proc in Process.GetProcesses())
{
if(proc.ProcessName.Equals("OUTLOOK"))
{
proc.Kill();
}
}
//Removed code which sends emails.
openOutlook();
}
private static void openOutlook()
{
Thread.Sleep(1000);
Process.Start(@"C:\Program Files (x86)\Microsoft Office\Office14\OUTLOOK.exe");
}
答案 0 :(得分:3)
从Windows调度程序(服务)自动化Outlook不是一个好主意。
Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。
如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。请在Considerations for server-side Automation of Office文章中详细了解相关内容。
作为一种解决方法,您可以考虑使用低级API - 扩展MAPI。或者围绕该API的任何第三方包装,例如Redemption。
答案 1 :(得分:1)
我想出的最佳解决方案是在发送电子邮件之前关闭Outlook。
如果Outlook进程已打开,则终止所有实例;继续根据需要发送电子邮件。程序完成后手动打开Outlook。
一种可能的替代方法是创建一些在特定时间附加电子邮件的VBA。您还可以查看此页面上提供的其他链接。
答案 2 :(得分:0)
计划程序是在与当前登录用户不同的本地用户上下文中运行的服务。 Outlook将在该用户上下文中打开,当前登录的用户将看不到它。