使用PowerShell V2的Send-MailMessage通过Gmail发送邮件

Sco*_*ein 41 security powershell gmail

我正在试图弄清楚如何在Send-MailMessagegmail中使用PowerShell V2 .

这是我到目前为止所拥有的.

$ss = New-Object Security.SecureString
foreach ($ch in "password".ToCharArray())
{
    $ss.AppendChar($ch)
}
$cred = New-Object Management.Automation.PSCredential "uid@domain.com", $ss
Send-MailMessage  -SmtpServer smtp.gmail.com -UseSsl -Credential $cred -Body...
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

Send-MailMessage : The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn
 more at
At foo.ps1:18 char:21
+     Send-MailMessage <<<<      `
    + CategoryInfo          : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage
Run Code Online (Sandbox Code Playgroud)

我做错了什么,或者还Send-MailMessage没有完全出炉(我在使用CTP 3)?

一些额外的限制

  1. 我希望这是非交互式的,所以Get-Credential不会起作用
  2. 用户帐户不在Gmail域,而是谷歌应用注册域
  3. 对于这个问题,我只对Send-MailMessagecmdlet 感兴趣,通过正常的.Net API发送邮件是很好理解的.

Chr*_*utt 46

刚发现这个问题..这是我的用于Gmail的PowerShell Send-MailMessage示例.经过测试和工作的解决方案:

$EmailFrom = "notifications@somedomain.com"
$EmailTo = "me@earth.com"
$Subject = "Notification from XYZ"
$Body = "this is a notification from XYZ Notifications.."
$SMTPServer = "smtp.gmail.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password");
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
Run Code Online (Sandbox Code Playgroud)

只需在$ SMTPClient.Credentials中更改$ EmailTo和用户名/密码..不要在您的用户名中包含@ gmail.com.

也许这是对其他人遇到这个问题的帮助..

  • 但是,几乎在那里,您可能会收到错误消息"SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.5.1需要身份验证."这是因为Gmail的默认安全设置会阻止连接,正如Google的自动消息所示.因此,只需按照消息中的说明操作,启用"访问安全性较低的应用程序".风险自负.:) (3认同)
  • Gmail 帐户身份验证始终失败?我遇到了这个问题,这就是我写这篇文章的原因。我想我肯定出了什么问题。事实证明,我需要使用“应用程序密码”而不是我的 Google 帐户密码(因为这是 MFA - 多因素身份验证)。创建应用程序密码:https://www.google.com/settings/security (2认同)

小智 13

这应该可以解决您的问题

$credentials = New-Object Management.Automation.PSCredential “mailserver@yourcompany.com”, (“password” | ConvertTo-SecureString -AsPlainText -Force)
Run Code Online (Sandbox Code Playgroud)

然后使用您呼叫的凭证 Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl


小智 8

我刚遇到同样的问题并遇到了这篇文章.它实际上帮助我使用本机Send-MailMessage命令运行它,这是我的代码:

$cred = Get-Credential
Send-MailMessage ....... -SmtpServer "smtp.gmail.com" -UseSsl -Credential $cred -Port 587 
Run Code Online (Sandbox Code Playgroud)

但是,为了让Gmail允许我使用SMTP服务器,我必须登录我的Gmail帐户,并通过此链接https://www.google.com/settings/security将"访问安全性较低的应用"设置为"已启用".最后它确实有效!!

ciao marco


Sha*_*evy 7

我不确定您是否可以使用Send-MailMessage更改端口号,因为gmail适用于端口587.无论如何,这里是如何使用.NET SmtpClient通过gmail发送电子邮件:

$smtpClient = New-Object system.net.mail.smtpClient
$smtpClient.Host = 'smtp.gmail.com'
$smtpClient.Port = 587
$smtpClient.EnableSsl = $true
$smtpClient.Credentials = [Net.NetworkCredential](Get-Credential GmailUserID)
$smtpClient.Send('GmailUserID@gmail.com', 'yourself@somewhere.com', 'test subject', 'test message')
Run Code Online (Sandbox Code Playgroud)