[SCRIPT] Formulario de contacto

Hola Comunidad,

a continuación les dejo el script que utilizo en mi sitio, es bastante sencillo y puede servir para ilustrar de forma básica el funcionamiento de este tipo de aplicaciones.

<?php
	
///////Configuración/////
$mail_destinatario = '[correo eliminado]'; // Tu correo
///////Fin configuración// 

// a continuacion procedemos a formular el script
if (isset ($_POST['enviar'])) { // le indicamos que mediante la funcion POST envíe la información
$headers .= "From: ".$_POST['email']. "rn";

/* ahora le decimos que si el correo es el que configuramos al principio del script, nos mande el asunto del mensaje, el nombre, el asunto y el mensaje */
if ( mail ($mail_destinatario, $_POST['asunto'], "Nombre: ".$_POST['nombre']." Asunto: ".stripcslashes ($_POST['asunto'])."n Mensaje :n ".stripcslashes ($_POST['mensaje']), $headers )) 

// imprimimos en pantalla que el mensaje se envió de manera exitosa
echo '

Su mensaje a sido enviado correctamente. Gracias por contactar con nosostros

'; 

// sino (else), le decimos que imprima un mensaje de error
else echo '

Error al enviar el formulario. Por favor, inténtelo de nuevo mas tarde.

'; } 

// este es el formulario de contacto en HTML implementado en php
echo '
<form action="?" method="post"> <label for="nombre">Nombre: </label>  
<input type="text" name="nombre" size="20" maxlength="80"><br> <label for="email">Email: </label>
<input type="text" name="email" size="20" maxlength="60"><br> <label for="asunto">Asunto: </label>
<input type="text" name="asunto" size="20" maxlength="60"><br> <label for="mensaje">Mensaje: </label> <br /> <textarea name="mensaje" cols="31" rows="5"></textarea> <br>
<label for="enviar">
<input type="submit" name="enviar" value="Enviar consulta"></label>
 </form>

&nbsp;

';

?>

Como pueden ver es super simple, espero que les sirva, saludos cordiales.
es bastante básico y como dije podría servir a modo pedagógico para aprender, les propongo algo, mejorémoslo entre todos, por ejemplo, que les parece si le implementamos alguna manera para que no sea posible enviar el formulario si no están rellenos todos los campos?, saludos :)
Hola, aquí hay un código que verifica por el lado del servidor el que los datos sean válidos:

