43

我在将凭据传递给Send-MailMessage命令时遇到困难

这就是我正在运行的:

Send-MailMessage -smtpServer smtp.gmail.com -from 'myself@gmail.com' `
    -to 'myself@gmail.com' -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了一下,也浏览了man page,Send-MailMessage发现需要传递“-credential”参数。

我的问题是:如何?

我尝试使用 Get-Credentials,如下所示:

$mycredentials = Get-Credential

然后在弹出的框中输入我的 gmail 用户名和密码。

然后我运行以下命令:

Send-MailMessage -smtpServer smtp.gmail.com -credentail $mycredentials `
  -from 'myself@gmail.com' -to 'myself@gmail.com' -subject 'Test' -attachment C:\CDF.pdf

仍然失败并出现完全相同的错误。

所以我需要你们帮助我如何将我的凭据传递给Send-MailMessage命令。我了解了 PScredentials,但不确定它是什么以及如何在这种情况下使用它。

4

7 回答 7

47

我找到了这个博客站点:Adam Kahtava
我还发现了这个问题:send-mail-via-gmail-with-powershell-v2s-send-mailmessage
问题是,它们都没有满足您的需求(带密码的附件),所以我将两者结合起来并提出了这个:

$EmailTo = "myself@gmail.com"
$EmailFrom = "me@mydomain.com"
$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="myself@gmail.com",  #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 "Myself@gmail.com" -Body "Test Body" -Subject "Test Subject" -attachment "C:\cdf.pdf" -password "Passowrd"

我知道像这样简单地输入密码是不安全的。我会看看我是否能想出更安全的东西并在以后更新,但至少这应该能让你得到开始所需的东西。有一个伟大的一周!

编辑:$EmailFrom根据 JuanPablo 的评论添加

编辑: SMTP 在附件中拼写为 STMP。

于 2012-09-17T16:01:37.197 回答
22

这是一个简单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 'sender@gmail.com' -To 'recipient@gmail.com' -Subject 'TEST'
于 2019-01-10T13:33:07.307 回答
17

我花了一些时间来整合所有东西,让它变得有点安全,并让它与 Gmail 一起使用。我希望这个答案可以节省一些时间。

使用加密的服务器密码创建一个文件:

在 Powershell 中,输入以下命令(将 myPassword 替换为您的实际密码):

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

创建一个 powershell 脚本(例如 sendEmail.ps1):

$User = "usernameForEmailPassword@gmail.com"
$File = "C:\EmailPassword.txt"
$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
$EmailTo = "emailTo@yahoo.com"
$EmailFrom = "emailFrom@gmail.com"
$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

创建一个任务来运行批处理文件。注意:您必须使用与加密密码相同的用户帐户运行任务!(又名,可能是登录用户)

就这样; 您现在可以使用 Windows 任务计划程序和 Powershell 自动发送和安排发送电子邮件和附件。没有第 3 方软件,并且密码不是以纯文本形式存储的(尽管被授予,但也不是非常安全)。

您还可以阅读这篇文章,了解这为您的电子邮件密码提供的安全级别。

于 2016-06-06T09:57:18.327 回答
8

PSH> $cred = 获取凭据

PSH> $信用| 导出 CliXml c:\temp\cred.clixml

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

这会将它与您的 SID 和机器的 SID 进行哈希处理,因此该文件在任何其他机器上或在其他任何人的手中都是无用的。

于 2013-09-21T03:36:48.840 回答
7

所以..这是 SSL 问题。我所做的一切都是绝对正确的。只是我没有使用 ssl 选项。所以我在我的原始命令中添加了“-Usessl true”并且它起作用了。

于 2012-09-17T16:10:40.080 回答
5

除了 UseSsl 之外,您还必须包含 smtp 端口 587 才能使其工作。

Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From 'yyy@gmail.com' -To 'xxx@email.com' -Subject 'TEST'
于 2014-04-05T04:36:23.940 回答
0

除了其他答案,我想指出,如果您有两个因素身份验证,您将需要在您的谷歌帐户上创建一个应用程序密码。

有关详细说明: https: //support.google.com/accounts/answer/185833

于 2021-09-17T15:07:15.043 回答