DKIM в .NET MailMessage и AlternativeViews - PullRequest
7 голосов
/ 04 июня 2011

Я использую DKIM.NET (https://github.com/dmcgiv/DKIM.Net), чтобы подписать MailMessage перед отправкой его получателю. Проблема, с которой я сталкиваюсь, заключается в том, что компонент выше подписывает тело MailMessage (mailMessage.Body), в то время как я вставляю содержимое в виде обоих HTML и простой текст в виде AlternativeViews.

В результате мой mailMessage.Body имеет значение null, но тело полученного сообщения содержит мои альтернативные представления, поэтому DKIM не проверяет правильно.

Есть ли способ решить эту проблему? Может быть, подписать альтернативные представления HTML и Обычный текст, прежде чем назначать их объекту MailMessage? Или, может быть, с использованием другого компонента?

РЕДАКТИРОВАТЬ:

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

Ответы [ 3 ]

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

Я добавил полную поддержку для генерации и проверки подписей DKIM в MimeKit с открытым исходным кодом (Лицензия: MIT) и полностью бесплатным для коммерческого использования.

Если вам также нужен SMTP, Поддержка POP3 и / или IMAP, проверьте MailKit , который построен поверх MimeKit.

Поскольку MimeKit и MailKit не генерируют новый набор граничных строк каждый раз, когда они пишутсяв поток, они не страдают от проблем, с которыми вы столкнетесь, используя System.Net.Mail и DKIM.Net [1] (не вина DKIM.Net, чтобы быть понятным).

Чтобы добавить подпись DKIMдля сообщения в MimeKit вы должны сделать что-то вроде этого:

var message = CreateMyMessage ();
var headersToSign = new [] { HeaderId.From, HeaderId.To, 
    HeaderId.Subject, HeaderId.Date };
var signer = new DkimSigner ("C:\my-dkim-key.pem") {
   AgentOrUserIdentifier = "@eng.example.net",
   Domain = "example.net",
   Selector = "brisbane",
};

message.Sign (signer, headersToSign, 
    DkimCanonicalizationAlgorithm.Relaxed, 
    DkimCanonicalizationAlgorithm.Simple);

Чтобы отправить сообщение с помощью MailKit, вы должны сделать что-то вроде этого:

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.gmail.com", 465, true);
    client.Authenticate ("username", "password");
    client.Send (message);
    client.Disconnect (true);
}

Примечания:

  1. Поскольку System.Net.Mail.SmtpClient генерирует новый набор пограничных маркеров для составных сообщений (что используется при наличии вложений или альтернативных представлений), вы не можете использовать DKIM.Net для подписи указанных сообщений, поскольку tПодпись будет прервана, когда вы действительно отправите сообщение, потому что тело сообщения в формате MIME будет изменено.
2 голосов
/ 06 августа 2011

Вы можете попробовать Почтовый компонент Mail.dll , он поддерживает DKIM, как: подпись и проверка:

http://www.limilabs.com/blog/sign-emails-with-dkim

Компонент не является бесплатным, однако, обратите внимание, что я его написал.

1 голос
/ 15 ноября 2011

Я обновил прочитанное мной на сайте DKIM.Net, чтобы объяснить это ограничение.Это в основном связано с тем, как System.Net.Mail.SmtpClient генерирует границы для разделения альтернативных представлений или вложений - они являются новыми Guids, поэтому каждый раз, когда сообщение отправляется, изменяется идентификатор границы - если изменяется содержимое, то при подписании происходит сбой.Код взламывает SmptClient для получения полного содержимого электронной почты, отправив сообщение MailMage с использованием фиктивного потока.

...