<?php
  // Se obtienen las variables desde el formulario de contacto.
  $name = $_POST['nombre'];
  $phone = $_POST['telefono'];
  $mail = $_POST['mail'];
  $msg_body = $_POST['msg_body'];
  
  // Se crea la variable output que guardará los posibles errores:
  $output = '';
  if( !isset( $name ) && !isset( $phone ) && !isset( $mail ) && !isset( $msg_body ) ) {
      $output .= '<p class="error">Todos los campos son obligatorios</p><br />'; // Si todos los campos están vacíos
  }
  else {
    // A continuación, con cada IF se evalua cada variable y se añade el posible error al $output.
    if( !val_name( $name ) ) // Valida el nombre
      $output .= '<p class="error">El nombre debe tener 3 caracteres de largo como mínimo y contener sólo letras.</p>';
    
    if( !val_phone( $phone ) ) // Valida el teléfono
      $output .= '<p class="error">El teléfono no es válido.</p>';
      
    if( !val_mail( $mail ) ) // Valida el Correo electrónico (con HTML5, esta validación se podría hacer en el mismo formulario)
      $output .= '<p class="error">El e-mail no es válido.</p>';
      
    if( strlen( $msg_body ) < 20 ) // Se valida el largo del cuerpo del mensaje
      $output .= '<p class="error">El mensaje debe contener un mínimo de 20 caracteres.</p>';
  }
  
  if( !empty( $ouput ) ) // Si $output no esta vacío quiere decir que algo falló, por ende mostramos el mensaje
    echo $output;
  else { // De lo contrario, se procede a limpiar las variables de posibles códigos dañinos:
    clear_str( $name );
    clear_str( $phone );
    clear_str( $mail );
    clear_str( $msg_body );
    
    // Lo siguiente se añade al cuerpo del mensaje, aunque no es necesario:
    $msg_body .= '<br /><br /><p>Enviado por: ' . $name . '</p>';
    $msg_body .= '<p>Teléfono: ' . $phone . '</p>';
    $msg_body .= '<p>Mail: ' . $mail . '</p>';
    
    // Aquí se llama a la función sendit (más abajo) que es la encargada de enviar los mensajes:
    // Los parámetros están definidos más abajo (antes de la función)
    if( sendit( $name . '<' . $mail . '>', 'e-mail', 'Asunto', $msg_body, strip_tags($msg_body), '', '' ) )
      echo 'enviado';
    else
      echo 'error';
  }
	
  // @param es utilizado en Java para generar los Javadocs y significa parámetro, lo que se pasa a la función.
  // @return es lo que devuelve la función.
	/**
	 * @param $from Correo electrónico del remitente.
	 * @param $to Correo electrónico del destinatario.
	 * @param $subject Asunto del mensaje.
	 * @param $html Si se desea utilizar html en el cuerpo del mensaje.
	 * @param $plain Siempre debe haber un mensaje plano (sin html).
	 * @param $CC Lista de receptores.
	 * @param $BCC Blind Carbon Copy: lista de emails receptores. La diferencia
	 * está en que BCC ocultará los email a los receptores.
	 * @param $sIP Se utiliza como una forma de identificar los email.
         * @return boolean true si se envió el mensaje, false en caso contrario.
	 */
	
  function sendit($from = '', $to = '', $subject = 'Sin asunto', $html = '', $plain, $CC = '', $BCC = '', $sIP = '') {
    $eol     = PHP_EOL; // Este es el fin de línea de PHP. Es como insertar un <br />.

    // Aquí se crea el identificador del mensaje (sólo si esta vacío):
    if( empty( $sIP ) )
      $sIP = md5($subject.date('dmY'));
    // Si el remitente esta vacío, entonces se genera un nombre
    if( empty( $from ) )
      $from = '<noreply@' .$_SERVER['SERVER_NAME']. '>'.$eol;
    $header  = 'From: ' .$from.$eol;  // Se añade el remitente a las cabeceras
    // Responder a:
    $header .= 'Reply-To: ' .$from.$eol; //
    // Responder acuse de recibo a:
    $header .= 'Return-Receipt-To: ' .$from.$eol;
    // Responder:
    $header .= 'Return-Path: ' .$from.$eol;
    // Con copia:
    if($CC != '')
      $header .= 'CC: ' .$CC.$eol;
    // Con copia ciega (Blind Carbon Copy, conceal ):
    if($BCC != '')
      $header .= 'BCC: ' .$BCC.$eol;

    $header .= 'Message-ID: <' .time(). ' no-reply@' .$_SERVER['SERVER_NAME']. '>' .$eol;
    $header .= 'Content-Type: multipart/alternative; boundary="' .$sIP. '"' .$eol.$eol;
    $header .= 'MIME-Version: 1.0' .$eol;
    
    // PLAIN TEXT
    $msg  = "Content-Type: multipart/alternative".$eol;
    $msg .= '--' .$sIP.$eol;
    $msg .= 'Content-Type: text/plain; charset=utf-8' .$eol;
    $msg .= 'Content-Transfer-Encoding: 7bit' .$eol.$eol;
    $msg .= $plain . $eol . $eol;
    $msg .= 'Para ver correctamente este mensaje, usted necesita activar el contenido HTML.'.$eol;
    $msg .= 'Si usted está leyendo esto, por favor, actualice su cliente de correo electrónico o active el contenido HTML.'.$eol;
    
     if( !empty( $html ) ) { // HTML MESSAGE
	$msg .= '--'.$sIP.$eol;
	$msg .= 'Content-Type: text/html; charset=utf-8'.$eol;
	$msg .= 'Content-Transfer-Encoding: 7bit'.$eol.$eol;
	$msg .= $html . $eol . $eol;
	$msg .= '--' .$sIP.$eol;
     }

    if (mail($to, $subject, wordwrap($msg, 70, $eol), $header)) {  // Si el mensaje fue enviado devuelve true
      return true;
    }
    else { // De lo contrario devuelve false.
      return false;
    }
    
    return false;
  }
	
	/**
	 * Elimina todos los slash (/) y los caracteres html especiales (incluyendo tags).
	 *
	 * @param &$str cadena de texto/html que se desea limpiar.
	 */
  
  function clear_str(&$str) {
    $str = htmlspecialchars($str, ENT_QUOTES);
    $str = stripslashes($str);
    $str = strip_tags($str);
  }
	
	/**
	 * @param $name String que representa el nombre que se desea validar. En este caso,
	 * solo se permiten los siguientes caracteres: A-Z a-z áéíóúÁÉÍÓÚüÜäëïöÄËÏÖ. El largo mínimo
	 * es de 3 caracteres y el máximo de 50 y debe comenzar por una letra.
	 * @return boolean - true si es que el télefono es válido y false en caso contrario.
	 */
  
  function val_name( $name ) {
    if( preg_match( '/^[A-Za-záéíóúÁÉÍÓÚüÜäëïöÄËÏÖ][A-Za-záéíóúÁÉÍÓÚüÜäëïöÄËÏÖ\s]{3,50}$/', $name ) )
      return true;
      
    print preg_last_error();
    
    return false;
  }
  
	/**
	 * @param $phone String que representa el número de teléfono que se desea validar.
	 * @return boolean - true si es que el télefono es válido y false en caso contrario.
	 */
	
  function val_phone( $phone ) {
    if( preg_match( '/^(\d){2}-(\d){6,8}$/', $phone ) )
      return true;
      
    print preg_last_error();
    
    return false;
  }
  
	/**
	 * @param mail Un String con el correo electrónico que se desea validar.
	 * @return boolean - true si es que el correo es válido, false en caso contrario.
	 */
	
  function val_mail( $mail ) {
    if( preg_match( '/^([A-Za-z0-9_])([a-zA-Z0-9\._])+@([a-z|A-Z|0-9])+\.([a-zA-Z]){2,3}$/', $mail ) )
      return true;
      
    print preg_last_error();
    
    return false;
  }
