por mandar form enviar credenciales crear correos correo con como certificado autofirmado archivo adjunto c# .net ssl smtp self-signed

c# - mandar - Enviar correo electrónico desde una aplicación.net a través de un servidor de correo con un certificado SSL autofirmado



enviar correo c# sin smtp (5)

Instalé hmailserver 5.3.2 y lo configuré. Normalmente recibe y envía correos electrónicos, pero yo quería usarlos para enviar correos electrónicos desde una aplicación .net / C # ubicada en otro servidor, y para eso quería utilizar la comunicación SSL. Antes, la aplicación se configuraba para enviar correos electrónicos a través de gmail, en el puerto 587 y funcionaba bien, pero ahora queremos usar nuestro propio servidor de correo. Primero configuramos la aplicación para que se conecte en smtp.domain.com en el puerto 25 y eso funciona, envía el correo electrónico.

Luego creamos un certificado autofirmado para probar si podíamos enviar el mensaje a través de un canal seguro. Creé el certificado con el nombre común de configuración de openSSL como: mail.domain.com, smtp.domain.com, * .domain.com, dominio.com. Abrí el puerto 587 en el firewall y configuré hmailserver para usar un certificado para las conexiones entrantes en ese puerto. Ninguno de los certificados que creé funcionó (intenté uno y luego creé otro, etc.), generando la siguiente excepción (genérica) en la aplicación:

System.Exception: _COMPlusExceptionCode = -532459699

Por supuesto, también intenté conectarme a través de telnet: telnet smtp.domain.com 587, y acabo de obtener una pantalla en blanco. No es un problema de firewall ya que cuando desactivo el SSL en el puerto 587 puedo conectarme normalmente. Al mirar el registro, ni siquiera se muestra un intento de conexión cuando se usa 587 con SSL.

Ya verifiqué estas preguntas: lograr que SmtpClient trabaje con un certificado SSL autofirmado y Usar un certificado autofirmado con .NET''s HttpWebRequest / Response , pero no resolvió mi problema. El enfoque con ServerCertificateValidationCallback no tuvo ninguna influencia.

Intenté con los puertos 25 (que también se propone en una de las preguntas anteriores), 465, 587, y con los 3 sucede lo mismo: el saludo inicial (SYN / SYN-ACK / ACK) y después de aproximadamente 80 segundos la conexión es cerrado (FIN), nada en el medio.

¿Debo instalar ese certificado en alguna parte para que la aplicación .net lo considere confiable? Quiero decir, ya lo instalé como una Autoridad de certificación de raíz de confianza y pude comprobar ejecutando mmc, así que no tengo idea de a dónde ir ahora ...

¡Gracias por la ayuda!

PD: No estoy seguro si esto pertenece a ServerFault ya que se trata de una aplicación C # pero también de un servidor de correo ...

EDITAR: Muestra de código:

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; SmtpClient mailClient = new SmtpClient("smtp.domain.com"); mailClient.Credentials = new NetworkCredential("[email protected]", "pwd"); mailClient.Port = 587; mailClient.EnableSsl = true; MailMessage mailMessage = new MailMessage("mailAddressFrom", "mailAddressTo", "subject", "body"); mailMessage.IsBodyHtml = true; mailClient.Send(mailMessage);

EDIT 2: Log (Basado en la sugerencia de Ramunas):

"TCPIP" 3588 "2010-06-23 10:02:49.685" "TCPConnection - Posting AcceptEx on 0.0.0.0:465" "DEBUG" 3588 "2010-06-23 10:02:49.809" "Creating session 24039" "TCPIP" 772 "2010-06-23 10:04:29.639" "TCPConnection - SSL handshake with client failed. Error code: 2, Message: End of file, Remote IP: X" "DEBUG" 772 "2010-06-23 10:04:29.639" "Ending session 24039"


Este es un mecanismo sofisticado, pero en palabras simples, el cliente (la computadora de la que está haciendo la conexión) debe saber acerca de QUIÉN es el emisor del certificado (en su caso, su servidor es el emisor del certificado). Si no lo encuentra en su lista Autoridades de certificación de raíz de confianza, entonces considera que esta conexión no es segura. (Apuesto a que has visto un navegador advirtiéndote sobre una solicitud insegura a algún sitio https: // ....)

Abra el complemento Certificados en la consola de administración de Microsoft en una computadora cliente e intente agregar el mismo certificado autofirmado a una lista de Autoridades de certificación de raíz de confianza.


Instalé hMailServer, creé un certificado autofirmado, lo agregué a hMailServer y no pude enviar correo a través de él. Aunque tuve éxito al enviar correos electrónicos sin certificado.

Permití iniciar sesión en hMailServer (para todo) y lo intenté de nuevo sin suerte. Pero vi un error en un archivo de registro que indica

"Gravedad: 2 (Alto), Código: HM5113, Fuente: TCPServer :: Run (), Descripción: Error al cargar el archivo del certificado. Ruta: <...> test.cer, Dirección: 0.0.0.0, Puerto: 25, Error: se proporcionó un argumento no válido "

Tal vez este es un caso en su hMailServer también?


actualmente, no puede enviar correo usando c # 4 / .NET 4 a hMailServer independientemente de si el certificado utilizado por hMailServer es comprado o auto-firmado.

el problema es que dos partes de AFAIK ... c # 4 / .NET 4 solo enviarán usando TLS y el puerto 587; hMailServer actualmente no es compatible con STARTTLS. c # 4 / .NET 4 no admite la alternativa de 465 / SSL.

ver este hilo "configurar confusión de SSL ..." en el foro de hMailServer.

"Propiedad SmtpClient.EnableSsl" :
"Un método de conexión alternativo es donde se establece una sesión SSL antes de enviar cualquier comando de protocolo. Este método de conexión a veces se llama SMTP / SSL, SMTP sobre SSL o SMTPS y de forma predeterminada usa el puerto 465. Este método de conexión alternativa usa SSL no es compatible actualmente ". - MSDN


Tengo el puerto 25 como SMTP normal abierto en mi hMailServer, así como el puerto 465 para SSL, así que tuve que cambiar mi código para apuntar a la configuración SMTP normal. Después de eso debería de funcionar. En cuanto a SSL, lo siento, no funcionará en hMailServer ...

MailMessage message = new MailMessage(); message.From = new MailAddress("[email protected]", "Me"); message.Body = "hello, World!"; message.To.Add(new MailAddress("[email protected]", "You")); SmtpClient client = new SmtpClient("secure.myself.home", 25); client.EnableSsl = false; client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential("[email protected]", "pwd"); client.Send(message);


Como dijo GerryLowry:

c # 4 / .NET 4 solo enviará usando TLS y el puerto 587;
hMailServer actualmente no es compatible con STARTTLS

Puede actualizar su hMailServer a hMailServer 5.5.1 (BETA) aquí
Ahora es compatible con STARTTLS y con el puerto 587, todo funciona correctamente.