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