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

使用PowerShell通过Office365 SMTP发件无报错但未收到邮件求助

Office365 SMTP邮件发送无报错但收不到的排查与修复

问题概述

使用PowerShell脚本通过Office365 SMTP发送邮件,无报错但始终收不到邮件,相同发件地址、端口的Java脚本可正常发件。

原代码存在的问题及修复方案

修复后的完整代码

function Send-Mail ($message)
{
    Write-Host "Sending Email"

    # SMTP服务器地址
    $smtpServer = "smtp.office365.com"

    # 创建邮件对象
    $msg = New-Object Net.Mail.MailMessage

    $emailPassword = "xyz123"
    $emailCredential = New-Object System.Net.NetworkCredential("X@X.com", $emailPassword)

    # 创建SMTP客户端对象
    $smtp = New-Object Net.Mail.SmtpClient($smtpServer)
    $smtp.Port = 587
    
    $smtp.EnableSsl = $true
    # 关键配置:先禁用默认凭据,再设置自定义凭据
    $smtp.UseDefaultCredentials = $false
    $smtp.Credentials = $emailCredential
    $smtp.DeliveryMethod = [Net.Mail.SmtpDeliveryMethod]::Network 
    
    # 邮件内容配置
    $msg.From = "X@X.com"
    $msg.To.Add("Y@x.com")
    $msg.Subject = "Alert Triggered"
    $msg.Body = $message 

    $smtp.Timeout = 60000 
    
    try {
        # 发送邮件
        $smtp.Send($msg)
        Write-Host "Email Sent"
    }
    catch {
        Write-Error "发送邮件失败: $_"
        throw
    }
}


try {
    # 设置支持TLS 1.2/1.3
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13
    # 正确调用PowerShell函数
    Send-Mail "Alert Triggered"
    Write-Host "Done" 
    exit
}
catch {
    Write-Error "执行出错: $($error[0].Exception.Message)"
}

核心修改点说明

  • 修正函数调用语法:原代码Sendmail("Alert Triggered")不符合PowerShell函数调用规范,正确写法为Send-Mail "Alert Triggered"(PowerShell中函数调用无需用括号包裹参数)。
  • 添加UseDefaultCredentials = $false:这是Office365 SMTP的关键配置,如果不先禁用默认凭据,自定义的账号凭据可能不会生效,导致邮件被服务器静默丢弃。
  • 增强错误捕获:在邮件发送环节单独添加try-catch,确保发送过程中的异常能被捕获并输出详细信息,避免静默失败。
  • 扩展安全协议支持:同时启用TLS 1.2和TLS 1.3,符合Office365当前的安全要求。

排查步骤

  1. 检查垃圾/归档文件夹:先确认邮件是否被收件邮箱归类到垃圾邮件、归档或其他文件夹中。
  2. 验证账号MFA状态:如果发件账号开启了多因素认证(MFA),普通密码无法用于SMTP发送,必须使用应用密码代替普通密码(在微软账号管理页面创建)。
  3. 检查账号SMTP权限:登录Exchange Online管理中心,确认发件账号已启用“Authenticated SMTP”权限。
  4. 启用SMTP日志:添加日志配置,查看发送过程中的服务器交互细节,定位问题:
    # 在SMTP客户端配置中添加以下两行
    $smtp.LogFileName = "C:\temp\smtp_log.txt"
    $smtp.EnableLogging = $true
    
    发送后查看日志文件,分析服务器返回的响应信息。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:31