使用AlternateView发送纯文本邮件时如何正常显示换行符
问题根源
你碰到的换行显示问题,根本不是纯文本AlternateView的配置有问题,是代码里的错位逻辑把邮件的渲染流程搞乱了:
- 视图优先级错配:绝大多数邮件客户端处理多视图邮件时,会优先选择列表最末尾、自身能正常解析的内容展示。你当前的代码直接把带
\n的纯文本字符串塞给了HTML视图,而HTML渲染规则会把所有换行、连续空格都折叠成单个空格,客户端实际打开的是这个内容错误的HTML视图,纯文本视图根本没被调用,自然看不到换行。 - 邮件结构不规范:你设置了
IsBodyHtml = false但没有给msg.Body赋值,直接添加两个AlternateView,生成的MIME分层结构缺少主内容锚点,部分严格遵循规范的邮件客户端会直接丢弃结构异常的纯文本视图,不做渲染。 - 纯文本格式不兼容:按照邮件传输的通用规范,纯文本内容的换行必须使用
CRLF(也就是\r\n),仅写\n的话,部分老版本或者严格遵循标准的客户端会把它识别为普通空格,不会触发换行渲染。
具体修正方法
按照MIME的通用规范调整结构和内容匹配即可,不需要额外修改底层配置:
- 不要用同一个字符串同时作为纯文本和HTML的视图内容:纯文本版本用
\r\n做正常逻辑换行,HTML版本把对应换行替换成<br>标签,适配HTML的渲染规则。 - 给主
msg.Body赋值和纯文本视图一致的内容,补全邮件的主结构,符合通用客户端的解析预期。 - 添加AlternateView时顺序不要搞反:先加纯文本视图,再加HTML视图——纯文本是所有客户端都能打开的兜底内容,放在前面;HTML是体验更好的渲染内容,放在后面让支持的客户端优先选择。
修正后的可用代码示例:
var msg = new MailMessage(); // 纯文本内容使用标准CRLF换行 var plainBody = "Test sending\r\nA newline character\r\nIn a plaintext email"; // HTML版本把换行替换为<br>标签 var htmlBody = "Test sending<br>A newline character<br>In a plaintext email"; msg.From = new MailAddress(fromAddr); msg.To = new MailAddress(toAddr); msg.Subject = "Test"; // 将主Body设为纯文本内容,和纯文本视图保持一致 msg.Body = plainBody; msg.BodyEncoding = Text.Encoding.UTF8; msg.IsBodyHtml = false; // 先添加兜底的纯文本视图 var textView = AlternateView.CreateAlternateViewFromString( plainBody, Text.Encoding.UTF8, Net.Mime.MediaTypeNames.Text.Plain ); // 再添加优先级更高的HTML视图 var htmlView = AlternateView.CreateAlternateViewFromString( htmlBody, Text.Encoding.UTF8, Net.Mime.MediaTypeNames.Text.Html ); msg.AlternateViews.Add(textView); msg.AlternateViews.Add(htmlView); var client = new SmtpClient(smtpServer); client.Send(msg);
额外提醒
- 如果不需要发送HTML版本的邮件,直接删掉HTML视图即可,剩下的结构和你之前直接设置
msg.Body的效果完全一致,不会出现换行异常的问题。 - 不要手动给长纯文本内容做拆行处理,.NET的SmtpClient会自动按照邮件规范的行长度要求做格式转换,只需要把内容本身的逻辑换行处理正确即可。
内容的提问来源于stack exchange,提问作者briddums
相关产品推荐
相关产品推荐

