【发布时间】:2019-01-20 07:12:58
【问题描述】:
我正在尝试使用 Rack Space 的 emailsrvr 服务通过 PowerShell 发送电子邮件。我应该补充一点,我是一个 PHP 人,所以 PowerShell 超出了我的正常工作范围。代码如下(变量都设置在这个sn-p之上):
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = $emailFrom
foreach ($addr in $emailTo) {
$emailMessage.To.Add($addr)
}
$emailMessage.Subject = $subject
$emailMessage.Body = $emailContent
$smtpClient = New-Object System.Net.Mail.SmtpClient('smtp.emailsrvr.com', '587')
$smtpClient.UseDefaultCredentials = $false;
$smtpClient.Credentials = New-Object System.Net.NetworkCredential($smtpUser, $smtpPass);
当我运行脚本时,出现以下错误:
使用“1”个参数调用“发送”的异常:“交易失败。 服务器响应是: 5.7.1 : Recipient 地址被拒绝:访问被拒绝”在 C:\my_test_script.ps1:24 字符:5 + $SMTPClient.Send($emailMessage) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : SmtpException
据我了解 - 这是因为 SMTP 客户端未正确使用 RackSpace 进行身份验证,并且中继被拒绝。
我决定尝试 telnet 看看是什么:
220 smtp2.relay.ord1d.emailsrvr.com ESMTP - VA Code Section 18.2-152.3:1 forbids use of this system for unsolicited bulk electronic mail (Spam)
ehlo mydomain.com
250-smtp2.relay.ord1d.emailsrvr.com
250-SIZE 75000000
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250 STARTTLS
我认为问题在于 PowerShell 作为 Microsoft 产品,想要使用比 PLAIN 或 LOGIN 更安全的身份验证方法。
无论如何我可以强制 PowerShell 使用 RackSpace 支持的身份验证方法吗?我正在查看一些解决方案,但它们似乎是基于 C# 的,因为 PowerShell 无法识别代码。
【问题讨论】:
-
似乎电子邮件服务器使用 STARTTLS,这意味着您应该使用 $smtpClient.EnableSsl = $true 更多信息请参阅 RFC 3207。
-
我都试过了。这是非安全端口.. 所以在那里看到 STARTTLS 有点奇怪。
标签: powershell smtpclient