c# - 运行 c# 编译代码时的 Windows 调度程序功能

标签 c# windows email outlook scheduler

好的,我有一个通过 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");
    }

最佳答案

从 Windows 调度程序(服务)自动化 Outlook 不是一个好主意。

Microsoft 目前不推荐也不支持来自任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office在此环境中运行 Office 时,可能会表现出不稳定的行为和/或死锁。

如果您要构建在服务器端上下文中运行的解决方案,则应尝试使用已针对无人值守执行安全处理的组件。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。如果您使用来自服务器端解决方案的 Office 应用程序,该应用程序将缺少许多成功运行所必需的功能。此外,您将承担整体解决方案稳定性的风险。在 Considerations for server-side Automation of Office 中阅读更多相关信息文章。

作为解决方法,您可以考虑使用低级 API - 扩展 MAPI。或者围绕该 API 的任何第三方包装器,例如 Redemption。

关于c# - 运行 c# 编译代码时的 Windows 调度程序功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35019536/

相关文章:

c# - 如何将 "Assert.That()"列表中的项目与 NUnit 匹配某些条件?

windows - 如何在 Dockerfile 中执行 CMD Powershell 脚本

xml - 如何在 Windows 中解压缩 .xml.gz?

python - 发送电子邮件后如何从服务器获取响应?

Android ACTION_SEND 附件

c# - 当我从下拉列表中选择一个值来解决网格中的值时,它会覆盖它

c# - 如何正确地将我的 ContextMenu 命令绑定(bind)到 RelayCommand?

php - 如何在 PHP 中创建动态下载链接

c# - 使用 Linq 搜索

c# - 带有参数和 STDOUT 重定向的 Windows 任务计划程序作业