2009-07-17 442 views
37

No se puede probar el envío de correo electrónico desde el código .NET en Windows Vista Business."No se han podido leer los datos de la conexión de transporte: net_io_connectionclosed." - Windows Vista Business y SMTP

Estoy escribiendo un código que migraré a un paquete de SSIS una vez que se pruebe. El código es enviar un mensaje de error por correo electrónico a una lista de destinatarios.

El código está debajo, sin embargo, estoy obteniendo una excepción cuando ejecuto el código.

creé una clase simple de hacer el envío por correo ... el diseño podría ser mejor, estoy probando la funcionalidad antes de implementar la funcionalidad más robusta, métodos, etc.

namespace LabDemos 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Mailer m = new Mailer(); 
      m.test();  
     } 
    } 
} 

namespace LabDemos 
{ 
    class MyMailer 
    {  
     List<string> _to = new List<string>(); 
     List<string> _cc = new List<string>(); 
     List<string> _bcc = new List<string>(); 
     String _msgFrom = ""; 
     String _msgSubject = ""; 
     String _msgBody = "";    

     public void test(){ 
     //create the mail message 
     MailMessage mail = new MailMessage(); 

     //set the addresses 
     mail.From = new MailAddress("[email protected]");    

     //set the content 
     mail.Subject = "This is an email"; 
     mail.Body = "this is a sample body"; 
     mail.IsBodyHtml = false;  

     //send the message 
     SmtpClient smtp = new SmtpClient(); 
     smtp.Host = "emailservername"; 
     smtp.Port = 25; 
     smtp.UseDefaultCredentials = true; 
     smtp.Send(mail);    
    } 
} 

Mensaje de excepción

Inner Exception 
{"Unable to read data from the transport connection: net_io_connectionclosed."} 

Stack Trace 
" at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)\r\n at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)\r\n at System.Net.Mail.SmtpClient.GetConnection()\r\n at System.Net.Mail.SmtpClient.Send(MailMessage message)" 


Outer Exception 
    System.Net.Mail.SmtpException was unhandled 
    Message="Failure sending mail." 
    Source="System" 
    StackTrace: 
     at System.Net.Mail.SmtpClient.Send(MailMessage message) 
     at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40 
     at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) 
     at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) 
     at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() 
     at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 
     at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) 
     at System.Activator.CreateInstance(ActivationContext activationContext) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: System.IO.IOException 
     Message="Unable to read data from the transport connection: net_io_connectionclosed." 
     Source="System" 
     StackTrace: 
      at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine) 
      at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine) 
      at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller) 
      at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port) 
      at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port) 
      at System.Net.Mail.SmtpClient.GetConnection() 
      at System.Net.Mail.SmtpClient.Send(MailMessage message) 
     InnerException: 
+0

No voy a dar una respuesta para esta simplemente porque no sé lo suficiente sobre SMTP para sentirme bien al respecto. Sin embargo, esto definitivamente suena como un problema de entorno (probablemente en la configuración de IIS). ¿Está utilizando 1) "localhost" para smtp.Host 2) un servidor remoto para smtp.Host y/o 3) una dirección IP específica en lugar de un nombre de host? –

+0

I mi servidor de correo electrónico se refiere por nombre. Ejemplo "intercambio". He probado DNS haciendo ping al servidor. Esto fue exitoso También probé el acceso al puerto a través de telnet al puerto 25. Esto también fue exitoso. Probé el código en otra máquina y pude enviar el mensaje. Me parece que necesito instalar algún tipo de servicio/protocolo SMTP en la máquina. La máquina en la que falló el código es Windows Vista Business. Las pruebas tuvieron éxito en Windows Server 2008 Standard. –

+0

consulte: http://stackoverflow.com/questions/13689265/net-3-5-smtpclient-failure-sending-email-works-only-after-restarting-everyt/14272912#14272912 –

Respuesta

1

He encontrado que el sistema operativo Vista Business no viene con IIS SMTP. Sospecho que esta es la pieza que falta del rompecabezas. ¿Alguien ha tenido suerte con este problema?

6

Si ha especificado una dirección IP en la configuración del servicio SMTP, asegúrese de especificar la dirección IP de la máquina dentro de IIS7 y no poner localhost.

IIS7 hace que sea fácil para seleccionar 'localhost', sino que dará lugar a este error si el IP es 10.0.0.1 por ejemplo

1

Está su incompleted.Dash código es correcto en la identificación de it.Other entonces que el registro SMTP componente se instala o no cheque link text

3

Vista y Windows 7 no tiene un servidor SMTP, esta instalación se ha eliminado ya que Windows XP, por lo que necesita para configurar su servidor SMTP de forma explícita, hay varias herramientas disponibles en el mercado para ese , puedes verificarlo. Además, una vez que configure el SMTP, recuerde verificar el nombre del servidor que usaría para enviar el correo electrónico.

0

actualización a .NET 4.0 y aplicar todas las actualizaciones de seguridad

16

Hay varias cosas que pueden causar este problema, y ​​aquí están algunas de las cosas que he encontrado. Preguntas: Mencionas "Intercambio" - ¿Es este un servidor de intercambio? ¿El host requiere autenticación (quizás necesite agregar autenticación al cliente)? Lo que trataría de hacer primero es asignar el host a la dirección IP estática en lugar del nombre de host para ver si eso funciona primero. Si lo hace, es muy probable que sea un problema con la asignación de DNS.

