Использование зашифрованного пароля для отправки почты не работает - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь использовать сохраненный зашифрованный пароль в сценарии, который отправляет электронное письмо, но я хочу получить сообщение об ошибке:

send-mailmessage: SMTP-сервер требует безопасного соединения или клиент не был аутентифицирован. Ответ сервера: 5.7.57 SMTP; Клиент не прошел проверку подлинности для отправки анонимной почты во время MAIL FROM [DM6PR66666019.namprd456.prod.outlook.com]

Я использовал следующий код для создания текстового файла:

$passwordtostore = 'NotTheRealPassword$9gv8z6VHnPfDd8zc'
$secureStringPWD = $passwordtostore | ConvertTo-SecureString -AsPlainText -Force
$secureStringText = $secureStringPWD | ConvertFrom-SecureString
Set-Content "c:\temp\scriptsencrypted_password1.txt" $secureStringText

Я использую следующее для импорта пароля:

$passwordFile = "c:\temp\scriptsencrypted_password1.txt"
$password = Get-Content $passwordFile | ConvertTo-SecureString

Вот функция sendmail, которую я использую:

function SendMail($ToEmails,$FromEmail,$Subj,$Body,$UserName,$Password){
    $cred = New-Object System.Management.Automation.PSCredential $UserName,$Password

    $MailParams=@{"from"=$FromEmail; "to"=$ToEmails;"body"=$Body;"subject"=$Subj;"smtpserver"="smtp.office365.com"}

    send-mailmessage @MailParams -Credential $cred -UseSsl $true -port 587
}

Вот код, который вызывает функцию:

$alertEmail = "me.stillme@mydomain.com"
$username="psemail@mydomain.com"
$passwordFile = "c:\temp\scriptsencrypted_password1.txt"
$password = Get-Content $passwordFile | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential($username, $password)

Import-Module -Name "..\SendMail.psm1"

... Doing some stuff

SendMail $alertEmail $username "This is the subject" "this is the body" $credential.UserName $credential.Password

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Я обнаружил две проблемы с моим кодом выше:

  1. Неэкранированный $ в пароле.
  2. Как только я добавил "-NoNewline" в набор содержимого, он начал работа.

Итак, чтобы создать зашифрованный файл:

$passwordtostore = "7K9CBgvc4rttvfctrsef6PVHqnP6fDdwhatevervtfdscttzSc"
$secureStringPWD = $passwordtostore | ConvertTo-SecureString -AsPlainText -Force
$secureStringText = $secureStringPWD | ConvertFrom-SecureString
Set-Content "D:\Powershell Scripts\encrypted.hash" $secureStringText -NoNewline

Затем, чтобы получить пароль и использовать его в учетных данных:

$password = Get-Content $passwordFile -Raw | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential($username, $password)

Это не был источником проблемы, но я реализовал предложение @ Theo по поводу использования send-mailmessage.

0 голосов
/ 19 марта 2020

Лично я не понимаю, почему вы создали бы функцию в модуле, который необходимо импортировать для командлета Send-MailMessage. Это усложняет использование.

Кроме того, это отчасти Похоже, вы переключаете адреса электронной почты на и изнутри функции.

В любом случае, все go неправильно, когда вы создаете учетные данные, разбиваете их на имя пользователя и (безопасный) пароль для отправки в качестве параметров функции и рекомбинируете их в объект учетных данных.

Почему бы не пропустить эту функцию модуля и просто выполнить:

$password = Get-Content 'c:\temp\scriptsencrypted_password1.txt' -Raw | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PsCredential('YourLoginName', $password)
$MailParams=@{
    From       = 'me.stillme@mydomain.com'
    To         = 'psemail@mydomain.com'
    Body       = "this is the body"
    Subject    = "This is the subject"
    SmtpServer = 'smtp.office365.com'
    Port       = 587
    UseSsl     = $true
    Credential = $credential
}

Send-MailMessage @MailParams

Это сделает ваш скрипт намного более читабельным / поддерживаемым

...