2010-03-01 97 views
12

我已经用C#编写了一个发送邮件的程序。现在我有要求使用Dominkeys/DKIM签署出站电子邮件,但我不知道如何去做。如何使用C#SMTP客户端进行Domainkeys/DKIM电子邮件签名?

我已经设置了所有密钥,但我不知道如何让这些和他们包含在电子邮件标题中。

+0

您是否找到使用Windows SMTP服务器的解决方案? – Josh

+0

检查我接受的答案.. – Nnp

回答

1

我没有找到关于这个问题有很大帮助,但我的问题得到了通过配置SMTP解决服务器。 我不能发布这些步骤,因为我使用第三方smtp服务器,每台服务器都有自己的配置。经过适当的配置,我的smtp会自动添加DM/DKIM签名。

+0

哪台SMTP服务器? – WildJoe

+0

它来自strongMail。 – Nnp

5

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

+0

目前抛出异常 - 试图调试它,但我正在考虑在平均时间内找到另一个库 – Doug

+0

@Doug自述文件已更新。如果您仍然遇到问题,请在github网站上创建问题,并提供更多详细信息。 –

+0

它不能与附件一起工作: -/ –

2

如果你正在寻找DKIM签署MailMessage的主体,那么DKIM.NET是伟大的。如果您希望在您的消息中有其他意见,那么我无法找到解决方案,并且可以在https://github.com/yannispsarras/DKIM-AlternativeViews

中写下我自己的(使用通常免责声明的开放源代码),我明白这是一个非常老的线程但我认为这可能有助于某人。

+0

我不明白downvote。我甚至提供了一个开源项目,可以完成所有这些... – Yannis

+0

不用担心。我已经删除他downvote。 –

9

尝试使用System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient执行DKIM签名有一个基本问题,那就是为了签署消息,您需要戳入SmtpClient的内部为了散列消息正文作为生成DKIM-Signature头部的步骤之一。当您有其他视图或附件时,问题就出现了,因为SmtpClient在每次写出破坏正文散列的消息以及DKIM签名有效性的消息时都会生成新的多部分边界。

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

要在DKIM签名添加到MimeKit一个消息,你会做这样的事情:

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); 
} 

希望有所帮助。

2

使用 http://www.mimekit.org

它不仅允许使用DKIM进行签名,也可以包括S/MIME证书,PGP证书等。 另外,它是一个非常成熟的库 - 我发现的唯一一个能正确处理外语(除英语之外)的库,因为它完全彻底地用unicode编码。

它的免费和开源。

相关问题