dmcgiv / DKIM.Net

DomainKeys Identified Mail (DKIM) and DomainKey email signing for .Net (C#)
30 stars 9 forks source link

关于MailMessageText导出邮件内容带有utf-8文本,和支持附件的方法 #12

Closed xiangyuecn closed 5 years ago

xiangyuecn commented 5 years ago

问题一:

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删掉,然后写入我们的值。

已实现

我参考的本仓库EmailMailMessageText 写的一个签名类,根据上面发现的问题使用了相应的解决方案,可参考 https://github.com/xiangyuecn/DKIM-Smtp-csharp/blob/master/EMail_DKIM.cs