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()
【问题讨论】:
如果您通过 cmdpowershell -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 脚本
如何在具有管理员权限的 Windows 任务计划程序中设置 Powershell 脚本?