Send-MailMessage:SMTP服务器需要安全连接...服务器响应为:5.5.1需要身份验证。

问题描述 投票:1回答:3

好吧,正如标题所说,我在尝试通过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 = "[email protected]"
$cred = New-Object System.Management.Automation.PSCredential($name,$pass)
##############################################################################
$From = "[email protected]"
$To = "[email protected]"
$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客户经理的安全性较低的应用启用了Access。如果我使用-Credential (Get-Credential)提示输入凭据而不是调用$cred变量,我确实可以正常工作。

有什么我想念的吗?

谢谢,丹

email powershell smtp
3个回答
0
投票

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


0
投票

如果文件包含加密密码,最好像这样读取它(没有参数-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
foobar

请注意,安全字符串的加密与用户和主机加密有关,这意味着您无法解密其他主机或其他用户的安全字符串。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.