PowerShell — Функция Отправки электронной почты

#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"