Puede ocurrir en una aplicación que los usuarios se olviden su contraseña para ingresar al sistema. Una de las acciones que se pueden llegar a tomar es la de generar una nueva contraseña y enviarla al correo electrónico del usuario.
Interfaz Gráfica
NOTA: Lo ideal seria usar el correo interno de la empresa a la que pertenece el usuario. En el ejemplo utilizamos el servicio gmail y outlook a modo de ejemplo.
Por un lado tenemos los datos del servicio y por otro los datos del usuario.
Al seleccionar un servicio del combobox se va a completar los campos servidor y puerto. Lo mismo ocurre con el combobox de usuarios, al seleccionar uno de ellos, automáticamente vamos a obtener el correo electrónico del usuario.
Los datos del usuario se van a obtener desde una base de datos que va a estar adjuntada al proyecto. La estructura de la tabla Usuario es muy básica y esta compuesta por las columnas {CodUsuario,Usuario,Contraseña,CorreoElectronico}.
Código
Crearemos una nueva clase llamada Usuario en la cual vamos a definir las propiedades que van a representar a los datos del usuario.
Seguido a esto vamos a crear una funcion llamado CargarUsuario() que va a devolver una lista de usuarios
private ListCargarUsuarios() { List ListaUsuarios = new List (); using (SqlConnection cnn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\PassMailBD.mdf;Integrated Security=True;User Instance=True")) { cnn.Open(); string ConsultaUsuario = @"SELECT CodUsuario,Usuario,Contraseña,CorreoElectronico FROM Usuario"; SqlCommand cmd = new SqlCommand(ConsultaUsuario, cnn); SqlDataReader lector = cmd.ExecuteReader(); while (lector.Read()) { UsuarioEN UnUsuario = new UsuarioEN(); UnUsuario.CodUsuario = lector.GetInt32(0); UnUsuario.Usuario = lector[1].ToString(); UnUsuario.Contraseña = lector[2].ToString(); UnUsuario.CorreoElectronico = lector[3].ToString(); ListaUsuarios.Add(UnUsuario); } } return ListaUsuarios; }
Dentro del ciclo while, vamos a asignar cada dato a su respectiva propiedad.
Con este paso ya realizado, es posible poder llenar nuestro combobox de usuarios
UsuarioCMB.DisplayMember = "Usuario"; UsuarioCMB.ValueMember = "CodUsuario"; UsuarioCMB.DataSource = CargarUsuarios();
Al seleccionar un item del combobox, lo que haremos es asignar la propiedad CorreoElectronico del usuario al textbox(correo electronico) de la interfaz gráfica.
private void UsuarioCMB_SelectedIndexChanged(object sender, EventArgs e) { CorreoElectronicoTxt.Text = ((UsuarioEN)UsuarioCMB.SelectedItem).CorreoElectronico; }
Luego de completar los datos llego el momento de generar la nueva contraseña.
Para generar la contraseña se va a utilizar el método Next de la clase Random para obtener un indice aleatorio del string Caracteres e ir concatenando cada caracter a la cadena del StringBuilder. La longitud de la contraseña sera de 10 caracteres.
string Caracteres = @"1234567890qwertyuiopaslñzxcvbnmQWERTYPÑLKJHGFDSXCVBNM_-.[]{};_:^¨*\|!·$%&/()=?¿@#~€"; Random Rnd = new Random(); StringBuilder SB = new StringBuilder(); char CH; for (int i=1;i<=10;i++) { CH = Caracteres[Rnd.Next(0, Caracteres.Length)]; SB.Append(CH); } return SB.ToString();
Luego de generar la contraseña vamos a proceder a modificar la contraseña del usuario en la base de datos y luego enviarla por correo electrónico
ModificarUsuario((int)UsuarioCMB.SelectedValue, Contraseña);
Le pasamos como parámetro el código del usuario seleccionado del combo y la contraseña generada.
private void ModificarUsuario(int CodUsu,string Contraseña) { using (SqlConnection cnn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\PassMailBD.mdf;Integrated Security=True;User Instance=True")) { cnn.Open(); string ConsultaUpdate = "UPDATE Usuario SET Contraseña=@Param1 WHERE CodUsuario=@Param2"; SqlCommand cmd = new SqlCommand(ConsultaUpdate,cnn); cmd.Parameters.AddWithValue("@Param1", Contraseña); cmd.Parameters.AddWithValue("@Param2", CodUsu); cmd.ExecuteNonQuery(); } }
Para enviar el mail utilizaremos el espacio de nombres:
Using System.Net.Mail;
Definimos un método llamado EnviarCorreo en el cual le pasaremos como parámetro el usuario afectado y la contraseña.
private void EnviarCorreo(string Usuario,string Contraseña) { SmtpClient ServidorSmtp = new SmtpClient(ServidorTxt.Text,Convert.ToInt32(PuertoTxt.Text)); ServidorSmtp.EnableSsl = true; ServidorSmtp.UseDefaultCredentials = false; if(ServiciosCMB.SelectedItem.ToString() == "Outlook") { ServidorSmtp.Credentials = new System.Net.NetworkCredential("UsuarioOutlook","ContraseñaOutlook"); } else { ServidorSmtp.Credentials = new System.Net.NetworkCredential("UsuarioGmail", "ContraseñaGmail"); } MailMessage Correo = new MailMessage(); MailAddress Remitente = new MailAddress("CorreoRemitente"); Correo.From = Remitente; Correo.Subject = "Nueva Contraseña"; Correo.To.Add(CorreoElectronicoTxt.Text); Correo.Body = "Usuario:" + Usuario + Environment.NewLine + "Contraseña: " + Contraseña; ServidorSmtp.Send(Correo); }
Creamos un objeto de tipo SmtpClient en el cual le pasamos como parámetros el servidor y el puerto del servicio. El puerto debemos convertirlo a integer ya que es de este tipo de datos el puerto.
Debemos definir una condición dependiendo el servicio que se selecciono y crear una nueva credencial ya que no usaremos las credenciales por defecto.
Tanto para outlook como para Gmail hay que asignar como parámetros el usuario y la contraseña del servicio.
Para el cuerpo del correo electrónico definimos las siguientes propiedades:
- From: Es el remitente del correo electrónico.
- Subject: Asunto del correo electrónico.
- To.Add(String): El string corresponde al correo electrónico del destinatario. En este caso, al correo electronico del usuario seleccionado en la interfaz.
- Body: Es el cuerpo del mensaje, donde vamos a usar los datos que se pasaron como parámetro.
Por ultimo, utilizamos el método Send en el que le pasamos como parámetro el correo electrónico (MailMessage)
Fin
No hay comentarios. :
Publicar un comentario