Formulario de Contacto con Captcha usando PHP y Bootstrap 3

Compartir

formulario_contacto_bs3A continuación les muestro un formulario de contacto bootstrap 3  usando SecureImage Captcha. Enviando mensajes a una dirección de correo electrónico específica, para el ejemplo lo haremos usando la función mail de php.

DEPENDENCIAS

PHP

  • version > 5.2.0 (con la biblioteca gd habilitado)
  • SecureImage Captcha Captcha (incluido en library/vender/securimage/**)

HTML/JS

Vamos a empezar con el código HTML del archivo index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="A contact form using the Bootstrap 3 framework.">
    <meta name="author" content="">
    <link rel="shortcut icon" href="../../assets/ico/favicon.png">
    <title>Bootstrap 3 Formulario de Contacto con CAPTCHA</title>
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" >
    <link rel="stylesheet" href="assets/vender/intl-tel-input/css/intlTelInput.css">
    <!-- EXTRACT ADDITIONAL STYLING HERE =======> -->
    <style>
      .container {
        width: auto;
        max-width: 800px;
      }
      .form-group {
        margin-bottom: 8px;
      }
      #feedbackForm {
        font-size: 12px;
      }
    </style>
    <!-- <======= UP TO HERE -->
    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="assets/vender/bootstrap/assets/js/html5shiv.js"></script>
      <script src="assets/vender/bootstrap/assets/js/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <!-- EXTRACT FORM HERE =======> -->
    <div class="container">
      <div id="contact_form" class="row">
        <div class="col-md-12">
          <h2>Contáctenos</h2>
          <form role="form" id="feedbackForm">
            <div class="form-group">
              <label class="control-label" for="name">Nombres *</label>
              <div class="input-group">
                <input type="text" class="form-control" id="name" name="name" placeholder="Introduzca su nombre" />
                <span class="input-group-addon"><i class="glyphicon glyphicon-unchecked form-control-feedback"></i></span>
              </div>
              <span class="help-block" style="display: none;">Por favor, escriba su nombre.</span>
            </div>

<div class="form-group"> <label class="control-label" for="email">Motivo de Contacto*</label> <select name="reason" class="form-control"> <option value="Consulta General">Consulta General</option> <option value="Realizar Pedido">Realizar Pedido</option> <option value="Informe un problema">Informe un problema</option> </select> <span class="help-block" style="display: none;">Por favor, introduce una dirección de correo electrónico válida.</span> </div> <div class="form-group"> <label class="control-label" for="email">Dirección de Correo Electrónico *</label> <div class="input-group"> <input type="email" class="form-control" id="email" name="email" placeholder="Introduzca su correo electrónico" /> <span class="input-group-addon"><i class="glyphicon glyphicon-unchecked form-control-feedback"></i></span> </div> <span class="help-block" style="display: none;">Por favor, introduzca una dirección de correo electrónico válida.</span> </div> <div class="form-group"> <label class="control-label" for="message">Mensaje *</label> <div class="input-group"> <textarea rows="5" cols="30" class="form-control" id="message" name="message" placeholder="Introduzca su mensaje" ></textarea> <span class="input-group-addon"><i class="glyphicon glyphicon-unchecked form-control-feedback"></i></span> </div> <span class="help-block" style="display: none;">Por favor, introduzca un mensaje.</span> </div> <img id="captcha" src="library/vender/securimage/securimage_show.php" alt="CAPTCHA Image" /> <a href="#" onclick="document.getElementById('captcha').src = 'library/vender/securimage/securimage_show.php?' + Math.random(); return false" class="btn btn-info btn-sm">Mostrar una imagen diferente</a><br/> <div class="form-group" style="margin-top: 10px;"> <label class="control-label" for="captcha_code">Texto dentro de la Imagen *</label> <div class="input-group"> <input type="text" class="form-control" name="captcha_code" id="captcha_code" placeholder="Por razones de seguridad, por favor ingrese el código que aparece en el cuadro." /> <span class="input-group-addon"><i class="glyphicon glyphicon-unchecked form-control-feedback"></i></span> </div> <span class="help-block" style="display: none;">Por favor introduce el código que aparece en la imagen.</span> </div> <span class="help-block" style="display: none;">Por favor ingrese el código de la seguridad.</span> <button type="submit" id="feedbackSubmit" class="btn btn-primary btn-lg" data-loading-text="Enviando..." style="display: block; margin-top: 10px;">Enviar comentarios</button> </form> </div><!--/span--> </div><!--/row--> <hr> </div><!--/.container--> <!-- <======= UP TO HERE --> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> <script src="assets/vender/intl-tel-input/js/intlTelInput.min.js"></script> <script src="assets/js/contact-form.js"></script> </body> </html>

Nuestro código javascript "contact-form.js" se ve algo así como lo siguiente:

(function () {
  var contactFormUtils = {
    isValidEmail: function (email) {
      var regex = /^([a-zA-Z0-9_.+-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
      return regex.test(email);
    },
    clearErrors: function () {
      $('#emailAlert').remove();
      $('#feedbackForm .help-block').hide();
      $('#feedbackForm .form-group').removeClass('has-error');
    },
    clearForm: function () {
      $('#feedbackForm .glyphicon').removeClass('glyphicon-check').addClass('glyphicon-unchecked').css({color: ''});
      $('#feedbackForm input,textarea').val("");
    },
    addError: function ($input) {
      var parentFormGroup = $input.parents('.form-group');
      parentFormGroup.children('.help-block').show();
      parentFormGroup.addClass('has-error');
    },
    addAjaxMessage: function(msg, isError) {
      $("#feedbackSubmit").after('<div id="emailAlert" class="alert alert-' + (isError ? 'danger' : 'success') + '" style="margin-top: 5px;">' + $('<div/>').text(msg).html() + '</div>');
    }
  };

$(document).ready(function() { if ($("#phone").intlTelInput) { $("#phone").intlTelInput({validationScript: "assets/vender/intl-tel-input/js/isValidNumber.js"}); $(".intl-tel-input.inside").css('width', '100%'); }

$("#feedbackSubmit").click(function() { var $btn = $(this); $btn.button('loading'); contactFormUtils.clearErrors();

//do a little client-side validation -- check that each field has a value and e-mail field is in proper format var hasErrors = false; $('#feedbackForm input,#feedbackForm textarea').not('.optional').each(function() { var $this = $(this); if (($this.is(':checkbox') && !$this.is(':checked')) || !$this.val()) { hasErrors = true; contactFormUtils.addError($(this)); } }); var $email = $('#email'); if (!contactFormUtils.isValidEmail($email.val())) { hasErrors = true; contactFormUtils.addError($email); }

var $phone = $('#phone'); if ($phone.val() && $phone.intlTelInput && !$phone.intlTelInput("isValidNumber")) { hasErrors = true; contactFormUtils.addError($phone.parent()); }

//if there are any errors return without sending e-mail if (hasErrors) { $btn.button('reset'); return false; }

//send the feedback e-mail $.ajax({ type: "POST", url: "library/sendmail.php", data: $("#feedbackForm").serialize(), success: function(data) { contactFormUtils.addAjaxMessage(data.message, false); contactFormUtils.clearForm(); //get new Captcha on success $('#captcha').attr('src', 'library/vender/securimage/securimage_show.php?' + Math.random()); }, error: function(response) { contactFormUtils.addAjaxMessage(response.responseJSON.message, true); }, complete: function() { $btn.button('reset'); } }); return false; }); $('#feedbackForm input, #feedbackForm textarea').change(function () { var checkBox = $(this).siblings('span.input-group-addon').children('.glyphicon'); if ($(this).val()) { checkBox.removeClass('glyphicon-unchecked').addClass('glyphicon-check').css({color: 'green'}); } else { checkBox.removeClass('glyphicon-check').addClass('glyphicon-unchecked').css({color: ''}); } }); }); })();

El script PHP "sendmail.php" para enviar el correo electrónico se verá a continuación:

<?php
	session_start();

//añadirle tu dirección de correo electrónico aquí define("MY_EMAIL", "ejemplo@ejemplo.com");

/** * Establece la cabecera de error y la respuesta de mensaje de error JSON.

*/ function errorResponse ($messsage) { header('HTTP/1.1 500 Error Interno del Servidor'); die(json_encode(array('message' => $messsage))); }

/** * Funcion para establecer el cuerpo del mensaje */ function setMessageBody ($name, $message) { $message_body = "Nombre: " . $name."nn"; $message_body .= "Comentario:n" . nl2br($message); return $message_body; } $email = $_POST['email']; $message = $_POST['message']; header('Content-type: application/json'); //Pequeña validación. esto fue validado en el lado del cliente también if (empty($email) || empty($message)) { errorResponse('Correo electrónico o mensaje está vacío.'); } //hacer verificación Captcha, asegúrese de que el remitente no es un robot:)... require './vender/securimage/securimage.php'; $securimage = new Securimage(); if (!$securimage->check($_POST['captcha_code'])) { errorResponse('Código de Seguridad no válido'); }

//tratar de enviar el mensaje usando la funcion mail de php if(mail(MY_EMAIL, $_POST['reason'], setMessageBody($_POST["name"], $message), "From: $email")) { echo json_encode(array('message' => 'Su mensaje se ha enviado correctamente.')); } else { header('HTTP/1.1 500 Error Interno del Servidor'); echo json_encode(array('message' => 'Error inesperado al intentar enviar correo electrónico.')); } ?>

Para conseguir esto que esto funcione  con tu sitio web, debes cambiar el valor de la constante de MY_EMAIL definido en la parte superior del archivo anteriorHay un par de funciones definidas en la parte superior para generar una respuesta de error y establecer el cuerpo del mensaje del correo electrónico. Una vez más, hacemos una validación sencilla para asegurarse que se haya introducido un correo electrónico y en mensaje. También comprobamos el Captcha para asegurarse de que el código introducido coincide con la imagen. Si no lo hace, nosotros respondemos con un error y no se envía el mensaje. Por último, se intenta enviar el mensaje.

Ahora sólo queda probar el funcionamiento del código :-)

Bibliografía consultada:

  1. Bootstrap3-contact-form
  2. SecureImage Captcha
  3. Bootstrap 3
  4. PHP mail

[sociallocker] Demostración en vivo Descargar archivos [/sociallocker]

Obed Alvarado

Sobre el autor

Artículo redactado por Obed Alvarado. Comparto experiencias prácticas sobre PHP, MySQL, aplicaciones web, instalación en hosting y herramientas para negocios.

Comentarios