如何用PowerShell发送邮件?执行代码遇连接关闭错误求助
使用PowerShell通过Yahoo SMTP发送邮件时出现
net_io_connectionclosed错误的解决方法 问题重现
尝试使用PowerShell发送邮件,代码如下:
$Username = "test@yahoo.com" $Password = "testpassword" $SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force $Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $SecurePassword $RcptTo = "somebody@mailserver.com" $Subject = "Yahoo Test" $Body = "This is a test message" Send-MailMessage -From $Username -To $RcptTo -Subject $Subject -Body $Body -SmtpServer smtp.mail.yahoo.com -Port 587 -UseSsl -Credential $Credentials
执行后报错:
Send-MailMessage : Unable to read data from the transport connection: net_io_connectionclosed.
解决步骤
1. 改用Yahoo应用专用密码
Yahoo已禁用普通账户密码用于SMTP验证,必须生成应用专用密码:
- 登录Yahoo账户,进入「账户安全」页面
- 开启「两步验证」(若未开启)
- 在「应用专用密码」板块,生成一个针对邮件客户端的专用密码
- 将代码中的
$Password替换为该专用密码
2. 验证网络与端口可用性
- 确认本地防火墙、杀毒软件或网络代理未拦截587端口
- 保留
-UseSsl参数,Yahoo SMTP强制要求SSL加密连接
3. 替换为System.Net.Mail实现(推荐)
Send-MailMessage是已弃用的cmdlet,改用.NET原生类兼容性更佳:
$Username = "test@yahoo.com" $AppPassword = "你的应用专用密码" $smtpClient = New-Object System.Net.Mail.SmtpClient("smtp.mail.yahoo.com", 587) $smtpClient.EnableSsl = $true $smtpClient.Credentials = New-Object System.Net.NetworkCredential($Username, $AppPassword) $mailMessage = New-Object System.Net.Mail.MailMessage $mailMessage.From = $Username $mailMessage.To.Add("somebody@mailserver.com") $mailMessage.Subject = "Yahoo Test" $mailMessage.Body = "This is a test message" try { $smtpClient.Send($mailMessage) Write-Host "邮件发送成功" } catch { Write-Host "发送失败: $_" }
4. 检查账户访问权限
确保Yahoo账户未限制第三方邮件客户端访问,部分地区账户需在安全设置中开启「允许应用访问」选项
内容的提问来源于stack exchange,提问作者Wendigo
相关产品推荐
相关产品推荐

