#powershell
#powershell
Вопрос:
У меня есть сценарий Powershell, который записывает результат в текстовый файл (работает нормально), теперь мне нужно обновить его, чтобы отправлять электронную почту вместо файла журнала (см. Фактический сценарий ниже). Я вроде как новичок в powershell, надеюсь, вы сможете мне помочь.
# details of the script
# if a file "FILE.400" is found and check the modified date, it will send a log file (txt file)
# need to update the script, to send email instead of a log file
$svr=$env:ComputerName
$date=[datetime]::Today.ToString('MM-dd-yyyy')
$filename = "FILE.400"
$DestLogs1 = "E:samplepfupdatedfin-$date.txt"
$DestLogs2 = "E:samplepfoutdatedfin-$date.txt"
$SrcPath = "E:sample$filename"
If ((Get-ChildItem $SrcPath).LastWriteTime -gt $date)
{
$date | Out-File $DestLogs1
Write-Output "Found latest FILE.400 file" | Out-File $DestLogs1 -Append
(Get-ChildItem -Recurse -Path $SrcPath).LastWriteTime | Out-File $DestLogs1 -Append
}
Else
{
Write-Output "FILE.400 - is not updated, please verify " | Out-File $DestLogs2
(Get-ChildItem -Recurse -Path $SrcPath).LastWriteTime | Out-File $DestLogs2 -Append
}
Комментарии:
1. Используйте
Send-MailMessage
вместо / в дополнение кwrite-host
.2. @vonPryz можешь показать мне код
Ответ №1:
Send-MailMessageis
довольно прост в использовании. Онлайновую документацию по командлетам очень легко найти. Просто введите название командлета в вашей любимой поисковой системе. Или используйте Get-Help
командлет. Вот пример того, как его использовать, просто заполните переменные разумно :
Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -Port $SMTPPort -Credential $Credential # -UseSsl:$UseSsl
-useSsl
это переключатель, поэтому в нем нет необходимости, если это не $true
. Если вы хотите предоставить переменную параметру switch, используйте не пробел, а :
промежуточный.
Учетные данные в Powershell хранятся в объектах учетных данных. Вы не можете просто использовать обычный текстовый пароль. Однако не думайте, что они хранятся в экстремальном режиме, поскольку пароль может быть легко извлечен, если вы знаете как. Вот как вы создаете необходимый объект учетных данных:
$SecPw = ConvertTo-SecureString -AsPlainText $Password -Force
$Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName,$SecPw
Комментарии:
1. Когда я выполняю сценарий, я столкнулся с этой ошибкой ниже ..Send-MailMessage: не удается подключиться к удаленному серверу в C:Usersmis . ICT-NB-15 Desktop JDA-EOD-Checking.ps1:25 char:1 Отправить-MailMessage -To $To -From $MyEmail -Subject $Subject1 -Body $Bod … ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Информация о категории: Недопустимая операция: (System.Net.Mail.SmtpClient:SmtpClient) [Отправить-MailMessage], исключение SmtpException FullyQualifiedErrorId: исключение SmtpException, Microsoft. PowerShell. Команды. Отправить сообщение электронной почты.. при использовании моего собственного подключения дома скрипт работает
2. Возможно, попробуйте другой порт, например 25, без SSL. Я не знаю конфигурацию вашего почтового сервера… Другим источником ошибки может быть то, что соединители отправки вашего exchange не принимают почту с этого сервера. (Если это ваш рабочий компьютер, он должен работать, если вы можете отправлять письма …)
3. да, тот же ноутбук, которым я пользуюсь из дома (или на работе), меняется только подключение. Используя скрипт, я могу получать электронные письма (кстати, я использую smtp.gmail.com )— отправитель и получатель являются учетными записями gmail
4. Брандмауэр разрешен для этого порта?
Ответ №2:
сценарий работает, как ожидалось, в моей домашней сети
$svr=$env:ComputerName
$date=[datetime]::Today.ToString('MM-dd-yyyy')
$filename = "FILE.400"
$DestLogs1 = "E:samplepfupdatedfin-$date.txt"
$DestLogs2 = "E:samplepfoutdatedfin-$date.txt"
$SrcPath = "E:sample$filename"
# email settings
$MyEmail = "myemail@gmail.com"
$SMTP = "smtp.gmail.com"
$To = "samplereceiver@gmail.com"
$Subject1 = "JDA-Alert || Found FILE.400 file - Successful"
$Body1 = "JDA-Alert || Found FILE.400 file - Successful"
$Subject2 = "JDA-Alert || FILE.400 file - Outdated File"
$Body2 = "JDA-Alert || FILE.400 file - Outdated File"
$Creds = (Get-Credential -Credential "$MyEmail")
If ((Get-ChildItem $SrcPath).LastWriteTime -gt $date)
{
Start-Sleep 2
Send-MailMessage -To $To -From $MyEmail -Subject $Subject1 -Body $Body1 -SmtpServer $SMTP -Credential $Creds -UseSsl -Port 587 -DeliveryNotificationOption Never
}
Else
{
Start-Sleep 2
Send-MailMessage -To $To -From $MyEmail -Subject $Subject2 -Body $Body2 -SmtpServer $SMTP -Credential $Creds -UseSsl -Port 587 -DeliveryNotificationOption Never
}
Комментарии:
1. Приведенный выше сценарий работает в моей домашней сети, у меня ошибка при запуске его в офисе или на сервере на работе — я сталкиваюсь с этой ошибкой, Send-MailMessage: не удается подключиться к удаленному серверу на C:Usersmis . ICT-NB-15 Desktop JDA-EOD-Checking.ps1:25 char:1 Отправить-MailMessage -To $To -From $MyEmail -Subject $Subject1 -Body $Bod … ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Информация о категории: Недопустимая операция: (System.Net.Mail.SmtpClient:SmtpClient) [Отправить-MailMessage], исключение SmtpException FullyQualifiedErrorId: исключение SmtpException, Microsoft. PowerShell. Команды. SendMailMessage
2. приведенный выше сценарий уже работает, причина, по которой он не работает — сервер использует старую версию Powershell (v2)— Я обновил его до версии 5.1 и разрешил порт smtp в нашем брандмауэре