PHP - Restablecer contraseña mediante correo

 
Vista:
sin imagen de perfil

Restablecer contraseña mediante correo

Publicado por Stark1407 (5 intervenciones) el 15/09/2016 23:19:02
Hola a todos.

Tengo el siguiente problema, intento recuperar la contraseña de un usuario mediante un correo electrónico. He buscado información y justamente en este foro hay un compañero que lo ha conseguido pero a mí no me funciona.

Os indico donde encontré el código- URL: http://www.lawebdelprogramador.com/foros/PHP/1422680-Recuperar-Password-ingresando-matricula-en-form.html.

Por nada quiero atribuirme el merito de código

Pues bien, yo lo he estructurado de la siguiente forma:

1-He creado un form donde indico que escriban el correo.

1
2
3
4
5
6
<form action="rest_pass_conf.php" method="post"  class="login-form" ">
        <input name="correo_usuario" type="text" required="required" class="login-input" id="correo_usuario" placeholder='Ingresa tu email' value="">

	<input type="submit" class="login-btn" value="Recuperar" name="button" id="button">

</form>

2- Al llegar a la página tiene el código para verificar si existe el correo en la BBDD y en caso positivo que envié el correo con los valores (pass y correo):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
 
 $button=$_POST['button'];
 $correo_usuario=$_POST['correo_usuario'];
 
 if($button){
	if($correo_usuario){
		if(empty($correo_usuario)) {
            $error =false;
		}
		$mail = htmlentities($correo_usuario);
		$link = mysql_connect ($hostname_bd, $username_bd, $password_bd) or die(mysql_error());
        mysql_select_db($database_bd,$link);
 
		$queEmp = "SELECT * FROM usuarios WHERE correo_usuario='$correo_usuario'";
		$resEmp = mysql_query($queEmp, $link) or die(mysql_error());
		$totEmp = mysql_num_rows($resEmp);
		if($totEmp == 0){
			$error = true;
			echo "<script language=Javascript> window.location =\"rest_pass_error.php\"; </script>";
 
		exit();
		}else{
			echo "";
		}
 
		$row = mysql_fetch_assoc($resEmp);
 
		$hash = md5($row['pass_usuario']) or die(mysql_error());
 
		$headers ="Hola";
		$headers .= "From:Nueva clave de usuario <tucorreo@dominio.com>\r\n";
		$headers .= "CC: concopiaa@dominio.com\r\n";
		$message = "hemos recibido una
solicitud para restablecer tu contraseña.
  
Para restablecer la contraseña, haz clic o copia y pega la URL en tu navegador.
		http://www.tuweb.com/password_reset.php?id=".$hash."&mail=".$mail."
		Si estás recibiendo muchos correos electrónicos de restablecimiento de contraseña que no solicitaste, puedes cambiarla Iniciando sesión para prevenir el robo de información.
		Por favor, no respondas a este mensaje; fue enviado desde una dirección de correo electrónico no supervisada. Este mensaje es un servicio de correo electrónico relacionado con tu uso en el portar.";
 
		//echo ($message);
		if (mail($mail,"Recuperar password",$message,$headers)){
		$msg = "Hemos enviado las instrucciones de restablecimiento de contraseña a tu dirección de correo electrónico, Si no recibes las instrucciones dentro de pocos minutos, revisa el spam de tu correo electrónico y correo no deseado..";
		}
	}
}
?>

Hasta aquí todo perfecto, el correo se envía con los parámetros id y correo.

Ahora bien, el problema aparece en el siguiente apartado:

3- He creado una página llamada pass_reset.php con el siguiente formulario que directamente me da un error (adjunto captura del error), la URL enviada por correo y que el usuario ha de dar es: http://prueba/pass_reset.php?id=pass(encriptado en md5)d&[email protected]

php_error

1
2
3
4
5
6
7
<form name="form1" action="password_reset_conf.php?id=<?=$id?>&mail=<?=$mail?>" class="login-form" method="get">
 
  <input name="pass_usuario" type="password" required="required" class="login-input" id="pass_usuario" placeholder='Ingresa tu nueva contrase&ntilde;a...'>
 
  <input type="submit" class="login-btn" value="Guardar" name="button" id="button">
 
