You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:15:32