Как подписывать электронную почту Domainkeys/DKIM с помощью клиента SMTP C#?

Я написал программу на C#, который отправляет электронные письма. Теперь у меня есть требование подписывать исходящие письма с помощью Dominkeys/DKIM, но я не уверен, как это сделать.

Я настроил все ключи, но я не знаю, как получить их и hwo, чтобы включить их в заголовок электронной почты.

6 ответов


существует фундаментальная проблема с попыткой сделать подписи DKIM с системой.Сеть.Почта.MailMessage и система.Сеть.Почта.SmtpClient, который заключается в том, что для подписания сообщения вам нужно ткнуть внутренние элементы SmtpClient, чтобы хэшировать тело сообщения как один из шагов в создании заголовка DKIM-Signature. Проблема возникает, когда у вас есть альтернативные представления или вложения, потому что SmtpClient будет генерировать новые составные границы каждый раз, когда он записывает сообщение, которое ломается хэш тела и, следовательно, действительность подписи DKIM.

чтобы обойти это, вы можете использовать MimeKit и MailKit библиотеки с открытым исходным кодом для .NET в качестве альтернативы использованию системы.Сеть.Почта.

чтобы добавить подпись 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);
}

надеюсь, что это поможет.


см.https://github.com/dmcgiv/DKIM.Net это реализация Domainkeys Identified Mail (DKIM) для .Net, написанная на C# - она позволяет подписывать объекты MailMessage.


Я тоже хочу знать я просто нахожу реализацию dkim, но я не могу запустить sucessful-_- http://tinisles.blogspot.com/2009/09/sending-dkim-email-from-c.html


использовать http://www.mimekit.org

Это не только позволяет использовать DKIM для подписания, также вы можете включить сертификаты S/MIME, сертификаты PGP и многое другое. Кроме того, его очень зрелый lib - единственный, который я нашел, который обрабатывает иностранные языки (кроме английского) правильно, так как его полностью и тщательно закодирован с unicode в виду.

его свободный и открытый источник.


Если вы ищете DKIM-подписать тело MailMessage затем DKIM.NET это здорово. Если вы хотите иметь альтернативные мнения в своем сообщении, я не смог найти решение и написал свой собственный (с открытым исходным кодом с обычными отказами), который можно найти вhttps://github.com/yannispsarras/DKIM-AlternativeViews

Я понимаю, что это довольно старая тема, но я думал, что это может помочь кому-то.


Я не нашел много помощи по этой проблеме, но моя проблема была решена путем настройки smtp-сервера. я не могу опубликовать эти шаги, поскольку я использую сторонний smtp-сервер, и каждый сервер имеет свою собственную конфигурацию. после правильной настройки мой smtp автоматически добавляет подпись DM/DKIM.