【问题标题】:Send-MailMessage : The SMTP server requires a secure connection... The server response was: 5.5.1 Authentication Required.Send-MailMessage :SMTP 服务器需要安全连接... 服务器响应是:5.5.1 需要身份验证。
【发布时间】:2015-08-27 15:37:13
【问题描述】:

好吧,正如标题所说,我在尝试通过 PowerShell 发送电子邮件时收到此错误:

Send-MailMessage : SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.5.1 需要身份验证。

我查看了许多与同一问题相关的问题。但我似乎无法让我的脚本工作:

    #Email alerts when a user gets locked out
##############################################################################
$pass = Get-Content .\securepass.txt | ConvertTo-SecureString -AsPlainText -Force
$name = "sender@gmail.com"
$cred = New-Object System.Management.Automation.PSCredential($name,$pass)
##############################################################################
$From = "sender@gmail.com"
$To = "recipient@domain.org"
$Subject = "User Locked Out"
$Body = "A user has been locked out of his/her account."
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"

Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort `
-Credential $cred -UseSsl
##############################################################################

我已从将运行脚本的机器登录到 Gmail 帐户。我还从 Google 客户经理启用了访问不太安全的应用程序。如果我使用 -Credential (Get-Credential) 提示输入凭据而不是调用 $cred 变量,我确实可以正常工作。

我有什么遗漏吗?

谢谢, 丹

【问题讨论】:

  • 如果您需要通过 SMTP 服务器进行身份验证,是否需要发送 SMTP 用户凭据?
  • @EvanFrisch 他正在这样做 (-Credential $cred)。
  • @AnsgarWiechers 我肯定会失明,我的错。
  • 如果通过Get-Credential 提供密码时身份验证有效,但从文件中读取密码时无效,则问题很可能出在密码文件上。仔细检查文件的内容(尾随空格、编码等)。
  • 感谢 Ansgar,您让我看到了正确的区域。我想到了。密码文件包含已加密的密码。我用未加密的明文密码替换了它,因此在设置我的 $pass 变量时它会被加密。

标签: email powershell smtp


【解决方案1】:

如果文件包含加密密码,最好这样读取(不带参数-AsPlainText-Force):

$pass = Get-Content .\securepass.txt | ConvertTo-SecureString

演示:

PS C:\> $sec = 'foobar' | ConvertTo-SecureString -AsPlainText -Force PS C:\> $sec System.Security.SecureString PS C:\> $txt = $sec | ConvertFrom-SecureString PS C:\> $txt 01000000d08c9ddf0115d1118c7a00c04fc297eb01000000615ce070639b9647a5e05d42b41d373 0000000000200000000001066000000010000200000001614c19281e7c0b076cceb38e284b0f18b c0d813ea40ed055dde96fd9ccb6977000000000e8000000002000020000000a10c7019eb224c3c6 387ba03bcd94993a50e0c468248284bbce4d235b11f1b94100000002421a5d7102de13c46ccc1db c4921287400000000412332ecb500828f4403f3e225089c629369744bad62609b528ed0a7318abf 512c9b6a8884c43b3adc8a13d5d21a9ed27e56702bcc7db094da9d9d4c02dfa74 PS C:\> $sec2 = $txt | ConvertTo-SecureString PS C:\> $sec2 System.Security.SecureString PS C:\> $cred = New-Object Management.Automation.PSCredential 'foo', $sec2 PS C:\> $cred.GetNetworkCredential().Password 富吧

请注意,尽管安全字符串的加密与加密它们的用户和主机相关,这意味着您无法在另一台主机上或作为另一用户解密安全字符串。

【讨论】:

    【解决方案2】:

    感谢 Angsgar,我在查看我的密码文件内容后找到了答案。 securepass.txt 里面有加密的内容,而不是明文。我所做的是用实际密码替换它,然后在设置我的 $pass 变量时将其加密。现在一切都很好!

    【讨论】:

      【解决方案3】:

      Ansgar 的答案是一个很好的通用答案,但对于 Google,他们有多个您可以使用的 SMTP 服务器。 smtp.google.com 需要身份验证,但并非所有人都这样做。

      来自Google's doc,如果您的站点是 G Suite 站点并且您将始终从特定 IP 地址发送,您可以在 G Suite 配置中指定地址,然后使用 G Suite SMTP 中继 smtp-relay.gmail.com。这仅适用于 G Suite 用户,并且需要身份验证或静态 IP。在我们的网站上,我们有一个内部 SMTP 服务器,用于将这些类型的电子邮件中继到 Google 的 G Suite SMTP 中继服务器。

      如果您仅向 Google 或 G Suite 地址发送电子邮件,则可以指定 aspmx.l.google.com 作为您的 SMTP 地址。这称为受限的 Gmail SMTP 服务器。

      【讨论】:

        猜你喜欢
        • 2013-09-01
        • 1970-01-01
        • 2018-01-22
        • 2016-04-12
        • 2012-05-28
        • 2017-04-10
        相关资源
        最近更新 更多