?>

Es algo más complejo, pero funciona (es el que siempre utilizo para crear los formularios de contacto). El teléfono tiene el formato para Chile, por ende en otros países no funcionará. Si quieren cambiarlo y no saben cómo utilizar expresiones regulares, simplemente pongan el formato que debe tener (junto con el largo mínimo y máximo) el teléfono y yo les ayudo.

Saludos, espero que les sirva (al menos para romperse la cabeza entendiéndolo).
skaparate escribió:Hola, aquí hay un código que verifica por el lado del servidor el que los datos sean válidos:

<?php
  include_once( '../tools.php' );
  
  $name = $_POST['nombre'];
  $phone = $_POST['telefono'];
  $mail = $_POST['mail'];
  $msg_body = $_POST['msg_body'];
  
  $output = '';
  if( !isset( $name ) && !isset( $phone ) && !isset( $mail ) && !isset( $msg_body ) ) {
      $output .= '<p class="error">Todos los campos son obligatorios</p><br />';
  }
  else {
    if( !val_name( $name ) )
      $output .= '<p class="error">El nombre debe tener 3 caracteres de largo como mínimo y contener sólo letras.</p>';
    
    if( !val_phone( $phone ) )
      $output .= '<p class="error">El teléfono no es válido.</p>';
      
    if( !val_mail( $mail ) )
      $output .= '<p class="error">El e-mail no es válido.</p>';
      
    if( strlen( $msg_body ) < 20 )
      $output .= '<p class="error">El mensaje debe contener un mínimo de 20 caracteres.</p>';
  }
  
  if( !empty( $ouput ) )
    echo $output;
  else {
    clear_str( $name );
    clear_str( $phone );
    clear_str( $mail );
    clear_str( $msg_body );
    
    $msg_body .= '<br /><br /><p>Enviado por: ' . $name . '</p>';
    $msg_body .= '<p>Teléfono: ' . $phone . '</p>';
    $msg_body .= '<p>Mail: ' . $mail . '</p>';
    
    //$plain = preg_replace('/^<[\/]?(\w)+[\s]?[\//', '', $msg_body);
    
    if( sendit( $name . '<' . $mail . '>', 'e-mail', 'Asunto', $msg_body, strip_tags($msg_body), '', '' ) )
      echo 'enviado';
    else
      echo 'error';
  }
	
  
	/**
	 * @param $from Correo electrónico del remitente.
	 * @param $to Correo electrónico del destinatario.
	 * @param $subject Asunto del mensaje.
	 * @param $html Si se desea utilizar html en el cuerpo del mensaje.
	 * @param $plain Siempre debe haber un mensaje plano (sin html).
	 * @param $CC Lista de receptores.
	 * @param $BCC Blind Carbon Copy: lista de emails receptores. La diferencia
	 * está en que BCC ocultará los email a los receptores.
	 * @param $sIP Se utiliza como una forma de identificar los email.
	 */
	
  function sendit($from = '', $to = '', $subject = 'Sin asunto', $html = '', $plain, $CC = '', $BCC = '', $sIP = '') {
    $eol     = PHP_EOL;

    if( empty( $sIP ) )
      $sIP = md5($subject.date('dmY'));
    if( empty( $from ) )
      $from = '<noreply@' .$_SERVER['SERVER_NAME']. '>'.$eol;
    $header  = 'From: ' .$from.$eol;
		// Responder a:
    $header .= 'Reply-To: ' .$from.$eol;
		// Responder acuse de recibo a:
    $header .= 'Return-Receipt-To: ' .$from.$eol;
		// Responder:
    $header .= 'Return-Path: ' .$from.$eol;
		// Con copia:
    if($CC != '')
      $header .= 'CC: ' .$CC.$eol;
		// Con copia ciega (Blind Carbon Copy, conceal ):
    if($BCC != '')
      $header .= 'BCC: ' .$BCC.$eol;

    $header .= 'Message-ID: <' .time(). ' no-reply@' .$_SERVER['SERVER_NAME']. '>' .$eol;
    $header .= 'Content-Type: multipart/alternative; boundary="' .$sIP. '"' .$eol.$eol;
    $header .= 'MIME-Version: 1.0' .$eol;
    
    // PLAIN TEXT
    $msg  = "Content-Type: multipart/alternative".$eol;
    $msg .= '--' .$sIP.$eol;
    $msg .= 'Content-Type: text/plain; charset=utf-8' .$eol;
    $msg .= 'Content-Transfer-Encoding: 7bit' .$eol.$eol;
    $msg .= $plain . $eol . $eol;
    $msg .= 'Para ver correctamente este mensaje, usted necesita activar el contenido HTML.'.$eol;
    $msg .= 'Si usted está leyendo esto, por favor, actualice su cliente de correo electrónico o active el contenido HTML.'.$eol;
    
		if( !empty( $html ) ) {	// HTML MESSAGE
			$msg .= '--'.$sIP.$eol;
			$msg .= 'Content-Type: text/html; charset=utf-8'.$eol;
			$msg .= 'Content-Transfer-Encoding: 7bit'.$eol.$eol;
			$msg .= $html . $eol . $eol;
			$msg .= '--' .$sIP.$eol;
		}

    ini_set('sendmail_from', $from);
    if (mail($to, $subject, wordwrap($msg, 70, $eol), $header)) {
      @ini_restore('sendmail_from');
      return true;
    }
    else {
      @ini_restore('sendmail_from');
      return false;
    }
    
    return false;
  }
	
	/**
	 * Elimina todos los slash (/) y los caracteres html especiales (incluyendo tags).
	 *
	 * @param &$str cadena de texto/html que se desea limpiar.
	 */
  
  function clear_str(&$str) {
    $str = htmlspecialchars($str, ENT_QUOTES);
    $str = stripslashes($str);
    $str = strip_tags($str);
  }
	
	/**
	 * @param $name String que representa el nombre que se desea validar. En este caso,
	 * solo se permiten los siguientes caracteres: A-Z a-z áéíóúÁÉÍÓÚüÜäëïöÄËÏÖ. El largo mínimo
	 * es de 3 caracteres y el máximo de 50 y debe comenzar por una letra.
	 * @return boolean - true si es que el télefono es válido y false en caso contrario.
	 */
  
  function val_name( $name ) {
    if( preg_match( '/^[A-Za-záéíóúÁÉÍÓÚüÜäëïöÄËÏÖ][A-Za-záéíóúÁÉÍÓÚüÜäëïöÄËÏÖ\s]{3,50}$/', $name ) )
      return true;
      
    print preg_last_error();
    
    return false;
  }
  
	/**
	 * @param $phone String que representa el número de teléfono que se desea validar.
	 * @return boolean - true si es que el télefono es válido y false en caso contrario.
	 */
	
  function val_phone( $phone ) {
    if( preg_match( '/^(\d){2}-(\d){6,8}$/', $phone ) )
      return true;
      
    print preg_last_error();
    
    return false;
  }
  
	/**
	 * @param mail Un String con el correo electrónico que se desea validar.
	 * @return boolean - true si es que el correo es válido, false en caso contrario.
	 */
	
  function val_mail( $mail ) {
    if( preg_match( '/^([A-Za-z0-9_])([a-zA-Z0-9\._])+@([a-z|A-Z|0-9])+\.([a-zA-Z]){2,3}$/', $mail ) )
      return true;
      
    print preg_last_error();
    
    return false;
  }