If you are running your exchange server with Virtualization, you need to configure the SmtpClient to the host IP of the Virtual Server, not the physical hosting server name or IP. Right click on Default SMTP virtual server, select Properties, then go to Access tab, click Relay then add the IP address of the computer that send SMTP request to the SMTP server. (ASP.net site)

Si esto no funciona, es porque el servidor le está bloqueando el envío de paquetes SMTP. Debe asegurarse de agregar el cuadro al que está enviando los mensajes SMTP al servidor SMTP. Esto se hace a través de la pestaña de autenticación de IIS.

También me gustaría señalar que debe deshacerse del cliente de correo, o usar el cliente en una declaración "using". Esto asegurará que el mensaje "QUIT" se envíe al servidor y cierre con gracia la conexión.

using(SmtpClient smtp = new SmtpClient()) 
{ 
    smtp.Host = "emailservername"; 
    smtp.Port = 25; 
    smtp.UseDefaultCredentials = true; 
    smtp.Send(mail) 
} 
+1

Estoy teniendo problemas encontrar algo que confirme una declaración de uso envía el QUIT cuando termina. En resumen, cómo cerrar graciosamente la conexión sin una declaración de uso. – Zman101

+0

Si mira la documentación para SmtpClient.Dispose(), verá esto: "Envía un mensaje QUIT al servidor SMTP, finaliza con gracia la conexión TCP y libera todos los recursos utilizados por la instancia actual del sistema Clase .Net.Mail.SmtpClient ". –

7

Reiniciar IIS. Sé que suena tonto, hacer un reinicio para todo. (y siento aumentar un hilo viejo). Pero a veces reiniciar IIS funciona magia. Me enfrenté exactamente al mismo problema y lo reinicié.

Pudo haber ocurrido porque temporalmente el nombre 'localhost' no se pudo resolver. Estoy publicando aquí para que alguien que lo enfrenta ahora probablemente pruebe esta solución rápida antes de intentar investigar más a fondo. Espero que ayuda

+1

sorpresa agradable ... funciona !!! – sawe

1

estoy frente a este tema el pasado 6 horas y yo soy nuevo en eso, así que estoy tratando de resolver este problema en el siguiente manera

1) abrí símbolo del sistema (por ejemplo, Ctrl + R escribe cmd y entra).
2) Y compruebe el ping del servidor SMTP y compruebe la respuesta.
3) Si recibe respuesta, entonces está bien y para pasar al siguiente paso 4, el otro nombre smtp es incorrecto.
4) Luego verifico por telnet el puerto smtp (por ejemplo, 25) está abierto o no.
5) Usando este cmd, verificamos la respuesta SMTP.
6) telnet "yoursmtpname" "portno” (por ejemplo telnet smtp.gmail.com 25)
7) Si telnet no está funcionando, instale o añadir desde el panel de control en añadir nuevas funciones.
8) Si funciona, entonces es resultado pase similares.
9) 220 mx.google.com ESMTP.

Utilizando los pasos anteriores podemos descubrir la conexión SMTP está listo o no para el envío de correo.

2

I tenido el mismo problema ya que tenía IP múltiple en mi servicio er (servidores virtuales) y mi anfitrión estaba apuntando a localhost mientras mi servidor SMTP virtual se asigna a una determinada IP:

<smtp deliveryMethod="Network"> 
     <network host="localhost" port="25" defaultCredentials="false"/> 
</smtp> 

Hay 2 soluciones para esto:

  1. cambiar su codifique y establezca el host para la IP particular que está siendo utilizada por el servidor virtual SMTP en lugar de localhost.
  2. Cambio de servidor virtual SMTP IP a Todos sin asignar

Para ver/cambio de servidor virtual SMTP IP: Dirección IP clic derecho sobre el servidor virtual SMTP predeterminado, seleccione Propiedades en el cambio de ficha General/ver.

Espero que esto ahorre el día a alguien con el mismo problema.

1

Desarrollé una aplicación de servicio de Windows en VB usando .NET Framework v4.5 y recientemente me encontré con este problema.

En primer lugar, un poco de fondo - Me encontré con el error del OP después de tratar de resolver el error "Servicio no disponible, cerrando canal de transmisión. La respuesta del servidor fue: Error: demasiados mensajes en una sesión" que fue resuelto por llamando al método Dispose en el objeto SmtpClient después de cada correo electrónico enviado.Solo para ser ultra seguro, también llamé Dispose en el objeto MailMessage.

Bien, ahora se resuelve el problema de "demasiados mensajes en una sesión" pero ahora ocasionalmente recibí el error "No se pudo leer datos de la conexión de transporte: net_io_connectionclosed". Increíble. Resultó que no había implementado mi clase de correo electrónico de manera consistente, en una instancia, se estaba desechando mientras que en la otra no.

He aquí un ejemplo de lo resuelto ambos problemas para mí (que es en VB, pero se entiende la idea):

With New clsEmail(True) 
    With .Message 
     .To.Add("[email protected]") 
     .Subject = msgSubject 
     .Body = msgContents 
    End With 

    .Server.Send(.Message) 
    .Server.Dispose() 
    .Message.Dispose() 
End With 

Mi clase de correo electrónico tiene, entre otras cosas, cuenta con 2 propiedades - Mensaje (System.Net .Mail.MailMessage) y Server (System.Net.Mail.SmtpClient) que es lo que se elimina en este ejemplo.

No he tenido un solo problema después de que cientos de correos electrónicos, una vez cada instancia que envía correos electrónicos en mi servicio se implementaron de esta manera.

Cuestiones relacionadas