2010-03-01 3 views
12

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

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

+0

Вы нашли решение с помощью Windows SMTP Server? – Josh

+0

проверить мой принятый ответ. – Nnp

ответ

1

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

+0

Какой SMTP-сервер? – WildJoe

+0

его от strongMail. – Nnp

5

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

+0

В настоящее время выдает исключения из коробки - пытается отладить его, но я думаю о поиске другой библиотеки в среднем – Doug

+0

@Doug readme обновлен. Если у вас все еще есть проблемы, создайте проблему на сайте github, пожалуйста, более подробную информацию. –

+0

не работает с вложениями: -/ –

2

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

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

+0

Я не понимаю нижний предел. Я даже представил проект с открытым исходным кодом, который делает все это ... – Yannis

+0

Не беспокойтесь. Я удалил его вниз. –

9

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

Чтобы обойти это, вы можете использовать библиотеки с открытым кодом для 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); 
} 

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

2

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

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

Его свободный и с открытым исходным кодом.

Смежные вопросы