【问题标题】:How to Domainkeys/DKIM email signing using the C# SMTP client?如何使用 C# SMTP 客户端进行 Domainkeys/DKIM 电子邮件签名?
【发布时间】:2011-01-22 10:04:52
【问题描述】:

我用 C# 编写了一个发送电子邮件的程序。现在我需要使用 Dominkeys/DKIM 签署出站电子邮件,但我不知道该怎么做。

我已经设置了所有密钥,但我不知道如何获取这些以及如何将它们包含在电子邮件标题中。

【问题讨论】:

  • 您找到使用 Windows SMTP 服务器的解决方案了吗?

标签: c# email smtp dkim domainkeys


【解决方案1】:

我没有在这个问题上找到太多帮助,但我的问题通过配置 smtp 服务器得到了解决。 我无法发布这些步骤,因为我使用的是 3rd 方 smtp 服务器,并且每个服务器都有自己的配置。正确配置后,我的 smtp 会自动添加 DM/DKIM 签名。

【讨论】:

    【解决方案2】:

    请参阅https://github.com/dmcgiv/DKIM.Net,它是用 C# 编写的 .Net 的 DomainKeys Identified Mail (DKIM) 实现 - 它使您能够签署 MailMessage 对象。

    【讨论】:

    • 这目前会抛出开箱即用的异常 - 尝试对其进行调试,但同时正在考虑寻找另一个库
    • @Doug 自述文件已更新。如果您仍然遇到问题,请在 github 站点上创建问题,并提供更多详细信息。
    【解决方案3】:

    如果您希望对 MailMessage 的正文进行 DKIM 签名,那么 DKIM.NET 非常棒。如果您希望在您的消息中包含其他观点,那么我无法找到解决方案并编写了自己的解决方案(带有通常免责声明的开源),可以在 https://github.com/yannispsarras/DKIM-AlternativeViews

    找到

    我知道这是一个很老的帖子,但我认为它可能会对某人有所帮助。

    【讨论】:

    • 我不理解反对票。我什至提供了一个开源项目来完成所有这些......
    • 邮件中的附件无法正常工作,这就是我使用 Mailkit 的原因。
    【解决方案4】:

    尝试使用 System.Net.Mail.MailMessage 和 System.Net.Mail.SmtpClient 进行 DKIM 签名存在一个基本问题,即为了对消息进行签名,您需要按顺序戳 SmtpClient 的内部散列消息正文作为生成 DKIM-Signature 标头的步骤之一。当您有替代视图或附件时会出现问题,因为 SmtpClient 每次写出破坏正文哈希并因此破坏 DKIM 签名有效性的消息时都会生成新的多部分边界。

    要解决此问题,您可以使用 .NET 的 MimeKitMailKit 开源库作为使用 System.Net.Mail 的替代框架。

    要向 MimeKit 中的消息添加 DKIM 签名,您可以执行以下操作:

    MimeMessage message = MimeMessage.CreateFromMailMessage(mailMessage);
    HeaderId[] headersToSign =  new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date };
    
    string domain = "example.net";
    string selector = "brisbane";
    
    DkimSigner signer = new DkimSigner ("C:\my-dkim-key.pem", domain, selector) 
    {
       SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1,
       AgentOrUserIdentifier = "@eng.example.com",
       QueryMethod = "dns/txt",      
    };
    
    // Prepare the message body to be sent over a 7bit transport (such as 
    // older versions of SMTP). This is VERY important because the message
    // cannot be modified once we DKIM-sign our message!
    //
    // Note: If the SMTP server you will be sending the message over 
    // supports the 8BITMIME extension, then you can use
    // `EncodingConstraint.EightBit` instead.
    message.Prepare (EncodingConstraint.SevenBit);
    
    message.Sign (signer, headersToSign, 
        DkimCanonicalizationAlgorithm.Relaxed, 
        DkimCanonicalizationAlgorithm.Simple);
    

    要使用 MailKit 发送消息,您可以执行以下操作:

    using (var client = new MailKit.Net.Smtp.SmtpClient ()) {
        client.Connect ("smtp.gmail.com", 465, true);
        client.Authenticate ("username", "password");
        client.Send (message);
        client.Disconnect (true);
    }
    

    希望对您有所帮助。

    【讨论】:

    • 一旦我创建了一个 MimeKit.MimeMessage 我该如何发送它?关于创建消息的代码行数不胜数,但没有一个 Send() 和一个发送它的单行示例。可以在没有 MailKit 的情况下使用 MimeKit(发送消息)吗?
    • 我的答案包括发送代码。不知道你是怎么错过的......
    • 我没有错过。我引用了 MimeKit,因为我需要对我的电子邮件进行 DKIM 签名。 MimeKit 可以完成这项工作,但仅 MimeKit 不足以发送电子邮件或与 .net SmtpClient 一起使用。您一定需要另一个库 (MailKit) 来发送 MimeMessage。这对我来说不是那么明显。这 2 个库在 99% 的情况下一起使用(可能是 100%,因为我认为没有 MailKit 的替代品)我只是喜欢在 MimeKit README 或其“Get Start”页面而不是图中明确说明经过长时间的搜索,你自己确认了这一点。谢谢。
    【解决方案5】:

    使用 http://www.mimekit.org

    它不仅允许使用 DKIM 进行签名,还可以包括 S/MIME 证书、PGP 证书等。 此外,它是一个非常成熟的库——我发现的唯一一个可以正确处理外语(除了英语)的库,因为它的完全和彻底的编码考虑到了 unicode。

    它是免费和开源的。

    【讨论】:

      【解决方案6】:

      当使用 Mailenable 作为 SMTP 中继服务器时,这为我解决了这个问题。

      http://www.mailenable.com/kb/content/article.asp?ID=ME020700

      在域名上创建 DKIM TXT 记录时,不要忘记使用活动选择器作为前缀 => yourselector._domainkey.yourdomainname.be

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 2020-12-22
        • 2013-08-28
        • 1970-01-01
        • 2014-07-20
        • 2011-06-10
        • 2012-05-28
        • 2017-03-02
        • 2012-02-01
        相关资源
        最近更新 更多