2012-03-09 66 views
37

¿Cómo enviar un correo electrónico a través de mvc-3 asp.net usando C#?¿Cómo enviar un correo electrónico desde Asp.net Mvc-3?

Tengo que enviar una contraseña olvidada así que ¿cómo puedo hacer esto? Mi código está por debajo.

Código modelo ..

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 

namespace TelerikLogin.Models.ViewModels 
{ 
    public class ForgotPassword 
    { 
     public int user_id { get; set; } 
     public string user_login_name { get; set; } 
     public string user_password { get; set; } 

     [Required] 
     [Display(Name="Email Address : ")] 
     public string user_email_address { get; set; } 
    } 
} 

código de controlador ..

public ActionResult ForgotPassword() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult ForgotPassword(string user_email_address) 
     { 
      SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\MVC3\TelerikLogin\TelerikLogin\App_Data\Login.mdf;Integrated Security=True;User Instance=True"); 

      DataTable dt1 = new DataTable(); 

      string strQuery = string.Format("SELECT user_password FROM [user_master] WHERE user_email_address='{0}'",user_email_address); 
      conn.Open(); 
      SqlDataAdapter da1 = new SqlDataAdapter(strQuery, conn); 
      da1.Fill(dt1); 
      conn.Close(); 

      if (dt1.Rows.Count > 0) 
      { 

MailMessage msg = new MailMessage(); 

      msg.From = new MailAddress("[email protected]"); 
      msg.To.Add(user_email_address); 
      msg.Subject = "Password"; 
      msg.Body = "Test1"; 
      msg.Priority = MailPriority.High; 

      SmtpClient client = new SmtpClient(); 




      client.Credentials = new NetworkCredential("[email protected]", "disha", "smtp.gmail.com"); 
      client.Host = "smtp.gmail.com"; 
      client.Port = 587; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.EnableSsl = true; 
      client.UseDefaultCredentials = true; 

      client.Send(msg); 


       return RedirectToAction("About", "Home"); 
      } 
      return View(); 
     } 

Aquí Fui a buscar la contraseña de usuario de base de datos a través de e-mail facilitados ..

Ver código ..

<% using (Html.BeginForm("ForgotPassword", "Account", FormMethod.Post)) 
    { %> 

    <%: Html.LabelFor(m => m.user_email_address) %> 
    <%: Html.TextBox("user_email_address")%> 
     <%: Html.ValidationSummary(true) %> 

<input type="submit" value="Submit"/> 

    <%} %> 

Me da un error en estas líneas

client.Send(msg); 

messege error es:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. x1sm1264662igc.16 

¿Cómo se puede solucionar? gracias de antemano

+32

Por favor, considere * no * correo electrónico una contraseña de recuperación. Debe proporcionar un enlace para restablecer una contraseña en su sitio web. –

+5

