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

StackOverflow https://stackoverflow.com/questions/2358095

Вопрос

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

Я настроил все ключи, но не знаю, как их получить и как включить их в заголовок электронного письма.

Это было полезно?

Решение 6

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

Другие советы

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

Чтобы обойти эту проблему, вы можете использовать MimeKit и MailKit библиотеки с открытым исходным кодом для .NET в качестве альтернативы использованию 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);
}

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

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

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

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

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

Это бесплатно и с открытым исходным кодом.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top