如何检查电子邮件是否已通过Powershell发送

时间:2019-05-03 14:16:09

标签: powershell

我目前正在编写Powershell脚本,该脚本可对服务器执行ping操作,如果无法建立连接,则会向IT部门发送电子邮件以手动重新启动服务器。

现在,当ping操作不成功并且该对象具有属性值时,脚本可以成功发送电子邮件,该属性值应评估为“ True”,但我无法验证,因为发送电子邮件后,该变量将自身删除,因此该属性不再存在。

    $Outlook = New-Object -ComObject Outlook.Application
    $Mail = $Outlook.CreateItem(0)
    $Mail.To = "<recipient>"
    $Mail.Cc = "<some_cc>"

    $Mail.Send()
    # After this line, the variable is deleted!
    if ($Mail.Sent()) 
    # The line which is supposed to work, but evaluates to False everytime

如何确保在我可以验证交换之前该变量仍然存在?

2 个答案:

答案 0 :(得分:1)

该变量在Send方法之后将无法生存,也将不会返回任何值。 您正在将实际的发送操作委派给Outlook,因此您需要检查Outlook应用程序是否存在错误(即退回)。

如果不需要通过Outlook发送,则可以通过

使用更多选项
try {
    Send-MailMessage -From 'monitoring@example.com' -To 'ITdesk@example.com' -Subject 'test' -Body 'whatever'  -Priority High -DeliveryNotificationOption OnSuccess, OnFailure -SmtpServer 'mail.example.com' -ErrorAction stop -Port 25
}
catch{
    write-warning "error in sending. $_"
}

请注意,如果您需要通过身份验证的发送,则可以通过-credential参数指定保存的凭据。

此处参考: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage?view=powershell-6

答案 1 :(得分:0)

您可以将mail.send()放在try / catch块中。这样,如果有任何错误或成功,它将输出。另外,不需要其他变量。

try{
   mail.send()
   write-host "success"
}catch{
   write-host "fail"
}