2010-03-18 23 views
13

No puedo enviar el correo usando el cliente smtp. Aquí está el código:Enviando correo usando SmtpClient en .net

SmtpClient client=new SmtpClient("Host"); 
client.Credentials=new NetworkCredential("username", "password"); 
MailMessage mailMessage = new MailMessage(); 
mailMessage.from="[email protected]"; 
mailMessage.To.Add("[email protected]"); 
mailMessage.body="body"; 
mailMessage.subject="subject"; 
client.Send(mailMessage); 

El problema es que cuando se utiliza el código de la aplicación ASP.NET, que no reciben ninguna correos. Cuando en asp.net cambio la dirección de correo electrónico a nombre de usuario en NetworkCredential, recibo correos.

Pero en la aplicación de Windows C#, puedo recibir correos electrónicos, incluso si la dirección de correo electrónico del remitente no es válida.

+0

Esto podría estar relacionado con la configuración en el servidor frente a su máquina de desarrollo. – Nate

+0

Parece que está usando una dirección de gmail en el campo de. ¿Se ha asegurado de que todos los ajustes estén configurados según las instrucciones de ellos? –

Respuesta

1

Significa que su servidor de correo no permite Mail-Relay. Su servidor de correo solo le permite enviar correos electrónicos de ID de correo electrónico autenticado como nombre de usuario. En general, esto se hace para evitar que los correos se envíen como identidades diferentes a las autenticadas.

+1

El servidor de correo es el mismo tanto en Windows como en la aplicación ASP.NET. Y también el mismo código funciona bien en otra página de la aplicación ASP.NET. No funciona en la página de inicio de sesión de la aplicación ASP.NET. ¿Cuál puede ser el problema? –

+0

¿Qué es el modo de autenticación de su aplicación? Proporcione más detalles sobre el escenario del problema. –

+0

En asp.net, el modo de autenticación se establece en formularios. –

0

Prueba esto:

MailMessage mail = new MailMessage("emailfrom","emailto"); 

mail.From = new MailAddress("emailfrom"); 
mail.Subject = txtsbjct.Text; 
string Body = txtmsg.Text; 
mail.Body = Body; 

mail.IsBodyHtml = true; 
SmtpClient smtp = new SmtpClient(); 
smtp.Host = "smtp.gmail.com"; //Or Your SMTP Server Address 
smtp.Credentials = new System.Net.NetworkCredential("youremail", "yourpassword"); 

smtp.EnableSsl = true; 
smtp.Send(mail); 
txtemail.Text = ""; 
txtmsg.Text = ""; 
txtsbjct.Text = ""; 
Label1.Text = "your email has been send"; 
mail = null; 
smtp = null; 
10

me di cuenta de que al establecer la propiedad Credenciales SmtpClient antes de ajustar los UseDefaultCredentials = false hace que las credenciales para ser ignorados.

falla:

SmtpClient smtp = new SmtpClient; 
smtp.Credentials = new NetworkCredential("user","pass"); 
smtp.UseDefaultCredentials = false; 

Obras:

SmtpClient smtp = new SmtpClient; 
smtp.UseDefaultCredentials = false; 
smtp.Credentials = new NetworkCredential("user","pass"); 

Ir figura.

+0

Esto no tiene sentido ya que ambos fragmentos de código son casi idénticos. La única diferencia es la creación de instancias de la clase 'NetworkCredential' dentro del bloque' using' en el segundo fragmento. Tal vez esto tiene un efecto secundario involuntario? –

+0

Estás en lo correcto. Y el efecto involuntario es que configurar las credenciales ANTES de establecer UseDefaultCredentials = false es lo que hace que esto suceda. Editaré la publicación. – user3524983

+0

Y finalmente obtuve las credenciales trabajando desde web.config. ¡Uf! Que dia. – user3524983

-2
void sendEmail(string strFrom 
         , string strTo 
         , string strSubject 
         , string strBody) 
    { 

     MailMessage objMailMessage = new MailMessage(); 
     System.Net.NetworkCredential objSMTPUserInfo = 
      new System.Net.NetworkCredential(); 
     SmtpClient objSmtpClient = new SmtpClient(); 

     try 
     { 
      objMailMessage.From = new MailAddress(strFrom); 
      objMailMessage.To.Add(new MailAddress(strTo)); 
      objMailMessage.Subject = strSubject; 
      objMailMessage.Body = strBody; 

      objSmtpClient = new SmtpClient("172.0.0.1"); /// Server IP 
      objSMTPUserInfo = new System.Net.NetworkCredential 
      ("User name", "Password","Domain"); 
      objSmtpClient.Credentials = objSMTPUserInfo; 
      objSmtpClient.UseDefaultCredentials = false; 
      objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 

      objSmtpClient.Send(objMailMessage); 
     } 
     catch (Exception ex) 
     { throw ex; } 

     finally 
     { 
      objMailMessage = null; 
      objSMTPUserInfo = null; 
      objSmtpClient = null; 
     } 
    } 
+3

Su manejo de errores es realmente una mala práctica, porque está perdiendo el seguimiento de la pila (cf http://stackoverflow.com/a/730255/474763) ... además, en este caso, omitir la cláusula de captura tendría sido el camino a seguir – tsimbalar

+0

De hecho. Si quiere 'catch (Exception ex)' y luego 'throw' it, simplemente use' throw; 'en lugar de' throw ex; 'y se mantendrá el rastreo de la pila. Sin embargo, esto solo es útil si está haciendo otras cosas antes de volver a lanzar la excepción, como iniciar sesión. En este caso, sin embargo, simplemente omitir la cláusula 'catch' habría tenido el mismo efecto. –

Cuestiones relacionadas