PowerShell邮件发送:函数外正常,函数内SMTP认证失败
PowerShell函数版发邮件SMTP认证失败的解决办法
可能的原因及修复步骤:
- SecurityProtocol设置未在函数上下文生效:虽然全局设置了
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12,但函数执行时可能因上下文问题未应用该配置,建议在函数开头重复设置,确保SMTP客户端创建前协议已生效。 - SMTP客户端参数配置遗漏:对比非函数版代码,检查函数内的
SmtpClient是否正确开启EnableSsl = $true,以及Credentials是否用New-Object System.Net.NetworkCredential($username, $password)正确实例化。 - 函数调用参数错误:确认调用函数时传入的SMTP服务器地址、端口、账号密码等参数,和非函数版完全一致,避免拼写或参数遗漏问题。
修复后的示例函数:
function Send-Email { param( [string]$SmtpServer, [int]$SmtpPort, [string]$From, [string]$To, [string]$Subject, [string]$Body, [string]$Username, [string]$Password ) # 在函数内强制设置TLS1.2协议 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $smtpClient = New-Object System.Net.Mail.SmtpClient($SmtpServer, $SmtpPort) $smtpClient.EnableSsl = $true $smtpClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) $mailMessage = New-Object System.Net.Mail.MailMessage($From, $To, $Subject, $Body) $mailMessage.IsBodyHtml = $false # 根据需求可改为$true try { $smtpClient.Send($mailMessage) Write-Host "邮件发送成功" } catch { Write-Error "发送失败: $_" } finally { $mailMessage.Dispose() $smtpClient.Dispose() } } # 调用示例 Send-Email -SmtpServer "smtp.example.com" -SmtpPort 587 -From "sender@example.com" -To "recipient@example.com" -Subject "测试邮件" -Body "这是测试内容" -Username "your-account" -Password "your-password"
额外排查点:
- 若使用Office 365等云邮件服务,确认账号开启SMTP权限,若启用MFA需使用应用密码而非普通密码。
- 检查SMTP服务器端口是否匹配(通常TLS用587,SSL用465),函数内端口要和服务器要求一致。
内容的提问来源于stack exchange,提问作者JPPintoDotCom
相关产品推荐
相关产品推荐

