#powershell
Вопрос:
Я создал функцию для PowerShell, используя старый метод skool для отправки электронной почты через PowerShell с помощью Net.Mail.MailMessage. Это прекрасно работает, однако я знаю, что есть и другие способы сделать это в более простом формате с помощью Send-MailMessage. Я собрал по кусочкам функцию отправки сообщений электронной почты, но при ее запуске я получаю сообщение об ошибке. Мысли о том, чтобы исправить ошибку или изменить код, чтобы сделать его немного проще? Обратите внимание, что password.txt файл, на который указывает скрипт, представляет собой зашифрованный текстовый файл пароля, созданный с помощью PowerShell.
Рабочая Функция
function sendMail ($message)
{
"Sending Email"
#SMTP server name
$smtpServer = "smtp.office365.com"
#Creating a Mail object
$msg = new-object Net.Mail.MailMessage
$emailPassword = Get-Content "C:scriptfolderpassword.txt" | ConvertTo-SecureString
$emailCredential = New-Object System.Net.NetworkCredential("sender@domain.com", $emailPassword)
#Add Attachment
$Attachments = "attached file"
#Creating SMTP server object
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Port = 587
$smtp.EnableSSl = $true
$smtp.Credentials = $emailCredential
#Email structure
$msg.From = "sender@domain.com"
$msg.To.add("user1@domain.com")
$msg.CC.Add("user2@domain.com")
$msg.CC.Add("user3@domain.com")
$msg.subject = "***TEST***"
$msg.body = "***TEST****"
$msg.Attachments.Add($Attachments)
#Sending email
$smtp.Send($msg)
"Email Sent"
};
Sendmail
Отправить-сообщение электронной почты, которое не работает
workflow SendEmail {
$emailPassword = Get-Content "C:password.txt" | ConvertTo-SecureString
$emailCredential = New-Object System.Net.NetworkCredential("sender@domain.com", $emailPassword)
InlineScript {
Send-MailMessage -From 'Sender <sender@domain.com>' -To 'User1 <user1@domain.com>', 'User2 <user2@domain.com>' -Subject 'Sending the Attachment' -Body "Forgot to send the attachment. Sending now." Attachments "attached file" -DeliveryNotificationOption OnSuccess, OnFailure -SmtpServer 'smtp.office365.com' -Port '587' -Credential $using:emailCredential
}
}
SendMail
Ошибка при отправке сообщения электронной почты
Cannot process argument transformation on parameter 'Credential'. userName
CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindin...mationException
FullyQualifiedErrorId : ParameterArgumentTransformationError,Microsoft.PowerShell.Commands.SendMailMessage
PSComputerName : [localhost]
Новая ошибка после изменения кода
Send-MailMessage : Error in processing. The server response was: 5.7.3 STARTTLS is required to send mail [SA0PR13CA0028.namprd13.prod.outlook.com]
At SendEmail:9 char:9
CategoryInfo : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException
FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage
PSComputerName : [localhost]
Комментарии:
1. Измените
System.Net.NetworkCredential
System.Management.Automation.PSCredential
и добавьтеConvertTo-SecureString
в вызов следующие параметры:-AsPlaintext -Force
2. Также было бы лучше в первую очередь сохранить пароль как a
SecureString
. Если вы можете положиться на поведение DPAPI по умолчанию, это просто:Get-Credential | Export-CliXml C:pathtocred.xml
, затем прочитайте его снова с$emailCredential = Import-CliXml C:pathtocred.xml
помощью . Если вам нужно использовать пользовательский ключ, созданиеPSCredential
объекта-это немного больше работы, но считывание его обратно так же просто, при условии, что сертификат установлен на хосте, расшифровывающем встроенныйSecureString
. Прямо сейчас использованиеpassword.txt
подразумевает строку открытого текста, хранящуюся в файле в файловой системе.3. Спасибо, Матиас-я внес эти изменения, но теперь получаю новую ошибку.
4. @BendertheGreatest — Я сгенерировал пароль, используя следующее
(get-credential).password | ConvertFrom-SecureString | set-content "C:password2.txt"