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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:39:04