2010-03-01 21 views
12

He escrito un programa en C# que envía correos electrónicos. Ahora tengo el requisito de firmar correos salientes usando Dominkeys/DKIM, pero no estoy seguro de cómo hacerlo.¿Cómo se utiliza la firma de correo electrónico DomainKey/DKIM con el cliente C# SMTP?

He configurado todas las claves, pero no sé cómo conseguirlas para incluirlas en el encabezado del correo electrónico.

+0

¿Encontró una solución usando el servidor SMTP de Windows? – Josh

+0

verifique mi respuesta aceptada ... – Nnp

Respuesta

1

No encontré mucha ayuda en este tema, pero mi problema ha ido a resolver mediante la configuración de SMTP servidor. no puedo publicar esos pasos ya que estoy usando un servidor smtp de terceros y cada servidor tiene su propia configuración. después de la configuración adecuada, mi smtp agrega automáticamente la firma DM/DKIM.

+0

¿Qué servidor SMTP? – WildJoe

+0

es de strongMail. – Nnp

5

ver https://github.com/dmcgiv/DKIM.Net es una implementación de MailKeys Identified Mail (DKIM) para .Net escrito en C# - le permite firmar objetos de MailMessage.

+0

Esto arroja excepciones en el momento - intentando depurarlo, pero estoy pensando en encontrar otra biblioteca mientras tanto. – Doug

+0

@Doug readme ha sido actualizado. Si todavía tiene problemas, cree un problema en el sitio github, por favor, con más detalles. –

+0

no funciona con archivos adjuntos: -/ –

2

Si está buscando DKIM-firmar el cuerpo de la MailMessage entonces DKIM.NET es genial. Si busca tener vistas alternativas en su mensaje, entonces no pude encontrar una solución y escribí la mía (código abierto con los descargos de responsabilidad habituales) que se puede encontrar en https://github.com/yannispsarras/DKIM-AlternativeViews

Entiendo que este es un hilo muy viejo pero pensé que podría ayudar a alguien.

+0

No entiendo el downvote. Incluso proporcioné un proyecto de código abierto que hace todo eso ... – Yannis

+0

Sin preocupaciones. Le he quitado el voto negativo. –

9

Hay un problema fundamental al tratar de hacer firmas DKIM con System.Net.Mail.MailMessage y System.Net.Mail.SmtpClient, que es que para poder firmar el mensaje, debe introducir las partes internas de SmtpClient en ordene el cuerpo del mensaje como uno de los pasos para generar el encabezado DKIM-Signature. El problema aparece cuando tienes vistas alternativas o archivos adjuntos porque SmtpClient generará nuevos límites de varias partes cada vez que escribe el mensaje que rompe el hash del cuerpo y, por lo tanto, la validez de la firma DKIM.

Para solucionar esto, puede utilizar las bibliotecas de código abierto MimeKit y MailKit para .NET como marco alternativo al uso de System.Net.Mail.

Para añadir una firma DKIM a un mensaje en MimeKit, que haría algo como esto:

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); 

Para enviar el mensaje usando MailKit, que haría algo como esto:

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); 
} 

Espero que ayude.

2

Uso http://www.mimekit.org

No sólo permite utilizar DKIM para la firma, también se puede incluir certificados S/MIME, certificados PGP y más. Además, es una lib muy madura, la única que he encontrado que maneja idiomas extranjeros (aparte del inglés) correctamente, ya que está completamente codificado con unicode en mente.

Es gratuito y de código abierto.

Cuestiones relacionadas