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

C# MailMessage添加附件后主题及附件文件名解码异常问题

解决System.Net.Mail.SmtpClient添加附件后主题/附件名单特殊字符解码失败问题

我之前也碰到过完全一样的坑,这本质是System.Net.Mail组件在处理单个非ASCII字符的邮件头编码时,没有生成符合RFC标准的格式,而且添加附件后,邮件头的编码逻辑会出现异常切换,导致邮件客户端解码失败。下面给你几个可行的解决方案:

1. 手动强制主题使用RFC 2047标准编码

直接绕过System.Net.Mail的自动编码逻辑,手动将主题转换为Base64编码的RFC 2047格式,这样所有邮件客户端都能正确解码:

var subjectText = "Teszt üzenet";
// 手动生成符合RFC 2047的主题字符串
message.Subject = $"=?UTF-8?B?{Convert.ToBase64String(Encoding.UTF8.GetBytes(subjectText))}?=";

2. 手动处理附件文件名的编码

同样,不要依赖Attachment.Name的自动编码,手动设置编码后的文件名:

var attachment = new Attachment(@"document.pdf");
var fileName = "fájl.pdf";
// 对附件文件名应用RFC 2047编码
attachment.Name = $"=?UTF-8?B?{Convert.ToBase64String(Encoding.UTF8.GetBytes(fileName))}?=";
message.Attachments.Add(attachment);

3. 替换为更可靠的MailKit库(推荐)

System.Net.Mail.SmtpClient已经被官方标记为过时,它的邮件头编码逻辑存在不少历史bug。改用MailKit库(完全兼容.NET项目)可以彻底解决这类编码问题,而且API设计更合理:

using MimeKit;
using MailKit.Net.Smtp;

var message = new MimeMessage();
message.From.Add(new MailboxAddress("test", "test@test.com"));
message.To.Add(new MailboxAddress("test", "test@test.com"));
message.Subject = "Teszt üzenet";

var bodyBuilder = new BodyBuilder();
bodyBuilder.TextBody = "Teszt üzenet";
// 直接设置带特殊字符的文件名,MailKit会自动处理编码
bodyBuilder.Attachments.Add(@"document.pdf", name: "fájl.pdf");
message.Body = bodyBuilder.ToMessageBody();

using (var client = new SmtpClient())
{
    client.Connect(Settings.Host, Settings.Port, Settings.UseSsl);
    client.Authenticate(Settings.Username, Settings.Password);
    client.Send(message);
    client.Disconnect(true);
}

为什么会出现这个问题?

当只有单个特殊字符时,System.Net.Mail会尝试使用quoted-printable编码格式,但这个格式在部分邮件客户端的解码逻辑中会出错;而当存在多个特殊字符时,组件会自动切换到Base64编码,反而能正常解码。手动指定RFC 2047的Base64编码格式,就能绕过这个自动切换的bug。另外你设置SubjectEncoding无效,是因为SmtpDeliveryFormat.International的底层逻辑依然存在编码判断的漏洞,手动编码能直接解决这个问题。

内容的提问来源于stack exchange,提问作者darph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:05:55