.NET Core应用在Debian/Docker中MimeMessage写入流的编码/长度问题
问题分析与解决方案
问题根源在于跨平台环境下的换行格式差异:Windows系统默认使用CRLF(0D0A)作为换行符,而Linux/Debian环境下默认使用LF(0A),MimeKit在不同环境下的默认换行处理逻辑导致邮件内容中的CRLF被转换,最终保存的.eml字节数组长度变短,触发Outlook解码错误。
修复代码
修改MimeMessage.WriteTo的调用方式,强制指定使用邮件标准要求的CRLF换行格式,避免跨平台格式转换:
mimeMessage = await folder.GetMessageAsync(new MailKit.UniqueId(input.EMailDto.IMAPUId)); // 创建格式化选项并强制使用DOS风格换行(CRLF) var formatOptions = FormatOptions.Default.Clone(); formatOptions.NewLineFormat = NewLineFormat.Dos; using (var memory = new MemoryStream()) { mimeMessage.WriteTo(formatOptions, memory); dataRow.byteArray = memory.ToArray(); }
原理说明
NewLineFormat.Dos会强制MimeKit在写入邮件内容时使用0D0A作为换行符,完全符合RFC邮件标准;- 显式指定格式选项后,无论运行在Windows还是Linux/Docker环境,生成的.eml字节数组内容和长度都会保持一致,彻底解决Outlook解码异常问题。
内容的提问来源于stack exchange,提问作者Ad Rian
相关产品推荐
相关产品推荐