</form>

4- Al enviar se redirecciona a "password_reset_conf.php", con el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?
 
$id = htmlentities($_GET['id']);
$mail = htmlentities($_GET['mail']);
 
 
$pass = md5($_POST['pass_usuario']);
if($_POST['button']){
	if(isset($id) && isset($mail)){
		$link = mysql_connect ($hostname_bd, $username_bd, $password_bd);
        mysql_select_db($database_tienda_online,$link);
 
		$queEmp = "SELECT * FROM usuarios WHERE correo_usuario='$mail'";
		$resEmp = mysql_query($queEmp, $link) or die(mysql_error());
		$totEmp = mysql_num_rows($resEmp);
		if($totEmp == 0){
		echo "El mail ingresado no existe";
		exit();
		}
		$row = mysql_fetch_assoc($resEmp);
		$hash = md5($row['pass_usuario']);
 
		if($hash == $id){
		$sql = "UPDATE usuarios SET pass_usuario='".$pass."' WHERE correo_usuario='$mail'";
		mysql_query($sql,$link);
		$msg = " Contrase&ntilde;a cambiada correctamente";
		header('Location: password_reset_confirmation.php');
 
 
		}
	}
}
?>

En este punto si introducimos cualquier texto,directamente no aparece ningún mensaje. He probado mil cosas y creo que no estoy entendiendo el concepto del anterior compañero.

Agradecería que alguien pueda ayudarme al respecto.

Ante todo muchas gracias a todos.


Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Restablecer contraseña mediante correo

Publicado por zendi (1056 intervenciones) el 16/09/2016 13:45:57
Hola yo desarrollé este codigo, bueno son dos el formulario y el que procesa el envio del correo.
NOTA: aplicalos a tu necesidad.
OJO: AVISANOS SI TE FUNCIONÓ.

el FORMULARIO:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
  $connect = pg_connect("host=localhost port=5432 dbname=pediatria user=postgres password=movilnet");
   error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
   $nrohist = $_GET['nro'];
   $especialidad = $_GET['especial'];
   $nrohistoria = "SELECT * FROM vcitapaciente1 WHERE nrohistoria = '$nrohist' AND id_especialidad = '$especialidad'";
   $actualiza = @pg_query($connect,$nrohistoria);
 
   while($especial=@pg_fetch_array($actualiza)):
        $nombres = $especial['nombre'];
        $apellidos = $especial['apellidos'];
        $ctacorreo = $especial['cta_correo'];
	      $telefono  = $especial['telefono'];
	      $correo = $especial['correo_especialidad'];
   endwhile;
 
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <link rel="stylesheet" href="estilo.css" type="text/css">
 
<style>
	form {
		margin: 1em auto;
	    text-align: center;
     }
	span{
	  color: #F60;
	  font-size: 1.5 em;
	}
</style>
</head>
<!--/////////Codigo para enviar correos a un solo destinatario, con enviar1.php.-->
<body>
<form name="mail_frm" class="contact_form" method="post" enctype="multipart/form-data" action="enviapaciente.php">
 
<ul>
                <li>
                    <h2>Mensajería</h2>
                </li>
 
            <li>
			<!--corregir esta linea de codigo-->
			 <input type="text" name="de_txt" id='De'  placeholder="De" required value="<?php echo $correo;?>">
            </li>
 
             <li>
            <input type="text" name="para_txt" readonly="t" maxlength="50" size="50" required value="<?php echo $nombres;?>">
            </li>
 
             <li>
            <input type="text" name="apellidos" readonly="t" maxlength="50" size="50" required value="<?php echo $apellidos;?>">
            </li>
            <li>
          <input type="text" name="asunto_txt" placeholder="Asunto" required>
                <span class="form_hint">Formato correcto: "Asunto"</span>
 
            </li>
             <li>
            <input type="text" name="correo" maxlength="50" size="50" required value="<?php echo $ctacorreo;?>">
