【问题标题】:Powershell Script not able to send email via Outlook using Task SchedulerPowershell 脚本无法使用任务计划程序通过 Outlook 发送电子邮件
【发布时间】: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 询问详情。

标签: email powershell outlook taskscheduler


【解决方案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 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多