miércoles, 1 de febrero de 2017

Php enviar formulario por email

En este script vamos a ver cómo nos envía un mensaje de agradecimiento, vía mail, un usuario registrado de nuestra web, cumplimentado un sencillo formulario.
Posteriormente podréis modificarlo a vuestro gusto de forma muy sencilla.
Comenzaremos por establecer conexión con la bbdd, la verificación del nivel del usuario y permitir su acceso.
Vemos como en la página de inicio de nuestra web creamos las variables de sesión de este usuario.
Continuamos con la lógica de funcionamiento del script, la validación de los datos del formulario, la función que contiene el formulario y el procesado del mismo si no existen errores.
El campo texto contiene un contador de caracteres en java script que os recomiendo lo incluyáis en el header del html.
Por último un cierre de sesión.
La función desconexión mata las variables de sesión.
Deseo que os sea muy útil.

<?php
// Inicio de sesion obligatorio.
session_start();

// LLamamos al archvo que contiene el html y css.   
    require 'header.php';

// Llamamos al archivo de conexiones.
        require '../Conections/conection.php';

/* Establecemos la conexion con el servidor y a la bbdd. */
    $db = mysqli_connect($db_host,$db_user,$db_pass,$db_name);
    if (!$db){ die ("Es imposible conectar con la bbdd ".$db_name."<br/>".mysqli_connect_error());
                }

///////////////////////////////////////////////////////////////////////////////////////
/* ESTABLECEMOS LA VARIABLES DE SESION.
ANTERIORMENTE EN LA PÁGINA DE ACCESO HEMOS ESTABLECIDO LAS VARIABLES DE SESIÓN PARA ESTE USUARIO.
*/
///////////////////////////////////////////////////////////////////////////////////////

    /* Pasamos la sentencia Sql a la funcion mysql_query() para recoger los datos,*/
       
    $sql =  "SELECT * FROM `usuarios` WHERE `Usuario` = '$_POST[Usuario]' AND `Password` = '$_POST[Password]'";
   
    $q = mysqli_query($db, $sql);

    /* RECOGEMOS LOS VALORES DE LA CONSULTA EN UN ARRAY ASOCIATIVO $row;
        Serían $row['id']; $row['acceso']; $row['user']; $row['pass'], en este caso,
        O cualquier campo de la tabla consultada. */
   
    $row = mysqli_fetch_assoc($q);
   
    /* Asignamos los valores a las variables de sesion. */

    $_SESSION['ID'] = $row['ID'];
    $_SESSION['Nivel'] = $row['Nivel'];
    $_SESSION['Nombre'] = $row['Nombre'];
    $_SESSION['Apellidos'] = $row['Apellidos'];
    $_SESSION['Nacimiento'] = $row['Nacimiento'];
    $_SESSION['Email'] = $row['Email'];
    $_SESSION['Usuario'] = $row['Usuario'];
    $_SESSION['Password'] = $row['Password'];
    $_SESSION['Pais'] = $row['Pais'];
    $_SESSION['Localidad'] = $row['Localidad'];
    $_SESSION['Visitas'] = $row['Visitas'];

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

/* LÓGICA DEL SCRIPT:
Le decimos que si $_POST['oculto'], ejecute el primer if y si no el denegación de acceso. */

