Подтвердить что ты не робот

Как передать учетные данные команде Send-MailMessage для отправки сообщений электронной почты

Мне трудно передать свои учетные данные команде Send-MailMessage

Это то, что я запускаю:

Send-MailMessage -smtpServer smtp.gmail.com -from '[email protected]' `
    -to '[email protected]' -subject 'Test' -attachment C:\CDF.pdf

это ошибки с ниже сообщения, которое, очевидно, потому, что я не передал свои учетные данные gmail

Send-MailMessage : The SMTP server requires a secure connection or the client was not
authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

Я немного поработал с Google, а также просмотрел страницу руководства Send-MailMessage и обнаружил, что нужно передать параметр "-средний".

Моя проблема: КАК?

Я попробовал с Get-Credentials, как показано ниже:

$mycredentials = Get-Credential

Затем введите имя пользователя и пароль для gmail в появившемся окне.

тогда я запускаю команду ниже:

Send-MailMessage -smtpServer smtp.gmail.com -credentail $mycredentials `
  -from '[email protected]' -to '[email protected]' -subject 'Test' -attachment C:\CDF.pdf

и все же он терпит неудачу с той же ошибкой.

Итак, мне нужна помощь от вас, ребята, как передать свои учетные данные команде Send-MailMessage. Я узнал о PScredentials, но не совсем уверен, что это такое и как использовать его в этом контексте.

4b9b3361

Ответ 1

Итак, это проблема SSL. Все, что я делал, было абсолютно правильным. Только то, что я не использовал параметр ssl. Поэтому я добавил "-Usessl true" в свою первоначальную команду, и она сработала.

Ответ 2

Я нашел этот блог-сайт: Адам Кахтава
Я также нашел этот вопрос: send-mail-via-gmail-with-powershell-v2s-send-mailmessage
Проблема в том, что ни один из них не отвечает обеим вашим потребностям (вложение с паролем), поэтому я сделал некоторую комбинацию из двух и придумал следующее:

$EmailTo = "[email protected]"
$EmailFrom = "[email protected]"
$Subject = "Test" 
$Body = "Test Body" 
$SMTPServer = "smtp.gmail.com" 
$filenameAndPath = "C:\CDF.pdf"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password"); 
$SMTPClient.Send($SMTPMessage)

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

Function Send-EMail {
    Param (
        [Parameter('
            Mandatory=$true)]
        [String]$EmailTo,
        [Parameter('
            Mandatory=$true)]
        [String]$Subject,
        [Parameter('
            Mandatory=$true)]
        [String]$Body,
        [Parameter('
            Mandatory=$true)]
        [String]$EmailFrom="[email protected]",  #This gives a default value to the $EmailFrom command
        [Parameter('
            mandatory=$false)]
        [String]$attachment,
        [Parameter('
            mandatory=$true)]
        [String]$Password
    )

        $SMTPServer = "smtp.gmail.com" 
        $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
        if ($attachment -ne $null) {
            $SMTPattachment = New-Object System.Net.Mail.Attachment($attachment)
            $SMTPMessage.Attachments.Add($SMTPattachment)
        }
        $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
        $SMTPClient.EnableSsl = $true 
        $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom.Split("@")[0], $Password); 
        $SMTPClient.Send($SMTPMessage)
        Remove-Variable -Name SMTPClient
        Remove-Variable -Name Password

} #End Function Send-EMail

Чтобы вызвать его, просто используйте эту команду:

Send-EMail -EmailTo "[email protected]" -Body "Test Body" -Subject "Test Subject" -attachment "C:\cdf.pdf" -password "Passowrd"

Я знаю, что небезопасно вводить пароль просто так. Я посмотрю, смогу ли я придумать что-нибудь более безопасное и обновить позже, но по крайней мере это должно дать вам то, что вам нужно для начала. Желаю хорошей недели!

Изменение: Добавлено $EmailFrom на основе комментария JuanPablo

Редактировать: SMTP было прописано STMP во вложениях.

Ответ 3

Мне потребовалось некоторое время, чтобы объединить все, сделать его немного безопасным и работать с Gmail. Надеюсь, этот ответ спасет кого-то некоторое время.

Создать файл с зашифрованным паролем сервера:

В Powershell введите следующую команду (замените myPassword своим фактическим паролем):

"myPassword" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\EmailPassword.txt"

Создать файл powershell script (пример sendEmail.ps1):

$User = "[email protected]"
$File = "C:\EmailPassword.txt"
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "[email protected]"
$EmailFrom = "[email protected]"
$Subject = "Email Subject" 
$Body = "Email body text" 
$SMTPServer = "smtp.gmail.com" 
$filenameAndPath = "C:\fileIwantToSend.csv"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password); 
$SMTPClient.Send($SMTPMessage)

Автоматизация с помощью планировщика заданий:

Создайте пакетный файл (пример emailFile.bat) со следующим:

powershell -ExecutionPolicy ByPass -File C:\sendEmail.ps1

Создайте задачу для запуска командного файла. Примечание. У вас должна быть задана задача с той же учетной записью пользователя, которую вы использовали для зашифрования пароля! (Aka, возможно, зарегистрированный пользователь)

Это все; теперь у вас есть способ автоматизировать и запланировать отправку электронной почты и вложения с помощью Планировщика задач Windows и Powershell. Нет стороннего программного обеспечения, и пароль не хранится в виде обычного текста (хотя предоставляется, а также не очень безопасно).

Вы также можете прочитать эту статью на уровне безопасности, который обеспечивает ваш пароль электронной почты.

Ответ 4

PSH > $cred = Get-Credential

PSH > $cred | Export-CliXml c:\temp\cred.clixml

PSH > $cred2 = Import-CliXml c:\temp\cred.clixml

Это хэширует его против вашего SID и SID машины, поэтому файл бесполезен на любой другой машине или в других руках.

Ответ 5

в дополнение к UseSsl, вы должны включить smtp-порт 587, чтобы он работал.

Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From '[email protected]' -To '[email protected]' -Subject 'TEST'

Ответ 6

А вот простой пример Send-MailMessage с именем пользователя/паролем для тех, кто ищет именно это

$secpasswd = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Send-MailMessage -SmtpServer mysmptp -Credential $cred -UseSsl -From '[email protected]' -To '[email protected]' -Subject 'TEST'