No es tan simple como crees. De todas formas te lo haré de forma rápida y sin detallar mucho
Código PHP:
<?php
class Account {
//[...]
public static function valid_email($email){
if(preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})$/', $email)){
return true;
}else{
return false;
}
}
public static function email_exists($email){
/*
Aqui iría la consulta a tu base de datos de usuarios comprobando que exista algun usuario con ese email.
Algo como:
*/
$q = mysql_query("SELECT email FROM users WHERE email='".mysql_real_escape_string($email)."'");
if(mysql_num_rows($q) == 1){
return true;
}
return false;
}
public static function send_mail($to,$subject,$message){
#SMTP: Librería para enviar correos electrónicos en PHP
require('smtp/class.phpmailer.php');
require('smtp/class.smtp.php');
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = ""; //Servidor SMTP
$mail->From = ""; //Correo electrónico enviante
$mail->FromName = "";//Nombre enviante
$mail->Subject = $subject;
$mail->MsgHTML($message);
$mail->AddAddress($to, ""); //La segunda opción es para especificar el "nombre" del destinatario. Pues poner su nombre de usuario.
$mail->SMTPAuth = true;
$mail->Username = "";//Correo electrónico enviante
$mail->Password = "";//Contraseña correo electrónico enviante
if(!$mail->Send()) {
return false;
}else{
return true;
}
}
public static function send_forgotpassword_email($email){
$email = trim($email);
if(empty($email))
return array(false,"Debes rellenar todos los campos");
if(!self::valid_email($email))
return array(false,"El correo electrónico especificado es inválido");
if(!self::email_exists($email))
return array(false,"El correo electrónico especificado no corresponde a ningún usuario");
//código para cambiar su contraseña. Si no te quieres complicar puede ser su email encriptado:
$token = md5($email); //md5() -> 32 caracteres : numero hex
$subject = sprintf("%s: Recuperar Contraseña","MIPAGINA"); //MIPAGINA: Recuperar Contraseña
$message = sprintf("Hola %s,<br/>", "nombre_de_usuario");
$message .= sprintf("Has solicitado recuperar tu cuenta de %s, para hacerlo necesitarás el siguiente código:<br/> %s<br/>","MIPAGINA",$token);
$message .= "Un saludo.";
if(self::send_mail($email,$subject,$message)){
return array(true,"Mensaje enviado con éxito. Comprueba tu bandeja de entrada");
}else{
return array(false,"Ha ocurrido un error. Por favor, inténtalo de nuevo.");
}
}
public static function encrypt($password){
return Sha1(md5($password)); //O la forma que utilices para encryptar contraseñas.
}
public static function change_password($token,$pass1,$pass2,$email){
if($pass1!=$pass2)
return array(false,"La contraseña y su verificación no coinciden");
if($token!=md5($_POST['fgtpw_email']))
return array(false,"El token introducido es inválido");
if(mysql_query("UPDATE users SET password='".self::encrypt($pass1)."' WHERE email='".mysql_real_escape_string($email)."'")){ //mysql_real_escape_string() no sería necesario si pasas el email de forma segura
return array(true,"Contraseña cambiada con éxito.");
}else{
return array(false,"Ha ocurrido un error. Por favor, inténtalo de nuevo.");
}
}
}
if(isset($_POST['fgtpw_token']) && isset($_POST['fgtpw_pw1']) && isset($_POST['fgtpw_pw2']) && isset($_POST['fgtpw_email'])){
$result = Account::change_password($_POST['fgtpw_token'],$_POST['fgtpw_pw1'],$_POST['fgtpw_pw2']);
if($result[0]){
echo $result[1];
}else{
echo "Error:".$result[1];
}
}else if(isset($_POST['fgtpw_email'])){
$result = Account::send_forgotpassword_email($_POST['fgtpw_email']);
if($result[0]){
//Correo enviado, Nuevos datos (?)
?>
<div id="result"><?php echo $result[1];?></div>
<form action="#" method="post">
<input type="text" placeholder="Token" name="fgtpw_token" />
<input type="password" placeholder="Nueva Contraseña" name="fgtpw_pw1" />
<input type="password" placeholder="Repite tu Contraseña" name="fgtpw_pw2" />
<input type="hidden" name="fgtpw_email" value="<?php echo $_POST['fgtpw_email'];?>" /> <!-- Esto no es una buena forma de pasar el email, esto es solo un ejemplo, podrias hacerlo con una variable de sesión $_SESSION -->
<input type="submit" value="Enviar" />
</form>
<?php
}else{
//Error enviando el mensaje
?>
<div id="result">Error: <?php echo $result[1]; ?></div>
<form action="#" method="post">
<input type="text" placeholder="Correo Electrónico" name="fgtpw_email" />
<input type="submit" value="Enviar" />
</form>
<?php
}
}else{
//Main Screen
?>
<form action="#" method="post">
<input type="text" placeholder="Correo Electrónico" name="fgtpw_email" />
<input type="submit" value="Enviar" />
</form>
<?php
}
?>
Seguramente no es ni la mejor manera ni la más optima y habré pasado por alto alguna cosa pero no concretas demasiado, lo he hecho de forma rápida y para lo que pagas... jajajaja
Un saludo, espero que te sirva al menos como algo orientativo