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

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

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

Ответы [ 6 ]

14 голосов
/ 18 июня 2015

Существует фундаментальная проблема с попыткой создания подписей DKIM с помощью System.Net.Mail.MailMessage и System.Net.Mail.SmtpClient, заключающаяся в том, что для подписи сообщения вам необходимо протолкнуть внутренние компоненты SmtpClient, хэшировать тело сообщения в качестве одного из этапов создания заголовка DKIM-подписи. Проблема возникает, когда у вас есть альтернативные представления или вложения, потому что 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);
}

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

6 голосов
/ 03 мая 2011

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

2 голосов
/ 17 июля 2016

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

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

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

2 голосов
/ 02 марта 2010

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

1 голос
/ 11 января 2012

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

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

0 голосов
/ 02 марта 2010

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

...