Sí, debe almacenar las contraseñas en un formato hash y no descifrable. Consulte el artículo de Troy Hunt [Todo lo que siempre quiso saber sobre la creación de una función de restablecimiento de contraseña segura] (http://www.troyhunt.com/2012/05/everything-y-ever-wanted-to-know.html). –

+4

OT, pero hay una enorme vulnerabilidad de inyección SQL en este código. Considere lo que sucede cuando PUBLICO con user_email_address = '[email protected], 'O' admin @ yoursite.com' ... – gregmac

Respuesta

69

Importe el espacio de nombre System.Net.Mail.

El código será similar a esto:

MailMessage mail = new MailMessage(); 

SmtpClient smtpServer = new SmtpClient("smtp.gmail.com"); 
smtpServer.Credentials = new System.Net.NetworkCredential("userName", "password"); 
smtpServer.Port = 587; // Gmail works on this port 

mail.From = new MailAddress("[email protected]"); 
mail.To.Add("[email protected]"); 
mail.Subject = "Password recovery"; 
mail.Body = "Recovering the password"; 

smtpServer.Send(mail); 

P. S. Tiene una vulnerabilidad de inyección SQL en el código de muestra. Use un objeto SqlCommand con parámetros en lugar de String.Format().

El uso de SqlDataReader sería mucho más eficiente para buscar un registro en lugar de llenar un DataSet.

+0

Hola, @Dmitry Implemente su código pero me da un error en la línea smtpServer.send (correo); como este error es: El servidor SMTP requiere una conexión segura o el cliente no fue autenticado. La respuesta del servidor fue: 5.7.0 Primero debe emitir un comando STARTTLS. ub10sm724863igb.7 – Dip

+0

Necesita agregar un puerto adecuado y credenciales para algunos servidores. Necesitará la siguiente información para el servidor smtp de gmail –

+5

SmtpServer.Credentials = new System.Net.NetworkCredential (userName, password); SmtpServer.Port = 587; // Gmail funciona en este puerto –

16

Tenga una mirada en MvcMailer

MvcMailer le proporciona un correo electrónico que envía estilo ActionMailer NuGet paquete para ASP.NET MVC 3/4. Por lo tanto, puede producir correos electrónicos de apariencia profesional compuestos de sus páginas maestras MVC y vistas con ViewBag.

1

estoy usando esto para el envío de correo electrónico, en ASP.net MVC3

System.Web.Helpers.WebMail.SmtpServer = smtp_server; 
      System.Web.Helpers.WebMail.SmtpPort = smtp_port; 
      System.Web.Helpers.WebMail.EnableSsl = true; 
      System.Web.Helpers.WebMail.From = "fromaddress"; 
      StringBuilder sb = new StringBuilder(); 
      sb.Append("<table><tr><td>");    
      sb.Append(msg);      
      sb.Append("</td></tr></table>"); 
      string body = sb.ToString(); 
      string To = toemail; 
      System.Web.Helpers.WebMail.Send(To,subject, body); 
0

que parezca que están tratando de enviar correos electrónicos a través del servicio SMTP de GMail, que esta pregunta SO ya cubre: Sending email in .NET through Gmail

Lo único que parece que falta en el código es que ha establecido client.UseDefaultCredentials = true, creo que desea establecer esto en false y proporcionar sus propias credenciales. Nunca he intentado usar GMail para enviar correos electrónicos, pero supongo que necesitarás usar una cuenta de GMail como tus credenciales para poder autenticarte correctamente.

0

Debe activar el servicio SMTP en Windows 7:

  • ir a Panel de control> Programas
  • clic "Activar ventana o desactivar las características"
  • haga clic en Servicio de Información de Internet y haga clic en OK
+0

Esto enciende el servidor SMTP y no tiene nada que ver con .NET. Además, es muy probable que no se entreguen muchos correos electrónicos si envía correos electrónicos desde su casa o un servidor no configurado (por ejemplo, SPF, rDNS, etc.). Esta respuesta no es correcta. – ppumkin

11

puede utilizar este ...

public void SendEmail(string address, string subject, string message) 
    { 
     string email = "[email protected]"; 
     string password = "put-your-GMAIL-password-here"; 

     var loginInfo = new NetworkCredential(email, password); 
     var msg = new MailMessage(); 
     var smtpClient = new SmtpClient("smtp.gmail.com", 587); 

     msg.From = new MailAddress(email); 
     msg.To.Add(new MailAddress(address)); 
     msg.Subject = subject; 
     msg.Body = message; 
     msg.IsBodyHtml = true; 

     smtpClient.EnableSsl = true; 
     smtpClient.UseDefaultCredentials = false; 
     smtpClient.Credentials = loginInfo; 
     smtpClient.Send(msg); 
    } 
0

cuando el uso de SMTP para Gmail, recuerde poner

smtpClient.UseDefaultCredentials = false;

antes

smtpClient.Credentials = loginInfo; 
1
Using Systems.Net.Mail; 
// POST: /Account/Register 
//Here's a simple Mail(MVC4) 

     public async Task<ActionResult> Register(RegisterViewModel model) 
     { 
      Mail email= new Mail(); 
      if (ModelState.IsValid) 
      { 
       var user = new ApplicationUser() { UserName = model.UserName, Email = model.Email }; 
       var result = await UserManager.CreateAsync(user, model.Password); 
       if (result.Succeeded) 
       { 
        email.to = new MailAddress(model.Email); 
        email.body = "Hello " + model.Firstname + " your account has been created <br/> Username: " + model.UserName + " <br/>Password: " + model.Password.ToString() + " <br/> change it on first loggin"; 
        ViewBag.Feed = email.reg(); 


        await SignInAsync(user, isPersistent: false); 


        return RedirectToAction("Index", "Home"); 

       } 
       else 
       { 
        AddErrors(result); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 




//Business Logic(this Is you Email Class) 




Using Systems.Net.Mail; 


public class Mail 

    { 
     public MailAddress to { get; set; } 
     public MailAddress from { get; set; } 
     public string sub { get; set; } 
     public string body { get; set; } 




     public string reg() 
     { 
      string feed = "Registration Successful"; 
      var m = new System.Net.Mail.MailMessage() 
      { 
       Subject = "", 
       Body = body, 
       IsBodyHtml = true 
      }; 
      m.From = new MailAddress("[email protected] ", "Administrator"); 
      m.To.Add(to); 
      SmtpClient smtp = new SmtpClient 
      { 
       Host = "pod51014.outlook.com", 
       //Host = "smtp-mail.outlook.com", 
       Port = 587, 
       Credentials = new System.Net.NetworkCredential("[email protected] ", " Dut324232"), 
       EnableSsl = true 
      }; 

      try 
      { 
       smtp.Send(m); 
       // feed = ""; 
      } 
      catch (Exception e) 
      { 

      } 

      return feed; 

     } 
     public string fogot() 
     { 
      string feedback = ""; 

      var m = new System.Net.Mail.MailMessage() 
      { 
       Subject = "Reset Password PIN", 
       Body = body, 
       IsBodyHtml = true 
      }; 
      m.From = new MailAddress("[email protected] ", "Administrator"); 
      m.To.Add(to); 
      SmtpClient smtp = new SmtpClient 
      { 
       Host = "pod51014.outlook.com", 
       Port = 587, 
       Credentials = new System.Net.NetworkCredential("[email protected] ", "Dut324232"), 
       EnableSsl = true 
      }; 

      try 
      { 
       smtp.Send(m); 
       feedback = "Check your email for PIN"; 
      } 
      catch (Exception e) 
      { 
       feedback = "Message not sent" + e.Message; 
      } 
      return feedback; 

     } 

    } 
} 
Cuestiones relacionadas