?>

Es algo más complejo, pero funciona (es el que siempre utilizo para crear los formularios de contacto). El teléfono tiene el formato para Chile, por ende en otros países no funcionará. Si quieren cambiarlo y no saben cómo utilizar expresiones regulares, simplemente pongan el formato que debe tener (junto con el largo mínimo y máximo) el teléfono y yo les ayudo.

Saludos, espero que les sirva (al menos para romperse la cabeza entendiéndolo).

estimado, muchas gracias por tu codigo, crees que lo puedas explicar mas a fondo dentro del mismo para que aprendamos lo que hace por favor?, la idea era ir de menos a mas pero nos tiraste todo a la parrilla jaja, saludos.
Wuajajajajaja, por eso dije "espero que les sirva (al menos para romperse la cabeza entendiéndolo)". Pero bueno, lo editaré un poco XD.

Por cierto, me gustó tu sitio web; el diseño esta excelente: claro, limpio, letra de un tamaño legible, etc.. Felicitaciones :D.
jajaj sipo, hagamos algo mas didáctico para los que no somos tan avanzados aprendamos por parte, mira que cuando vemos tanto código nos espantamos y mejor cerramos la pagina, así si vamos de a poquito lo construimos entre todos, gracias skaparate :)
Lo que siempre hago para validar un formulario es, primer recibir los datos enviados, y luego comprobar si existen o no:

$variable1 = $_POST[campo1];
$variable2 = $_POST[campo2];

if (!$variable1 || !$variable2){

echo "Tienes que completar todos los campos del formulario.";

} else{

echo "Felicidades, has completado todos los campos del formulario xD";

}