Primero que nada, lo mejor es hacer unos cambios al sistema de error. En vez de:
lo mejor es poner:
Igual abajo.
Código php:
Ver originalelseif(isset($_POST['email']) && empty($_POST['email'])) $error = 'Por favor escriba su email';
Así php primero vera si la variable está seteada y luego si está vacía. Tambié creo que el número secreto debería ser mas seguro, así que ambien le agregué el timestamp a la variable:
Código php:
Ver original//timestamp
$timestamp = time() + (7 * 24 * 60 * 60); //numero secreto
$numero_secreto = $timestamp.'-'.rand(10000, 90000); //fecha
Ahora si, seguimos. Yo siempre uso la librería
phpMailer para el envío de emails, pero como eso ya es mas complicado usaremos la funcion
mail() de php.
Debo recordarte que necesitas un servidor SMTP para poder enviar emails desde tu servidor, osea, que si no tienes instalado uno en tu servidor local no podrás probar este sistema. Si has contratado un servidor remoto lo más seguro tiene un servidor SMTP. Si es así mejor has las pruebas en ese servidor.
Ahora, Necesitaremos las siguientes variables:
Código php:
Ver original////// se envia el email
//email donde se enviara el mensaje
$hacia_email = $_POST['email'];
//email de donde sale el mensaje
//titulo del mensaje
$titulo_mensaje = 'Mensaje enviado desde mipagina.com';
//mensaje
$mensaje = "Para cambiar su password haga click aquí:<br />
<a href=\"http://mipagina.com/nuevo_pass.php?id=$numero_secreto\">http://mipagina.com/nuevo_pass.php?id=$numero_secreto</a><br />
";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: '.$email_desde."\r\n";
$headers .= 'Reply-To: '.$email_desde."\r\n";
En la variable '$email_desde' necesitas poner el email de donde quieres que salga el mensaje, el cual será el mismo al que se le podrá dar reply. También puedes cambiar el título del mensaje como el mensaje, pero necesitas enviar la dirección donde la persona cambiará su password. Entonces al final se envía el email. Si no se pudo enviar se muestra un error y si se pudo enviar le damos a la variable '$enviado' el valor de TRUE para no mostrar el formulario:
Código php:
Ver original//enviar email
if(mail($hacia_email, $titulo_mensaje, $mensaje, $headers)) $enviado = TRUE; else $error = 'Hubo un erro al enviar el mensaje.';
De nuevo, vas a recibir este error si no tienes un servidor SMTP instalado:
Código HTML:
Warning: mail() [function.mail]: Failed to connect to mailserve...
Ahora te dejo el código completo:
Código php:
Ver original//si se envia el formulario
if(isset($_POST['email']) && !empty($_POST['email'])){ //se regoge la variable POST
$colname_Recordset1 = "-1";
if (isset($_POST['email'])) { }
//recorset
$query_Recordset1 = sprintf("SELECT * FROM usuarios WHERE email = %s", GetSQLValueString
($colname_Recordset1, "text"));
//si el email existe en la base dedatos
if($totalRows_Recordset1 > 0){
//timestamp
$timestamp = time() + (7 * 24 * 60 * 60); //numero secreto
$numero_secreto = $timestamp.'-'.rand(10000, 90000); //fecha
//insert a la tabla del numero secreto
$insertSQL = sprintf("INSERT INTO recordar_pass (email_recordar_pass,codigo_recordar_pass,timestamp_recordar_pass,fecha_recordar_pass) VALUES (%s,%s,%s,%s)", GetSQLValueString($_POST['email'], "text"),
GetSQLValueString($numero_secreto, "int"),
GetSQLValueString($timestamp, "int"),
GetSQLValueString($fecha, "date"));
////// se envia el email
//email donde se enviara el mensaje
$hacia_email = $_POST['email'];
//email de donde sale el mensaje
//titulo del mensaje
$titulo_mensaje = 'Mensaje enviado desde mipagina.com';
//mensaje
$mensaje = "Para cambiar su password haga click aquí:<br />
<a href=\"http://mipagina.com/nuevo_pass.php?id=$numero_secreto\">http://mipagina.com/nuevo_pass.php?id=$numero_secreto</a><br />
";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: '.$email_desde."\r\n";
$headers .= 'Reply-To: '.$email_desde."\r\n";
//enviar email
if(mail($hacia_email, $titulo_mensaje, $mensaje, $headers)) $enviado = TRUE; else $error = 'Hubo un erro al enviar el mensaje.';
}
//si no existe
else $error = 'Este email no existe en la base de datos';
}
//si el formulario esta vacio
elseif(isset($_POST['email']) && empty($_POST['email'])) $error = 'Por favor escriba su email';
y el formulario con los cambios:
Código php:
Ver original<?php
//si se ha enviado el email
if($enviado != TRUE){
//si hay error se muestra
if(!empty($error)) echo $error; ?>
<form id="form1" name="form1" method="POST" action="">
<table border="0" cellpadding="5" cellspacing="1" bgcolor="#999999">
<tr>
<td bgcolor="#CCCCCC">email</td>
<td bgcolor="#FFFFFF"><input name="email" type="text" id="email" value="
<?php echo((isset($_POST["email"]))?
$_POST["email"]:"") ?>" /></td>
</tr>
<tr>
<td colspan="2" bgcolor="#FFFFFF"><div align="center">
<input type="submit" name="button" id="button" value="enviar" />
</div></td>
</tr>
</table>
</form>
<?php
}else{?>
<p>El mensaje ha sido enviado correctamente</p>
<?php } ?>
Lo que queda es hacer la página que recibe al usuario y donde puede cambiar su password. Te sugiero que si vas a enviar emails los envíes desde el domain que usas en el email de salida o habrá la posibilidad de que tu IP se incluido en alguna lista de spam.
Bueno, espero que puedas probar el código. Me dices si tienes algún problema