C#使用MimeKit发送邮件无报错未送达,System.Net.Mail运行正常
MimeKit邮件无法送达问题排查及解决方案
问题原因
- 异步发送未等待完成:你调用的
smtp.SendAsync(email)是异步方法,未添加await关键字等待执行完成,程序会直接执行后续的smtp.Disconnect(true)逻辑,SMTP连接在邮件还没发送完成时就被提前断开,这是最常见的触发原因。 - 缺少From字段配置:MimeKit代码中你只设置了
Sender属性,绝大多数SMTP服务器要求必须显式设置From字段(可与Sender值一致),而你使用System.Net.Mail时显式配置了From属性,部分服务器会直接拒收缺少From字段的邮件。 - SMTP握手规则不匹配:部分SMTP服务器对EHLO握手、TLS协商有特殊要求,你设置的
SecureSocketOptions.None可能会触发服务器的安全校验拦截。
修正后的MimeKit代码
var email = new MimeMessage(); // 同时设置From和Sender email.From.Add(MailboxAddress.Parse("aa@sbb.com")); email.Sender = MailboxAddress.Parse("aa@sbb.com"); email.To.Add(MailboxAddress.Parse("aa.cc@dd.com")); email.To.Add(MailboxAddress.Parse("bb.dd@dd.com")); email.Subject = "test"; var builder = new BodyBuilder(); builder.HtmlBody = "corpo"; email.Body = builder.ToMessageBody(); using var smtp = new SmtpClient(); // 可根据服务器情况调整SecureSocketOptions,Auto会自动适配服务器加密规则 smtp.Connect("smtp.xxx.com", 25, SecureSocketOptions.Auto); smtp.Authenticate("ut", "pwd"); // 等待异步发送完成,或者直接使用同步Send方法 await smtp.SendAsync(email); smtp.Disconnect(true); Console.WriteLine("Email Sent.");
如果你的项目不支持异步await,也可以直接使用同步发送方法smtp.Send(email)替代异步方法,避免提前断开连接的问题。
内容的提问来源于stack exchange,提问作者gt.guybrush
相关产品推荐
相关产品推荐