<!--                <span class="form_hint">Formato correcto:  "ejemplo@hotmail.com"</span>
-->            </li>
 
            <li align='center'>
           <input type="text" name="telefono" readonly="t" value="<?php echo $telefono;?>">
<!--                <span class="form_hint">Formato correcto:  "ejemplo@hotmail.com"</span>
-->            </li>
            <li>
 
            <li align='center'>
          <textarea name= "mensaje_txa" cols="40" rows="6" placeholder="Ingresa un mensaje (opcional)" required> </textarea>
                  <span class="form_hint">Formato correcto: "Mensaje"</span>
            </li>
 
            <li align='center'>
                <button class="submit" type='submit' value='Enviar formulario' title="Enviar Mensaje">
		   <img src='imagenes/sobre.gif' heigth='50' width='50' border="0"></button>
            </li>
</ul>
 
<!--  <input type="submit" name="enviar_btn" value="Enviar"/><br/>
-->  <?php
  error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
	if(isset($_GET["respuesta"])){
	   echo "<span>".$_GET["respuesta"] ."</span>";
 
	}
 
  ?>
 
</form>
</body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
set_time_limit(500);
//ini_set('max_execution_time', 300); //300 seconds = 5 minutes
/////////Codigo para enviar correos a un solo destinatario.
require("PHPMailer-master/class.phpmailer.php");
require("PHPMailer-master/class.smtp.php");
//error_reporting(E_ALL ^ E_NOTICE);
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
$de = $_POST["de_txt"];
$para = $_POST["correo"];
$asunto = $_POST["asunto_txt"];
$addcco = $_POST["cco_txt"];
$archivo = $_FILES["archivo_fls"]["tmp_name"];
//$adjunto = chunk_split(base64_encode(file_get_contents($archivo)));
$destino = $_FILES["archivo_fls"]["name"];
$mensaje = $_POST["mensaje_txa"];
copy($_FILES["archivo_fls"]["tmp_name"],$_SERVER['DOCUMENT_ROOT']."/archivos/".$_FILES["archivo_fls"]["name"]);
copy($_FILES["archivo_fls"]["tmp_name"],"archivos/".$_FILES["archivo_fls"]["name"]);
$smtp=new PHPMailer();
# Indicamos que vamos a utilizar un servidor SMTP 
$smtp->IsSMTP();
# Definimos el formato del correo con UTF-8 
$smtp->CharSet="UTF-8";
//$smtp->SMTPDebug = 1;
# autenticación contra nuestro servidor smtp
$smtp->SMTPAuth = true; // enable SMTP authentication
$smtp->SMTPSecure = "tls";
$smtp->Host = "smtp.live.com"; // sets MAIL as the SMTP server
$smtp->Username = $de; // MAIL username
$smtp->Password = "TUPASSWORD"; // MAIL password
$smtp->Port = 587;
# datos de quien realiza el envio
$smtp->From = $de; // from mail
$smtp->FromName = "TUNOMBRE"; // from mail name
# Indicamos la dirección donde enviar el mensaje
$para1= $para;
$nameTo=$para1;
$smtp->AddAddress($para1,utf8_decode($nameTo));
//$smtp->AddBCC($addcco,$nameTo);
$smtp->Subject = $asunto;
$smtp->Body = $mensaje;
$smtp->WordWrap = 50;
//$smtp->Timeout=50;
$smtp->IsHTML(true);
$smtp->MsgHTML($mensaje);//
$smtp->AddAttachment($_FILES["archivo_fls"]["tmp_name"],$_FILES["archivo_fls"]["name"]);
   if (!$smtp->Send())
      {
  	    $respuesta ="El mensaje no se pudo enviar";
		$respuesta .="Error: " .$mail->ErrorInfo;
      }
   else
      {
        $respuesta ="El mensaje ha sido enviado";
      }
   header("Location:especialidad.php?respuesta=$respuesta");
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Restablecer contraseña mediante correo

