2012-03-20 22 views
5

Estoy escribiendo un servicio de Windows usando C# .NET 4.0 (mi estación de trabajo de desarrollo es Windows 7). El objetivo es enviar un correo electrónico del servicio directamente en caso de errores durante el procesamiento. He incluido un fragmento de código para mostrar lo que estoy tratando de lograr:No se puede enviar correo electrónico SMTP desde el servicio de Windows en Win7

try 
     { 
       string emailAddresses = "[email protected]"; 
       string emailCCAddresses = "[email protected]"; 

       //Send the email 
       using (MailMessage mailMsg = new MailMessage()) 
       { 
        mailMsg.To.Add(emailAddresses); 
        mailMsg.From = new MailAddress("[email protected]"); 
        mailMsg.CC.Add(emailCCAddresses); 
        mailMsg.Subject = " Error Message "; 
        mailMsg.Body = DateTime.Now + " : Invalid File Encountered." ; 

        ////Creating the file attachment 
        using (Attachment data = new Attachment("C:\\users\\sample.xml", MediaTypeNames.Application.Octet)) 
        { 
         //Add timestamp info for the file 
         ContentDisposition disposition = data.ContentDisposition; 
         disposition.ModificationDate = File.GetLastWriteTime("C:\\users\\sample.xml"); 
         mailMsg.Attachments.Add(data); 

        SmtpClient emailClient = new SmtpClient("example.Sample.com", 25); 
        emailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
        emailClient.UseDefaultCredentials = true; 
        emailClient.Send(mailMsg); 
        } 
       }//end using 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 

El problema es estoy frente - la opción de correo electrónico no funciona desde un servicio de victoria en cualquier Windows 7 máquina. Sin embargo, el mismo código funcionará en una máquina Win XP perfectamente bien. Advertencia, esto no se puede probar como una aplicación de consola. Debe ejecutarse como un servicio para ver el comportamiento. Puse el mismo código en una aplicación de consola y funcionó bien en mi máquina de ganar 7.

Además, habilité las características de cliente de telnet y servidor y pude enviar correos electrónicos a través del símbolo del sistema con éxito.

he intentado un par de cosas para tratar de aislar la causa (no funcionaba) -

  • Ajuste del NetworkCredential explícita y establecer UseDefaultCredentials = false. emailClient.Credentials = new System.Net.NetworkCredential ("username", "pwd", "Domain1");

  • cambiar el Iniciar sesión como opción del servicio a ser mi ID de usuario y pwd

  • El De y direcciones de correo electrónico son auténticos, no direcciones ficticias (en mi código real que es!)

Las únicas diferencias que puedo encontrar es que el servicio de Windows se instala bajo la cuenta del sistema local. Pero cambiar el registro como debería haber causado que use mis detalles de autenticación/las credenciales especificadas en el código. El técnico de TI de mi oficina dijo que la única diferencia que vio fue que mi mensaje se envió como retransmisor (no estoy seguro de lo que significa que las cuentas from/to e iniciar sesión como actualizadas a mi inicio de sesión no cambiaron el resultado)

la excepción veo capturados es:

SMTP excepción lanzada: System.Net.Mail.SmtpException: Si no enviar correo. ---> System.Net.WebException: no se puede conectar al servidor remoto ---> System.Net.Sockets.SocketException: se intentó acceder a un socket de una manera prohibida por sus permisos de acceso XXX.XXX.XXX .XXX XX en System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) en System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, socket s4, socket s6, socket & socket, direcciónIP & dirección, estado ConnectSocketState , IAsyncResult asyncResult, Int32 tiempo de espera, excepción & excepción)

Todas las ideas son apreciadas!

Creo que tiene que ver con una política/función de seguridad de Windows 7 y con suerte podría ser tan simple como cambiar una configuración predeterminada.

+0

¿Tiene algún firewall funcionando? Un Google rápido para el mensaje de la SocketException que se lanzó inicialmente ("Se intentó acceder a un socket de una manera prohibida por sus permisos de acceso ...") sugiere que varias personas que han experimentado el mismo problema determinaron que su El software de firewall impidió que el servicio enviara el correo y lo resolvió deshabilitando el firewall o agregando una regla de permiso para su servicio en su configuración. – Iridium

+0

pensé en eso ... Pero pude enviar el correo smtp a través de una aplicación de consola (mismo código, simplemente no un servicio) y a través del símbolo del sistema. Además, mi compañero de trabajo (el mismo equipo y los derechos de acceso) que ejecutó el servicio en su máquina con Windows XP pudo enviar un correo electrónico. Verificamos con TI y nos dicen que no estamos bloqueados. – PreethaA

+0

Apuesto a que es la identidad bajo la cual se ejecuta el servicio la causa del problema. No sé si cambiaron el valor predeterminado entre XP y Win 7, pero sé que lo hicieron para el grupo de aplicaciones de IIS. –

Respuesta

0

Descubrí que era la política de seguridad en nuestras nuevas computadoras portátiles de trabajo y el departamento de TI se negó a permitirnos cambiarla. Nuestro servidor de prueba no tiene el mismo problema, por lo que tampoco es Windows 7, así que no puedo estar 100% seguro. Intenta enviar correos electrónicos a través de la línea de comandos para ver si smtp está permitido desde tu PC.

El mismo código trabajaron ejecuta bien whn en una máquina servidor Win XP o Windows que no hav ninguna restricción

1

Puede ejecutar el servicio como usuario actual. Simplemente seleccione la opción USUARIO en el instalador del servicio y funcionará como usuario actual. Hoy recibí el mismo error y encontré esta solución. Espero que sea útil para cualquiera. enter image description here

Cuestiones relacionadas