03 enero 2010

Mandar formulario con PHP mail

En otras entradas de este blog se han tratado los aspectos de como gestionar un formulario a través de un cliente de correo y del uso de scripts cgi tipo FormMail. Ambos sistemas tienen sus problemas propios: en el caso de correo, que no todos los usuarios, ni siquiera la mayoría usan un programa de correo tipo Outlook; en el caso de los scripts CGI, que no todos los servidores los permiten o que son a veces confusos de configurar.
Hoy en día están más impuestos los scripts basados en PHP que utilizan la función mail(). Problema: debe asegurarse de que su proveedor de alojamiento web admite soporte para PHP y que, además, tiene activada la función mail. Si, además busca un servidor gratuito con estas características, no encontrará muchos. Puede probar en 260mb.com, como es nuestro caso.
No entraremos en la creación del formulario, pues damos por supuesto que conoce los diversos elementos que pueden incluirse, como campos de texto, listas y menús, casillas de verificación, botones, etc.
Trataremos solo de su gestión, esto es, de pasar las variables que conforman el formulario a un script denominado myform.php que se encargará de procesar estos campos y mandar un correo electrónico al destinatario deseado.
El script que se propone a continuación es una mejora de scripts que se encuentran en internet en páginas tales como lawebdelprogramador.com y en la referencia sobre PHP en php.net, en concreto, http://www.php.net/manual/en/function.mail.php, donde podremos aprender más opciones sobre la función mail.
Así, el script propuesto (por el usuario de internet llamado MatedeCoca) es el siguiente:

<?php
$field_name = array_keys($_POST);
$value_name = array_values($_POST);

for ($i=0;$i<count($field_name);$i++)
{
$msg .= "".$field_name[$i].": ".$value_name[$i]."\n\n";
}

$recipient = "sudireccion@decorreo.com"; // el correo donde desea recibir elcontenido del formulario
$subject = "El asunto"; // el asunto del correo que usted recibirá y que puede ser "petición" o "consulta" o algo por el estilo

$headers = "From: Su dominio debe aparecer aquí <http://sudominio.com>\n"; // quien lo manda y el dominio
$headers .= "Cc: otradireccion@decorreo.com\r\n"; // (opcional) dirección de quien recibirá una copia del formulario

mail($recipient, $subject, $msg, $headers);// mandamos el mail con los todos los datos
header('location:confirmacion.html'); //(opcional) así vamos a la página de confirmación tras haber mandado el formulario (debe haberse creado una página denominada confirmacion.html o si no, esta línea debe eliminarse).
?>

En el formulario debe aparecer la línea en el encabezado del formulario de la siguiente forma:

<form action="myform.php" method="post">

También es de mencionar que todo este script puede incluirse dentro de la propia página del formulario como un elemento PHP. Así, el formulario podría contener elementos HTML, tales como el propio formulario y elementos PHP incluidos. Para ello la página habría de guardarse con la extensión *.php y la acción debería llamarse a sí misma. Esto es, si el formulario con el script se guarda como formulario.php, en la línea action debería aparecer action="formulario.php", es decir, se llamaría a sí misma o lo que es igual, al script PHP que llevaría en el seno de la propia página.
Preferimos no hacerlo de esta forma, ya que así las direcciones de correo que usemos para recibir los contenidos del formulario no estarán disponibles en el formulario directamente, que es el primer lugar donde buscan los bots que se dedican a cazar direcciones de correo para usarlas como objetivos de Spam.
El script anterior lo que hace es recopilar los nombres y valores de todos los campos del formulario, (incluidos los campos ocultos), pasarlo a las variables PHP correspondientes, construir con todas ellas un mensaje denominado $msg, mandar dicho mensaje al recipient con la función mail y, por último acabar en una página de confirmación del envío denominada confirmation.html. En caso de no existir dicha página el visitante acabaría en la propia página del formulario. Puede verse un ejemplo en acción en el videotutorial relacionado.

2 comentarios:

Vicente Sargues dijo...

Hola Francisco
He caido por aqui de casualidad, como suele ocurrir, buscando un script como este.
Hago diseños de paginas web (entre otras cosas) aunque mas por el lado de diseño (photoshop) que por el de codigo, que lo llevo mas o menos.
He estado probando algunos script que se mueven por la red pero la mayoria tiene algun que otro error. He visto este tuyo, con el videotutorial y parece ser que me ha funcionado a la primera.
Por lo que he visto es un codigo sencillo, sin muchas opciones, pero que funciona.
Espero que poco a poco vaya haciendo uno mas o menos completo, pero para empezar esta muy bien!
Gracias
Te dejo en mis favoritos para "echarte" un vistazo :)
Un saludo
Vicent

Anónimo dijo...

hola , me parece muy bien el script me gustaría saber si se le puede poner seleccion multiple? lo intente pero solo me sale el nombre del select, muchas gracias , saludos!