关于MailMessageText导出邮件内容带有utf-8文本,和支持附件的方法
Closed this issue · 0 comments
问题一:
MailMessageText
导出的带附件的邮件内容中文件名不会被编码(如中文等),问题在MailMessageText.Send3
方法调用第三参数allowUnicode
,这个参数应该传入false,不应该是true。
MailMessageText.GetText
内应该使用:
Send3(message, mailWriter, false, false);
问题二
带附件(Attachments
)或AlternateViews
的邮件不支持签名,在MailMessageExtensions.DkimSign
中直接拒绝了multipart
格式的邮件。问题在multipart
格式邮件每次生成邮件内容都会随机产生boundary
内容分隔符,根源在string System.Net.Mime.MimeMultiPart.GetNextBoundary()
方法,每次调用输出一个新的分隔符。
如果能够修改GetNextBoundary
使签名时和发送时产生的分隔符一致,那么就可以在MailMessageExtensions.DkimSign
中去掉那行限制。
很高兴,有办法修改GetNextBoundary
方法的调用,使他返回的内容完全自主可控,参考 https://github.com/bigbaldy1128/DotNetDetour 这个库,可以hook这个方法然后返回我们的一个值。
附带Date问题
因为签名和发送是在不同时间内,时间有可能导致签名时是8:05,而发送时是8:06,从而导致带Date header的签名失败,但签名时建议携带Date header一起签名。
so 这个问题hook System.Net.Mail.Message.PrepareHeaders
可以解决,每次原始函数处理完成后我们获取System.Net.Mail.Message.Headers
,然后把Date header删掉,然后写入我们的值。
已实现
我参考的本仓库Email
和MailMessageText
写的一个签名类,根据上面发现的问题使用了相应的解决方案,可参考 https://github.com/xiangyuecn/DKIM-Smtp-csharp/blob/master/EMail_DKIM.cs