if ((trim($_SESSION['Nivel']) == 'User')){
   
/* Si el nivel de acceso es correcto. */
   
                     print("<font color='#139174'>Hola ".$_SESSION['Nombre']."</font>.");
                               
        if($_POST['oculto']){
               
/* Iniciamos el segundo if anidado en el primero. 
La variable $form_errors recoge el valor de la funcion validate_form(); 
Validamos el formulario, si se valida si errores procesamos los datos y si no, imprime el formulario de nuevo con los valores de la variable $form_errors; */
        if($form_errors = validate_form()){
            print("<table align='center'>
                        <tr>
                            <td>
                                <font color='#FF0000'>
                                    No se ha enviado el formulario.
                                </font>
                            </td>
                        </tr>
                    <table>
                            ");
            print_form($form_errors);

                    } else { process_form();
                                           
                print("<table align='center'>
                            <tr>
                                <td>
                                    <font color='#0080C0'>
                                        SE HA PROCESADO CORRECTAMENTE.
                                    </font>
                                </td>
                            </tr>
                        <table");
                        }
                   
                    } else { print_form();}
/*    Si no se cumple nada de lo anterior se imprime de nuevo el formulario, en blanco. 
Cerramos el primer if.
Y si el acceso no es autorizado nos advierte de la restricción de acceso */
           
                    } else {
                   
                        print("<table align='center' style=\"margin-top:200px;margin-bottom:200px\">
                                    <tr align='center'>
                                        <td>
                                            <font color='red'>
                                                <b>
                                                    ACCESO RESTRINGIDO.
                                                <br/><br/>
                                                    CONSULTE SUS PERMISOS ADMINISTRATIVOS.
                                            </font>
                                        </td>
                                    </tr>
                                </table>");
                            }

/* DESCONEXIÓN. MATAMOS LA VARIABLES DE SESIÓN. */

if($_POST['cerrar']){
   
    unset($_SESSION['ID']);
    unset($_SESSION['Nivel']);
    unset($_SESSION['Nombre']);
    unset($_SESSION['Apellidos']);
    unset($_SESSION['Nacimiento']);
    unset($_SESSION['Email']);
    unset($_SESSION['Usuario']);
    unset($_SESSION['Password']);
    unset($_SESSION['Pais']);
    unset($_SESSION['Localidad']);
   
    print("Se ha cerrado la sesión.<br/><br/>");
        }

/////////////////////////////////////////////////////////////////////////////////////////
/* Esta función valida el formulario */
/////////////////////////////////////////////////////////////////////////////////////////

 function validate_form(){
   
/* El array $error se inicia con un valor vacio, sin mensajes de error */
     $errors = array();

/* Validamos el campo Texto */

    if(strlen(trim($_POST['Texto']))==0){
        $errors [] = "<td width=80px><font color='red'>* Texto</font></td>
                      <td widht=250px>Este campo esta vacio</td>";
        }

    elseif(strlen(trim($_POST['Texto'])) <20){
        $errors [] = "<td width=80px><font color='red'>* Texto</font></td>
                      <td width=250px>Escriba más de veinte caractéres</td>";
        }
       
    elseif(!preg_match('/^\b[^#$<>?;]+$/',$_POST['Texto'])){
         $errors [] = "<td width=80px><font color='red'>* Texto</font></td>
                        <td width=330px>Estos carácteres no están permitidos. # $ < > ? ; </td>";
        }
   
/* La funcion validate_form() devuelve el valor del array $errors; */   
   
         return $errors;
             }

///////////////////////////////////////////////////////////////////////////////////////////////////
/*
     print_form(); Imprime el formulario para ser cumplimentado,    le pasamos $errors; con un valor vacio,
    $defaults; para valores por defecto
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
   
 function print_form($errors=''){

/* Pasamos valores por defecto al formulrio, y devuelve los valore que escribimos. */
    if ($_POST['oculto']){
        $defaults = $_POST;
       
        if(!preg_match('/^\b[^#$<>?;]+$/',$_POST['Texto'])){
           
            $defaults['Texto'] = '';
           
            }
                } else {    $defaults = array (    'Email' => '',
                                                'Asunto' => 'Agradecimientos Tutoriales y Cursos.',
                                                'Nombre' => '',
                                                'Apellidos' => '',
                                                'Texto' => '',
                                                                 );   
                            }
                                                                   
/* Si se pasan errores se imprimen en una tabla, los errores se recogen del array $errors en la funcion validate_form(). */    
       
    if($errors){    print("<table style=\"margin-top:6px; border:0px\">
                    <tr>
                        <td colspan='2'>
                            <font color='red'><b>Solucione estos errores:</b></font>
                        </td>
                    </tr>
                            ");
            for($a=0; $c=count($errors), $a<$c; $a++){
                print("<tr>"
                            .$errors[$a].
                       "</tr>"
                        );
                }
            print("</table>");
        }
   
/* Se imprime el formulario.*/

     print("<table align='center' style=\"margin-top:40px;margin-bottom:40px\">
   
                <form name='form1' method='post' action='$_SERVER[PHP_SELF]'>

    <!-- PASAMOS LOS VALORES POR DEFECTO -->
   
                        <input name='Email' type='hidden' value='".$_SESSION['Email']."' />
                        <input name='Asunto' type='hidden' value='".$defaults['Asunto']."' />
                        <input name='Nombre' type='hidden' value='".$_SESSION['Nombre']."' />
                        <input name='Apellidos' type='hidden' value='".$_SESSION['Apellidos']."' />   
                                   
                 <tr>
                    <th colspan='2' class='BorderInf'>
                        Agradecimientos Tutoriales y Cursos.
                    </th>
                </tr>
               
                <tr>
                    <td colspan='2'>");
                   
    ?>
<!-- COMO PODEMOS OBSERVAR EL CAMPO TEXTO TIENE UN CONTADOR DE CARACTERES, OS DEJO EL CÓDIGO JAVA SCRIPT DEL CONTADOR PARA QUE LO INCLUYÁIS EN EL HEADER DEL HTML.
TAMBIÉN LO TENÉIS COMENTADO.
-->   
   
<script type="text/JavaScript">
<!--
// Esta función limita el número de carácteres del text area de comentarios.
function limita(elEvento, maximoCaracteres) {
  var elemento = document.getElementById("mensaje");

  // Obtener la tecla pulsada
  var evento = elEvento || window.event;
  var codigoCaracter = evento.charCode || evento.keyCode;
  // Permitir utilizar las teclas con flecha horizontal
  if(codigoCaracter == 37 || codigoCaracter == 39) {
    return true;
  }

  // Permitir borrar con la tecla Backspace y con la tecla Supr.
  if(codigoCaracter == 8 || codigoCaracter == 46) {
    return true;
  }
  else if(elemento.value.length >= maximoCaracteres ) {
    return false;
  }
  else {
    return true;
  }
}

function actualizaInfo(maximoCaracteres) {
  var elemento = document.getElementById("mensaje");
  var info = document.getElementById("info");

  if(elemento.value.length >= maximoCaracteres ) {
    info.innerHTML = "Máximo "+maximoCaracteres+" caracteres";
  }
  else {
    info.innerHTML = "You can write up to "+(maximoCaracteres-elemento.value.length)+" additional characters";
  }
}
//-->
</script>

<!-- AHORA VAMOS CON EL CAMPO DE TEXTO -->                               

<textarea name='Texto' cols=56 rows=8  onkeypress="return limita(event, 400);" onkeyup="actualizaInfo(400)" id="mensaje">

<?php
print($defaults['Texto']);
?>

</textarea>
       
<!-- EL DIV NOS IMPRIME EL CONTADOR DE CARACTERES -->
            <div id="info" align="center" style="color:#0080C0;">Maximum 300 characters</div>
                               
   <?php
               print("           
                         </td>
                </tr>
                <tr>
                    <td align='right'>                   
                                <input type='submit' value='Enviar Agradecimientos' />
                    </td>
                                <input type='hidden' name='oculto' value=1 />
                    <td align='right'>                   
                                <input type='reset' value='Limpiar Formulario' />
                    </td>
                </tr>
               
                </table>
       
            </form>
                   
            <form name='Volver' method='post' action='../Tutoriales.php'>   
                <input name='Usuario' type='hidden' value='".$_SESSION['Usuario']."' />
                <input name='Password' type='hidden' value='".$_SESSION['Password']."' />
                <input type='submit' value='Volver a Tutoriales' />
                <input type='hidden' name='volver' value=1 />
            </form>           
                        "); /* Finaliza el print del formulario.*/

         } /* Finaliza la función print_form */

/////////////////////////////////////////////////////////////////////////////////////////////////
/*
    process_form() procesa los datos del formulario
     y se imprime y envia el resultado del mismo.
*/
/////////////////////////////////////////////////////////////////////////////////////////////////

 function process_form(){   

     $text_body = ' <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
                        <html>
                        <head>
                        <title>Untitled Document</title>
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                        <meta http-equiv="content-type" content="text/html" charset="utf-8" />
                        <meta http-equiv="Content-Language" content="es-es">
                        <META NAME="Language" CONTENT="Spanish">
                        </head>
                       
                        <body bgcolor="#D7F0E7">
                       
                        <STYLE>
                        body {
                            font-family: "Times New Roman", Times, serif;
                        }
                        body a {
                            text-decoration:none;
                        }
                        table a {
                            color: #666666;
                            text-decoration: none;
                            font-family: "Times New Roman", Times, serif;
                        }
                        table a:hover {
                            color: #FF9900;
                            text-decoration: none;
                        }
                        tr {
                            margin: 0px;
                            padding: 0px;
                        }
                        td {
                            margin: 0px;
                            padding: 6px;
                        }
                        th {
                            padding: 6px;
                            margin: 0px;
                            text-align: center;
                            color: #666666;
                        }
                       
                        </STYLE>
                       
    <table font-family="Times New Roman" width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
                          <tr>
                            <th colspan="3">'.$_POST['Asunto'].'</th>
                          </tr>
                            <tr>
                            <td align="right">Nombre:</td>
                            <td width="12">&nbsp;</td>
                            <td align="left">'.$_POST['Nombre'].'</td>
                          </tr>
                          <tr>
                            <td align="right">Apellidos:</td>
                            <td>&nbsp;</td>
                            <td align="left">'.$_POST['Apellidos'].'</td>
                          </tr>
                          <tr>
                            <td align="right">Email:</td>
                            <td>&nbsp;</td>
                            <td align="left">'.$_POST['Email'].'</td>
                          </tr>
                          <tr>
                            <th colspan="3">Mis Agradecimientos.</th>
                          </tr>
                          <tr>
                            <td align="left" colspan="3">'.$_POST['Texto'].'</td>
                          </tr>
                          <tr>
                              <td colspan="3" style="font-size:11px">
                                <b>AVISO LEGAL</b>
                                <br/>
Este mensaje y los archivos que en su caso lleve adjuntos son privados y confidenciales y se dirigen exclusivamente a su destinatario. Por ello, se informa a quien lo reciba por error de que la informaci&oacute;n contenida en el mismo es reservada y su utilizaci&oacute;n, copia odistribuci&oacute;n est&aacute; prohibida, por lo que, en tal caso, le rogamos nos lo comunique por esta misma v&iacute;a o por tel&eacute;fono al n&uacute;mero xxx xxx xxx de Espa&ntilde;a y proceda a borrarlo de inmediato.
JuanBarros.es advierte expresamente que el env&iacute;o de correos electr&oacute;nicos a trav&eacute;s de Internet no garantiza la confidencialidad de los mensajes ni su integridad y correcta recepci&oacute;n, por lo que JuanBarros.es no asume responsabilidad alguna en relaci&oacute;n con dichas circunstancias.
    <br/>
        Gracias.
    <br/>
    <br/>
         <b>DISCLAIMER</b>
    <br/>
This message and the attached files are private and confidential and intended exclusively for the addressee. As such, JuanBarros.es informs to whom it may receive it in error that it contains privileged information and its use, copy or distribution is prohibited. If it has been received by error, please notify us via e-mail or by telephone xxx xxx xxx Spain and delete it immediately.
JuanBarros.es expressly warns that the use of Internet e-mail neither guarantees the confidentiality of the messages nor its integrity and proper receipt, and ,therefore,
JuanBarros.es does not assume any responsibilities for those circumstances.
    <br/>
        Thank you.
                        <td>
                    </tr>   
                               
            </table>
        </body>
    </html>
        ';
           
    $headers = array ('From' => $_POST['Email'],
                      'Subject' => $_POST['Asunto']);
                     
        // datos del mensaje
       
        $destinatario= "juanbarrospazos@live.com";
        $titulo= $_POST['Asunto'];
        $responder= $_POST['Email'];
        $remite= $_POST['Email'];
        $remitente= $_POST['Nombre']." ".$_POST['Apellidos'];
        //sin tilde para evitar errores de servidor
       
                $separador = "_separador".md5 (uniqid (rand()));

        // cabeceras
       
                $cabecera = "Date: ".date("l j F Y, G:i")."\n";
                $cabecera .="MIME-Version: 1.0\n";
                $cabecera .="From: ".$remitente."<".$remite.">\n";
                $cabecera .="Return-path: ". $remite."\n";
                $cabecera .= "Reply-To: ".$remite."\n";
                $cabecera .="X-Mailer: PHP/". phpversion()."\n";
                $cabecera .= "Content-Type: multipart/mixed;"."\n";

                $cabecera .= " boundary=$separador"."\r\n\r\n";    /**/

                $texto_html ="\n"."--$separador"."\n";            /**/
                $texto_html .="Content-Type:text/html; charset=\"utf-8\""."\n";
                $texto_html .="Content-Transfer-Encoding: 7bit"."\r\n\r\n";
               
        // Añado la cadena que contiene el mensaje
                $texto_html .= $text_body;
               
        /* Le pasamos a la variable $mensaje el valor de $texto_html */
                $mensaje= $texto_html;

               
        /* SOLO PARA ARCHIVOS ADJUNTOS.
                Adjuntamos una imagen en el mensaje.
                $adj1 = "\n"."--$separador"."\n";
               
                $adj1 .="Content-Type: image/gif;";
                $adj1 .=" name=\"Degra3A.gif\""."\n";
                $adj1 .="Content-Disposition: attachment; ";
                $adj1 .="filename=\"Degra3A.gif\""."\n";
                $adj1 .="Content-Transfer-Encoding: base64"."\r\n\r\n";
               
                $fp = fopen("Degra3A.gif", "r");
                $buff = fread($fp, filesize("Degra3A.gif"));
                fclose($fp);
               
                $adj1 .=chunk_split(base64_encode($buff));
        */
                               
/* Le pasamos a la variable $mensaje el valor de $texto_html y $adj1, que es la imagen. $mensaje= $texto_html.$adj1; */
               
    if( mail($destinatario, $titulo, $mensaje, $cabecera)){

    print("<table align='center' style=\"margin-top:40px\">
                <tr>
                    <td align='center'>
                        <font color='#0080C0'>
                            SUS AGRACECIMIENTOS HAN SIDO ENVIADOS.
                                <br/>
                            MUCHAS GRACIAS.
                        </font>
                    </td>
                </tr>
            </table>
                        ");
                            }else{
        print("<table align='center' style=\"margin-top:120px;margin-bottom:120px\">
                <tr>
                    <td align='center'>
                        <font color='#FF0000'>
                            EL MENSAJE NO HA PODIDO ENVIARSE.
                                <br/>
                            LO SENTIMOS MUCHO.
                                <br/>
                            MUCHAS GRACIAS.
                        </font>
                    </td>
                </tr>
                    </table>
        </body>
    </html>
            ");
                } /*Fin del if del mail*/
                                                       
     }    /* Fin funcion process_form. */
           
/////////////////////////////////////////////////////////////////////////////////////////////////
/* FUNCION CERRAR SESION. */
/////////////////////////////////////////////////////////////////////////////////////////////////
   
    function desconexion(){
       
            print("<table align='center' style='border:0px'>
                        <tr>
                            <td>
                                <form name='cerrar' action='../Tutoriales.php' method='post'>
                                    <input type='submit' value='Cerrar Sesion' />
                                    <input type='hidden' name='cerrar' value=1 />
                                </form>   
                            </td>
                        </tr>
                    </table>");
   
            } /* Fin funcion dexconecxion. */
   
/////////////////////////////////////////////////////////////////////////////////////////////////

    require 'footer.php';

?>

No hay comentarios:

Publicar un comentario

Gracias por vuestros aportes.