我在将凭据传递到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.

我搜索了一下,还浏览了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,但不完全了解它是什么以及如何在这种情况下使用它。

#1楼 票数:36

我找到了这个博客网站: Adam Kahtava
我也发现了这个问题: 通过gmail-with-powershell-v2s-send-mail-message发送邮件
问题是,它们都不能满足您的需求(带有密码的附件),因此我对两者进行了组合,并提出了以下解决方案:

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

我知道这样简单地输入密码并不安全。 我将看看我是否可以提出一些更安全的方法并在以后进行更新,但是至少这应该可以为您提供入门所需的知识。 祝你有美好的一周!

编辑:基于JuanPablo的评论添加了$EmailFrom

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

#2楼 票数:13

我花了一些时间将所有内容组合在一起,使其变得更加安全,并使其与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 Task Scheduler和Powershell自动和安排发送电子邮件和附件的方式。 没有第三方软件,密码也不以纯文本格式存储(尽管被授予,但也不是很安全)。

您还可以阅读有关为您的电子邮件密码提供的安全级别的本文

#3楼 票数:7 已采纳

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

#4楼 票数:6

PSH> $ cred =获取凭证

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

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

这会针对您的SID和计算机的SID进行哈希处理,因此该文件在任何其他计算机上或在任何其他人的手中都无用。

#5楼 票数:4

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

Send-MailMessage -SmtpServer smtp.gmail.com -Port 587 -Credential $credential -UseSsl -From 'yyy@gmail.com' -To 'xxx@email.com' -Subject 'TEST'

#6楼 票数:4

这是一个简单的带有用户名/密码的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'

  ask by slayedbylucifer translate from so

未解决问题?本站智能推荐:

4回复

使用send-mailmessage命令时的电子邮件凭据

我搜索了很多论坛,他们确实解释了如何做到这一点,但技术语言太难理解,因为我对powershell很新。 我希望这一步一步向我解释(婴儿步骤)。 我想在批处理文件(.bat)中运行此powershell命令。 我有一个批处理文件,每周进行一次robocopy备份,我希望批处理文件在备份完成后
1回复

使用Send-MailMessage发送电子邮件有效,但不适用于SmtpClient

以下Powershell脚本可在Windows Server 2012上运行: 当我执行它时,会出现一个窗口,提示您输入指定用户的密码。 输入密码,然后发送电子邮件。 但是,以下脚本不起作用: 它导致错误消息 有什么不同? 如何使第二个脚本起作用?
1回复

发送电子邮件 Send-MailMessage - PowerShell

我必须使用预定义的帐户发送电子邮件,我拥有所有信息、smtp 服务器名称、电子邮件地址、用户、密码。 此帐户使用 TTL。 如何创建脚本以使用 VBA 发送此电子邮件。 我的 Credential 参数有问题,我不知道如何输入用户名和密码 “Send-MailMessage -To 'xxxx@y
1回复

无法在PowerShell 2.0中使用send-mailmessage将电子邮件发送到外部域

我正在尝试从Powershell 2.0脚本发送电子邮件。 发送到我域中其他收件人的邮件已正确传递,但外部域无法接收该邮件。 我尝试将外部电子邮件地址作为字符串,数组和显式作为该类收件人的唯一参数传递给send-mailmessage,但消息不会发送出去。 我正在中继添加到Exchange
1回复

Send-MailMessage要求凭据

Send-Mailmessage在执行时会提示我输入凭据。 我已经尝试创建一个$ from变量来为Powershell提供我的凭据(从技术上来说这是有效的,因为我只是被要求输入密码但是希望它在没有验证的情况下发送电子邮件)
1回复

无法使用Send-Mailmessage在电子邮件中嵌入图像

我是PowerShell的新手,在将图像嵌入自动电子邮件中时遇到问题。 我正在使用Technet的Robert Pearman脚本的修改版本。 电子邮件本身将发送给任何密码将在未来14天内到期的用户。 该脚本在AD中扫描帐户,检索所有详细信息,并向其发送个性化的电子邮件。 我将带
1回复

如何使用 Send-MailMessage 在电子邮件中格式化 PowerShell 脚本的 Select Name、LastWriteTime 的输出?

我目前有一个脚本,每天发送一封电子邮件,概述我们环境中不符合要求日期的文件夹的 Name 和 LastWriteTime。 我正在使用 Send-MailMessage 来执行此操作,但是,当我使用以下代码时,列表的格式在视觉上并不吸引人: 它以下列方式输出结果: 因此,它在电子邮件中没有
1回复

使用 Powershell 使用 Send-Mailmessage 时电子邮件正文被切断

所以我有一个 PS 脚本,我用它来检测计算机正在使用哪些显示监视器。 目标是通过 RMM 服务在客户端的计算机上远程运行这些脚本,以便在不联系客户端的情况下获取该信息。 为了获得输出,我想通过电子邮件将信息发送给自己。 我设法收到一封电子邮件,但与 Powershell 中显示的输出相比,电子邮件的