Kri*_*ran 4 c# dkim mailkit mimekit
当 DKIM 使用 Mailkit 和 Mimekit 签署标头时,我看到一个奇怪的问题,Gmail 报告错误“dkim=neutral(正文哈希未验证)”。
我在这里做错了吗?请在下面找到我的代码和屏幕截图
附上实际收到的邮件。
string ReturnName = "DMC12";
string FromDomain = "backtothefuture.net";
string FromEmail = "marty@" + FromDomain;
string FromName = "Marty McFly";
string SenderName = "Marty McFly";
string ToEmail = "George.mcfly.1960@gmail.com";
string MailServer = "DMC12.large.timemachine.com";
string TextBody = @"If you put your mind to it, you can accomplish anything. One other thing. If you guys ever have kids, and one of them, when he's eight years old, accidentally sets fire to the living room rug... go easy on him!";
string HtmlBody = string.Format(@"<b>??????????????????? ????? ???????????????????????????????...??????</b>");
string Subject = "Message from Marty (1960)!";
string ToName = "George McFly";
string DKIMdomain = FromDomain;
string DKIMSigner = "btfreturns.com";
string ReturnEmail = "DocBrown@" + MailServer;
string SenderEmail = "marty@" + MailServer;
string privatekey = System.IO.File.ReadAllText("dkim.private.key");
var client = new SmtpClient(new ProtocolLogger("smtp.txt")); // logging SMTP connections
try
{
client.Connect(MailServer, 25);
}
catch (SmtpCommandException ex)
{
Console.WriteLine("Error trying to connect: {0}", ex.Message);
Console.WriteLine("\tStatusCode: {0}", ex.StatusCode);
return;
}
catch (SmtpProtocolException ex)
{
Console.WriteLine("Protocol error while trying to connect: {0}", ex.Message);
return;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
client.LocalDomain = MailServer;
var message = new MimeMessage();
MailboxAddress RecepientAddress = new MailboxAddress(ToName, ToEmail);
message.From.Add(new MailboxAddress(FromName, FromEmail)); // From Address
var builder = new BodyBuilder();
builder.TextBody = TextBody;
builder.HtmlBody = HtmlBody;
List<MailboxAddress> To = new List<MailboxAddress>();
To.Add(RecepientAddress);
message.Subject = Subject;
message.Body = builder.ToMessageBody();
message.Sender = new MailboxAddress(SenderName, SenderEmail); // Sender Address
message.To.Add(RecepientAddress);
message.MessageId = Guid.NewGuid().ToString("N") + "@" + new System.Net.Mail.MailAddress(message.Sender.Address).Host;
using (Stream s = (new MemoryStream(Encoding.UTF8.GetBytes(privatekey ?? ""))))
{
var headersToSign = new[] { HeaderId.From, HeaderId.To, HeaderId.Subject, HeaderId.Date, HeaderId.MessageId };
var signer = new DkimSigner(s, DKIMdomain, DKIMSigner);
signer.SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1;
message.Sign(signer, headersToSign, DkimCanonicalizationAlgorithm.Relaxed, DkimCanonicalizationAlgorithm.Relaxed);
}
client.Send(message, new MailboxAddress(ReturnName, ReturnEmail), To);
client.Disconnect(true);
client.Connect(MailServer, 25);
client.Dispose();
Run Code Online (Sandbox Code Playgroud)
问题是您message.Prepare()在 DKIM 签署消息之前没有打电话。这是一个非常重要的步骤,因为它强制消息正文的所有 MIME 部分转换为适当的编码以用于传输。
请注意,如果您没有Prepare()使用适当的编码约束值进行调用,则该SmtpClient.Send()方法将在您对消息进行 DKIM 签名后执行此操作,从而使签名无效。
我的建议是使用EncodingConstraint.SevenBit最大的互操作性。
但是,如果您确信您的 SMTP 服务器和您的邮件将通过其传输的所有其他 SMTP 服务器都支持该8BITMIME扩展,那么您可以尝试EncodingConstraint.EightBit改用。
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |