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
相关产品推荐
相关产品推荐

