Como hacer un formulario de contacto con PHP utilizando captcha
Luego del post de mnosh, se me vino a la cabeza postear un formulario de contacto en PHP que yo tenia, empleando su captcha, para asi ya de paso, dar un ejemplo de como incorporarlo a un formulario, y usarlo correctamente.
En la carpeta “contacto” tenemos los siguientes archivos:
- bauhs93.ttf
- contacto.php
- captcha.php (archivo de este post)
Vamos a usar una fuente nueva para nuestro captcha, asi que ya tenemos una linea que modificar en captcha.php.
Pero primero, vamos a ir con el codigo de contacto.php:
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 | <?php //iniciamos session para poder acceder a ella a la hora de comprobar el codigo del captcha session_start(); // $errores comienza en 0, se incrementaria si algo no va bien. $errores=0; // preparamos mensaje de salida como un string vacio, iremos agregando lineas a medida que vayamos encontrando errores. $errMessage=''; //Chequeamos si se ha enviado el formulario. if(isset($_POST['enviar'])){ //iniciamos y formateamos variables $nombre=isset($_POST['nombre'])? ucwords(strtolower(trim($_POST['nombre']))) : ''; $email=isset($_POST['email'])? $_POST['email'] : ''; $texto=isset($_POST['texto'])? $_POST['texto'] : ''; $captcha = isset($_POST['captcha'])? $_POST['captcha'] : ''; // usamos el filtro para validar emails if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ // si no es valido, sumamos 1 a la cantidad de errores, y le agregamos a errMessage // el error. $errores++; $errMessage.='el mail no parece valido<br />'; } // comprobamos que el nombre contenga solo letras if(!ereg('^[a-zA-Z]{3,40}$', $nombre)){ $errores++; $errMessage.='a escrito un nombre incorrecto<br />'; } // si el largo de la variable texto es mayor a 200... if(strlen($texto)>200 || empty($texto)){ // sumamos 1 a la cantidad de errores, y le agregamos a errMessage el error. $errores++; $errMessage.='comentario demasiado largo<br />'; } if($captcha != $_SESSION['cache_string']) { // sumamos 1 a la cantidad de errores y agregamos el tipo de error a errMessage $errores++; $errMessage.='captcha ingresado invalido <br />'; } // si no hay errores, entonces procedemos a armar, y enviar el mail.. if (!$errores) { // armamos los headers del mensaje... el from, y etc.. $headers = "From: ".$email." ".$nombre. " <" .$email. ">"; //armamos el cuerpo del mensaje $mensaje = "Administrador, han mandado un mail desde la web XXXXXXXX, el nombre del visitante es: {$nombre}, su email es: {$email} y el mensaje es el siguiente: \n\n {$texto}"; // @mail(...), devuelve true si la funcion no tiro ningun error (o sea, se mando el mail) // si tu hosting no tiene smpt, te dara el error del else if (@mail("matias.a18@gmail.com", "Asunto de nuestro mensaje", $mensaje, $headers)) { echo '<div class="sinerrores">Mensaje enviado satisfactoriamente</div>'; } else { // el mensaje no ha podido ser enviado, mostramos el texto en la clase error de la css // las razones por las que puede aparecer este mensaje es porque el puerto smpt no esta abierto // en el servidor. echo '<div class="error">El mensaje no ha podido ser enviado</div>'; } }else{ // como hubieron errores, los mostramos en la clase (definida en la .css) error. echo '<div class="error">' . $errMessage . '</div>'; } } ?> <div align="center"> <form method="POST" action="<?php echo $_SERVER['REQUEST_URI']; ?>"> <p>Nombre:</p> <p><input type="text" name="nombre" id="nombre"/></p> <p>Email:</p> <p><input type="text" name="email" id="email"/></p> <p>Mensaje:</p> <p><textarea name="texto" id="texto" rows="10" cols="30"></textarea></p> <p>Introduzca la siguiente cadena de texto: </p> <p><img src="captcha.php" /></p> <p><input size="5" type="text" name="captcha"/></p> <p><input type="submit" value="Enviar" id="enviar" name="enviar"/></p> </form> </div> |
Como podran ver, usamos el archivo captcha.php, aunque, le cambiamos algo del anterior codigo, en la linea 16, en vez de ponerle:
1 | $fontFile ="my_special_font.ttf"; |
Le ponemos:
1 | $fontFile ="bauhs93.ttf"; |
Y listo, si el mensaje ha sido enviado correctamente, deberiamos recibir esta notificacion:
“Mensaje enviado satisfactoriamente”
Si el SMTP de nuestro hosting no esta activado, nos deberia de mostrar este mensaje:
“El mensaje no ha podido ser enviado”
Y, si hubo algun error, podriamos recibir alguno de los siguientes mensajes:
“captcha ingresado invalido” y/o “comentario demasiado largo” y/o “a escrito un nombre incorrecto” y/o “el mail no parece valido”.
Y listo, tenemos nuestro formulario de contacto hecho.. y listo.
Cualquier duda, en los comentarios.