为什么 Send-MailMessage 无法通过端口 587 使用 STARTTLS 发送

Dsc*_*duc 2 powershell ssl smtp tls1.2

为什么使用标志 -Port 587 通过 Send-MailMessage 命令从 PowerShell 发送电子邮件会产生错误。

命令:

Send-Mailmessage -smtpServer mail.server.com -Port 587 -from "admin@domain.com" -to "user@domain.com" -subject "Test" -body "Test"
Run Code Online (Sandbox Code Playgroud)

错误信息:

Send-Mailmessage :SMTP 服务器需要安全连接或客户端未经过身份验证。服务器响应为:5.7.0 必须首先发出 STARTTLS 命令

PowerShell 文档表示添加 -UseSSL 应指定发送 STARTTLS 命令,但即使添加此标志也可能无法解决您的问题。

命令:

Send-Mailmessage -smtpServer mail.server.com -Port 587 -UseSsl -from "admin@domain.com" -to "user@domain.com" -subject "Test" -body "Test"
Run Code Online (Sandbox Code Playgroud)

错误消息:

Send-Mailmessage:无法从传输连接读取数据:现有连接被远程主机强制关闭。

Dsc*_*duc 7

某些 SMTP 服务器可能已强化为仅接受 TLS 1.2 来协商 STARTTLS。在许多情况下,当指定 -UseSSL 时,Windows 默认配置为发送 TLS 1.0。

要强制 Send-MailMessage 使用 TLS 1.2,需要在执行 Send-MailMessage 之前在脚本中添加一行:

要么输入:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Run Code Online (Sandbox Code Playgroud)

或者

[System.Net.ServicePointManager]::SecurityProtocol = 'TLS12'
Run Code Online (Sandbox Code Playgroud)