.NET 8中使用Office 365 SMTP时MailMessage发送卡住问题求助
Office 365 SMTP邮件发送卡住问题的修复方案
核心问题分析
代码卡住是因为缺少Office 365 SMTP必需的配置项,同时代码存在几处关键错误:
- 认证信息未正确赋值:仅创建了
NetworkCredential实例,但未绑定到SmtpClient.Credentials,导致认证失败,连接被阻塞 - 未设置Office 365强制要求的端口与SSL:Office 365 SMTP必须使用端口587并启用SSL/TLS,否则无法建立有效连接
- 事件绑定时机错误:
SendCompleted是异步方法SendAsync的回调事件,绑定在同步Send方法之后完全无效 - 异常处理无效:catch块中直接丢弃异常,无法获取错误详情用于排查
Office 365 SMTP必填配置
使用Office 365 SMTP发送邮件必须满足以下配置:
- 服务器地址:
smtp.office365.com - 端口:587(推荐,使用TLS加密)
- 启用SSL:
EnableSsl = true - 认证信息:使用邮箱完整地址作为用户名,对应密码(若启用多因素认证MFA,需使用应用密码而非登录密码;商业租户需确保已开启SMTP AUTH)
修正后的代码
using System.Net; using System.Net.Mail; string server = "smtp.office365.com"; var user = "你的完整邮箱@domain.com"; // 必须是完整邮箱地址 var password = "你的密码或应用密码"; var from = "你的完整邮箱@domain.com"; var to = "收件人邮箱@example.com"; var subject = "CSharp sent message"; var body = "Sent from code that is being made by Mail Message"; var message = new MailMessage(from, to, subject, body); using (var client = new SmtpClient(server)) { client.Port = 587; client.EnableSsl = true; client.Credentials = new NetworkCredential(user, password); try { client.Send(message); Console.WriteLine("邮件发送成功"); } catch (Exception ex) { Console.WriteLine($"发送失败:{ex.Message}"); // 如需深入排查,可打印堆栈信息 // Console.WriteLine(ex.StackTrace); } }
额外注意事项
- 若使用M365商业版/教育版:
- 需确保邮箱账户已开启SMTP AUTH(可通过Exchange管理中心或PowerShell启用)
- 若账户启用了多因素认证(MFA),必须使用应用密码替代普通登录密码
- 建议使用
using语句包裹SmtpClient,确保资源正确释放 - 若使用异步方法
SendMailAsync,需正确使用await,避免主线程阻塞导致死锁
内容的提问来源于stack exchange,提问作者djangojazz
相关产品推荐
相关产品推荐

