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.