Я создал скрипт для проверки связи с серверами, который запускается из планировщика заданий. Если сервер не пингуется, он должен отправить мне электронное письмо. Он также отправляет электронное письмо один раз в день, что он жив.
Проблема в том, что большинство электронных писем отправляются и приходят, как и ожидалось, но иногда электронное письмо не отправляется. Ошибка не выдается. Судя по анализу потока почты, электронная почта никогда не доходит до нашего сервера Office365 Exchange.
Я читал различные решения, в том числе вставку командлетов сна и использование блока try/catch. До сих пор я находил только сообщения с проблемами, в которых Send-MailMessage дает сбой постоянно, но не сообщения с проблемами, в которых он не работает беспорядочно.
Я записываю результаты, но что касается попытки/пойма, то Send-MailMessage всегда завершается успешно.Мои файлы журналов всегда показывают успешную отправку, а не сбой.
Мои навыки работы с PowerShell все еще находятся на начальной стадии, весь код для расшифровки идентификатора пользователя и пароля был скопирован у других, более знающих людей.
Код, который считывает учетные данные, расшифровывает учетные данные, создает и отправляет электронную почту:
(emailOperator — это гибридная учетная запись пользователя Office365 с лицензией E1)
В 100% случаев, если я вручную запускаю сценарий из PowerShell ISE, электронное письмо отправляется.
В 100% случаев, если я запускаю задание вручную из планировщика заданий, электронное письмо отправляется (я делал это десятки раз, а не сотни).
$EmailRecipient = '[email protected]'
$emailFrom = '[email protected]'
$ReportingHost = 'Отчетный хост: ' + $env:имя_компьютера
$CredentialLocation = "c:\MyServer\SendEmailUsingOffice365CredentialFolder\"
#Чтение ключа AES
$AES_AdminDomain_KeyFilePath = $CredentialLocation + "AESKEY.txt" <# ключ шифрования домена администратора AES #>
$AESKey = Get-Content $AES_AdminDomain_KeyFilePath
#Чтение и расшифровка пароля с помощью AESKey
$ExportedPasswordFilePath = $CredentialLocation + "Password.txt" <# Password #>
$pwdTxt = Get-Content $ExportedPasswordFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Ключ $AESKey
#Прочитайте и расшифруйте имя пользователя с помощью AESKey
$ExportedUserNameFilePath = $CredentialLocation + "User.txt" <# Имя пользователя #>
$UserSecureString = ConvertTo-SecureString -key $AESKey -String (Get-Content $ExportedUserNameFilePath)
$Pointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($UserSecureString)
$Sender = [Runtime.InteropServices.Marshal]::PtrToStringAuto($Pointer)
# сгенерировать учетные данные
$EmailCredentials = New-Object System.Management.Automation.PSCredential -ArgumentList $Sender, $securePwd
# Создайте письмо
$EmailSubject = $env:ComputerName + "активен и проверяет конечные точки на " + (get-date -Format HH:mm)
$EmailBody = "- конец-"
Старт-Сон -с 1
Пытаться
{
Send-MailMessage -SmtpServer smtp.office365.com -Port 587 -UseSSL -From $EmailFrom -To $EmailRecipient -Subject $EmailSubject -Body $EmailBody -Credential $EmailCredentials
}
Ловить
{
"ошибка, я жив, письмо НЕ отправлено, x" + $_.Exception.Message + "x" + $(Get-Date -format 'MM/dd/yyyy,HH:mm:ss') | Out-File -Filepath $Log_File -NoClobber -append
}
"eMail, я жив, электронное письмо отправлено, y" + $_.Exception.Message + "y" + $(Get-Date -format 'MM/dd/yyyy,HH:mm:ss') | Out-File -Filepath $Log_File -NoClobber -append
Есть ли способ отправить электронное письмо и заставить PowerShell отслеживать его ход?
Спасибо