使用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当前的安全要求。
排查步骤
- 检查垃圾/归档文件夹:先确认邮件是否被收件邮箱归类到垃圾邮件、归档或其他文件夹中。
- 验证账号MFA状态:如果发件账号开启了多因素认证(MFA),普通密码无法用于SMTP发送,必须使用应用密码代替普通密码(在微软账号管理页面创建)。
- 检查账号SMTP权限:登录Exchange Online管理中心,确认发件账号已启用“Authenticated SMTP”权限。
- 启用SMTP日志:添加日志配置,查看发送过程中的服务器交互细节,定位问题:
发送后查看日志文件,分析服务器返回的响应信息。# 在SMTP客户端配置中添加以下两行 $smtp.LogFileName = "C:\temp\smtp_log.txt" $smtp.EnableLogging = $true
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

