Powershell 脚本无法使用任务计划程序通过 Outlook 发送电子邮件

Posted

技术标签:

【中文标题】Powershell 脚本无法使用任务计划程序通过 Outlook 发送电子邮件【英文标题】:Powershell Script not able to send email via Outlook using Task Scheduler 【发布时间】:2017-05-05 14:38:24 【问题描述】:

我有一个从远程机器获取最新事件日志的脚本。 通过 Outlook 向特定人群发送事件日志详细信息。该脚本在通过 Powershell ISE 运行时运行良好,但不能使用任务计划程序发送电子邮件。 任何帮助,将不胜感激。谢谢

脚本如下:

$Recipients="xyz@outlook.com","abc@outlook.com"

Foreach ($name in $Recipients) 
    $Outlook = New-Object -ComObject Outlook.Application

    $Mail = $Outlook.CreateItem(0)
    $Mail.Recipients.Add($name)
    $Mail.Subject ="Testing"
    $Mail.Body ="Demo"
    Write-Host "Sending Email"
    $Mail.Send()

【问题讨论】:

如果您通过 cmd powershell -file '.\your-script.ps1' 手动运行脚本,您会收到什么错误消息(如果有)? 任务计划程序可能使用与您不同的用户作为命令行用户。确保调度程序用户具有正确的 Outlook 邮件配置文件。 @n01d 没有错误表明它工作正常。但是在任务调度程序时它没有发送电子邮件 @AxelKemper 我的 Outlook 有 3 个帐户,我如何指定它应该从哪个帐户发送电子邮件。 当您启动Outlook.Application 对象时,它会连接到当前用户的默认Outlook 邮件配置文件。您可以为邮件调度目的创建一个技术用户,并将所需的邮件帐户配置为默认值。告诉调度程序将此技术用户用于您的计划任务。作为替代,Namespace.Logon 方法可用于连接到指定帐户。向 Google 询问详情。 【参考方案1】:

您应该只使用 Send-MailMessage 而不是尝试为此使用 Outlook COM 对象。 这样,您就不必依赖邮件配置文件和其他设置(需要在 Outlook 中您用于运行任务的用户下进行设置)。 我还在您的代码中看到了一些奇怪的东西:为每个收件人创建一个新的 COM Outlook COM 对象,然后您尝试发送邮件:移动 For 循环以触发 Outlook COM 对象的创建之后似乎更合乎逻辑。

【讨论】:

【参考方案2】:

任务计划程序作为服务运行 - 不能在服务中使用任何 Office 应用(包括 Outlook)。

【讨论】:

你的意思是说我不能从 Outlook 发送电子邮件..同时从任务调度程序运行 powershell 脚本 您应该使用 Send-MailMessage、.NET MailMessage 类或 EWS API(如果您使用 Exchange 服务器)在计划任务中使用它。老实说,与可用于实现此目标的其他选项相比,为此使用 Outlook COM 对象确实是错误的方法。 @Vishal - 是的,我就是这个意思。【参考方案3】:

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

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

 $From = "YourEmail@gmail.com"
 $To = "AnotherEmail@YourDomain.com"
 $Cc = "YourBoss@YourDomain.com"
 $Attachment = "C:\temp\Some random file.txt"
 $Subject = "Email Subject"
 $Body = "Insert body text here"
 $SMTPServer = "smtp.gmail.com"
 $SMTPPort = "587"
 Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject `
 -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
 -Credential (Get-Credential) -Attachments $Attachment

您也可以考虑使用 EWS,请参阅EWS Managed API, EWS, and web services in Exchange 了解更多信息。

【讨论】:

以上是关于Powershell 脚本无法使用任务计划程序通过 Outlook 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Powershell 脚本不通过计划任务运行

PowerShell 添加任务以使用参数运行 PowerShell 脚本

如何在具有管理员权限的 Windows 任务计划程序中设置 Powershell 脚本?

任务计划的 Powershell 脚本不显示消息框

PowerShell 脚本不会作为 Windows 计划任务执行

任务计划程序无法正确执行批处理文件