mailkit是c#发邮件最稳选择,但需注意:qq邮箱用smtp.qq.com+465(ssl)或587(starttls),网易用smtp.163.com+465,gmail用smtp.gmail.com+587;收发件人必须用mailboxaddress构造;html邮件需内联样式、避免css类和flex布局;批量发送须单封try-catch并开启debugaction日志。

直接说结论:别用 System.Net.Mail,用 MailKit 发邮件是当前 C# 最稳、最可控的选择;但新手最容易在连接配置、身份验证和收件人写法上栽跟头。
SmtpClient.Connect 参数怎么填才不报错
错误现象:Authentication failed 或 Unable to connect,但账号密码明明是对的。
- QQ 邮箱必须用
smtp.qq.com,端口选465(SSL)或587(STARTTLS),不能填25—— 多数企业防火墙会拦截 25 端口 - 网易邮箱用
smtp.163.com+465,Gmail 用smtp.gmail.com+587,别硬套同一套参数 -
client.Connect(host, port, useSsl)的第三个参数不是“有没有 SSL”,而是“是否强制走 SSL 加密通道”:465 填true,587 填false(STARTTLS 是先明文连再升级加密) - 如果内网环境连不上公网 SMTP,要确认 DNS 能解析域名,且没被代理或中间设备拦截 TLS 握手
收件人、发件人为什么总提示格式错误
错误现象:FormatException 或发出去的邮件显示 “undisclosed-recipients”、“(null)”
- 发件人必须用
MailboxAddress构造,不能直接赋字符串:message.From.Add(new MailboxAddress("张三", "zhangsan@domain.com")) - 收件人同理:
message.To.Add(new MailboxAddress("李四", "lisi@domain.com")),别写成message.To.Add("lisi@domain.com")—— 后者会触发隐式解析,失败时不报错但实际无效 - 多个收件人?循环调用
Add,别试图用分号拼接字符串再塞进去 - 昵称里含中文、特殊符号时,确保项目编码是 UTF-8,且
MailboxAddress构造函数能正确处理(新版 MailKit 默认支持)
HTML 邮件正文为什么 Outlook 里全乱了
错误现象:Gmail 看正常,Outlook 里文字堆一起、图片不显示、样式完全失效
-
BodyBuilder.HtmlBody只负责把 HTML 字符串包进 MIME 结构,它不处理 CSS 兼容性 —— 这是前端问题,不是 MailKit 的锅 - Outlook 渲染引擎只认内联样式(
style="color:red"),无视<style></style>标签、CSS 类、Flex/Grid 布局 - 简单方案:手写正则替换
<p class="title"></p>→<p style="font-size:18px;color:#333"></p>;复杂场景用premailer的 C# 移植版 - 布局别用
<div> 套嵌,改用语义化 <code><table>(老派但 Outlook 全兼容)<li>字体写死:<code>font-family: "Segoe UI", Arial, sans-serif,别用system-ui或变量字体 - 绝对不要用一个
try-catch包住整个for循环 —— 这样失败就停发,且无上下文 - 每封邮件单独 try-catch:
try { client.Send(message); } catch (Exception ex) { Log($"{message.To[0]} | {ex.Message}"); } - 开启调试日志临时排障:
client.DebugAction = s => Console.WriteLine(s),能看到原始 SMTP 交互(生产环境务必关掉) - 附件路径错误、HTML 中引用了本地
cid:但没调用bodyBuilder.LinkedResources.Add(),都会静默失败或内容缺失
批量发送时怎么定位哪封邮件失败了
错误现象:整个循环中断,只知道“第 N 封出错”,但不知道是邮箱格式错、附件超限,还是 HTML 编码乱码
真正麻烦的从来不是“怎么发出去”,而是“怎么让每封都按预期呈现”。HTML 渲染差异、SMTP 服务策略、DNS 解析稳定性、反垃圾机制 —— 这些藏在 MailKit 底层之下的环节,才是上线后最常半夜报警的地方。