Publicado por zendi (1056 intervenciones) el 16/09/2016 14:16:50
Disculpa te envié un codigo que no sirve, desecha el anterior codigo
este es el codigo correcto:

Avisanos si te funcionó

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
$conexion = pg_connect("host=localhost port=5432 dbname=pediatria user=postgres password=movilnet");
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
require("PHPMailer-master/class.phpmailer.php");
require("PHPMailer-master/class.smtp.php");
$email = $_POST['email'];
$e_mail="SELECT email FROM usuarios WHERE email = '$email'";
$res = pg_query($conexion,$e_mail);
if(pg_num_rows($res)>0)
 {
     $cadena = '0123456789';
  	 $passw ='';
	 $lng_cadena = strlen($cadena);
	 $longitud = 6;
	 	for($x=1;$x<=$longitud;$x++)
		{
				$aleatorio = mt_rand(0,$lng_cadena-1);
				$passw .= substr($cadena,$aleatorio,1);
				$contrasena = "UPDATE usuarios SET usuario_pass = '$passw' WHERE email = '$email'";
				$actualiza = @pg_query($conexion,$contrasena);
				///////
				$smtp=new PHPMailer();
				$smtp->IsSMTP();
				# Definimos el formato del correo con UTF-8
				$smtp->CharSet="UTF-8";
				$smtp->SMTPDebug = 0;
				# autenticación contra nuestro servidor smtp
				$smtp->SMTPAuth = true; // enable SMTP authentication
				$smtp->SMTPSecure = "tls";
				$smtp->Host = "smtp.live.com"; // sets MAIL as the SMTP server
				$smtp->Username = 'tucuentacorreo@hotmail.com'; // MAIL username
				$smtp->Password = "tupassword"; // MAIL password
				$smtp->Port = 587;
                $smtp->SetFrom('tucuentacorreo@hotmail.com');
            	$smtp->From = "tucuentacorreo@hotmail.com";
				$smtp->FromName = "Alejandro"; // from mail name
				# Indicamos la dirección donde enviar el mensaje
				$smtp->AddAddress($email);
  		        $smtp->Subject = "Nueva CONTRASEÑA";
				//$smtp->Subject = $passw; 
			    $smtp->Body = $passw;
				$smtp->WordWrap = 50;
				$smtp->Timeout=50;
				$smtp->IsHTML(true);
                $smtp->MsgHTML($passw);
 
     }
				   if (!$smtp->Send())
					  {
						$respuesta ="El mensaje no se pudo enviar";
					echo $respuesta .="Error: " .$smtp->ErrorInfo;
					  }
				   else
					  {
						  echo "<script type='text/javascript'>
						 alert('Se ha enviado UNA NUEVA CONTRASEÑA');
						 window.location='passw.php';
						 </script>";
					  }
/////////////
}
else
{
   	 echo' <script language="javascript">alert("Atencion, su correo no existe");</script> ';
     echo "<script>location.href='passw.php'</script>";
 
}
 
 
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restablecer contraseña mediante correo

Publicado por Stark1407 (5 intervenciones) el 16/09/2016 14:58:11
Primero de todo muchas gracias por contestar.

Voy un poco perdido con este código ¿que lo tengo que poner en la página donde el cliente le da a la URL del correo enviado?

Seria genial que cuando este en la página que se le ha enviado inserte su password nueva y se actualice en la BBDD encriptado en md5.

Yo para los correos uso la funcion mail() y lo verifico con el programa smtp4dev.

Lo dicho muy agradecido y espero poder resolver este problema que me lleva de loco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restablecer contraseña mediante correo

Publicado por Stark1407 (5 intervenciones) el 16/09/2016 18:38:02
Hoal Zendi, quería informarte que ya lo he conseguido.

Muchísimas gracias por tu atención.

Un abrazo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 557
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Restablecer contraseña mediante correo

Publicado por zendi (1056 intervenciones) el 17/09/2016 02:50:19
Bueno olvidate de la funcion mail().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar