Tutorial: Envio de e-mail desde un formulario

erdanblo

Nivel: Principiante

Introducción:

Debido a que es una duda que ya ha aparecido varias veces y es algo que nos puede venir
muy bien en muchas ocasiones, me he decidido explicar la creación y el funcionamiento
de un script en PHP (www.php.net), para poder recoger una serie de campos en un formulario
y que toda esa información se nos envie al correo electrónico.

Lo que quiero conseguir con esto, con un mínimo de conocimiento en HTML (http://www.w3.org/MarkUp/) y
ningún conocimiento de PHP, logré realizar esto con éxito y de paso, aprende algunas cosillas.

Requisitos: http://es.php.net/mail

  • Localhost
    ·· En Linux necesitaremos de un cliente de correo, se aconseja Sendmail y tenerlo instalado en la ruta por defecto.
    ·· En Windows necesitaremos un servidor SMTP instalado en nuestro sistema, podeis usar el ArGoSoft que es muy fácil de configurar. (http://hostspain.net/smtp.html)
    ·· Servidor web (Apache, ISS, ...)
    ·· Módulo PHP 4.3x o superior, configurado en el servidor web.

  • Hosting compartido
    ·· No se precisa de ninguna configuración generalmente, ya que suele venir corriendo Linux y Sendmail por defecto.

Funcionamiento:

El funcionamiento del script es muy simple, lo que hacemos es que tenemos un formulario, como cualquier otro, en
HTML, entonces mediante campos (< input> ) o campos de texto (<textarea> ), recogeremos la información que el navegante nos va a facilitar,
posteriormente, cuando el navegante pulse, toda esa información se la vamos a mandar a un script en PHP que va a ser el encargado de procesarla y
enviarla a través del servidor SMTP servidor.

Script:

Para no liarnos vamos a separar el HTML y el PHP en dos archivos, podriamos hacerlo sin ningún tipo de problema todo en el mismo archivo, pero quedaria un código menos claro.

En el ejemplo, vamos a realizar un formulario para que nos envien opiniones de nuestra web.

  • HTML

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

<!-- Method es la manera de como se envia los datos, GET seria mediante URL y POST de una manera oculta (a través STDIO). Action indica la acción o archivo a ejecutar cuando el navegante pulse sobre Submit (Aceptar), en este caso ejecutamso "enviar.php" que contiene el script PHP que procesará y enviará el e-mail. -->

< input type="text" name="tu_nombre"> Escribe tu nombre.<br>

<!-- Type le decimos el tipo de campo que será y el navegaor lo mostrará de una forma u otra, puede ser: text, password, submit, reset, ... . Name simplente es el nombre del campo, es MUY IMPORTANTE tener bien específicado esto, sin espacios ni carácteres raros, porque luego con esto procesaremos el mensaje a través de las variables de PHP y es como conseguirmos el contenido de cada campo. -->

< input type="text" name="tu_asunto"> Escribe el asunto.<br>
< input type="text" name="tu_email"> Escribe el e-mail.<br>
<texarea name="tu_mensaje">Escribe tu mensaje</texarea><br>

<!-- Textarea es un campo de texto, el funcionamiento es un poco diferente, como veis, esta etiqueta si que tiene cierra en HTML (/textarea> ) y si queremos añadirle algo por defecto, solo tendremos que "encerrar" el texto que queramos: <textarea>TEXTO POR DEFECTO</textarea> -->

< input type="submit" value="Enviar e-mail">

<!-- type="submit" esto es algo nuevo, lo que hace es un botón ejecutable, que cuando hagas clic aceptará y mandará los datos del formulario hacia el "action" que tengamos puesto. -->

</form>

Teneis el código más limpito en: http://erdanblo.php5.cz/codigo_html.html

  • PHP

    <?php // Abrimos el modo PHP

    $nombre = stripslashes($_POST[tu_nombre]); //Con esto y lo siguiente lo que haremos es limpiar el contenido de los campos por si hay algo 'malicioso'.

function cad_limpia ($string) {
return trim(htmlentities(strip_tags($string)));
}

$nombre= cad_limpia($POST['tu_nombre']);
$asunto = cad_limpia($
POST['tu_asunto']);
$email = cad_limpia($POST['tu_email']);
$mensaje = cad_limpia($
POST['tu_mensaje']);

if( empty($POST['tu_nombre']) || empty($POST['tu_asunto']) || empty($POST['tu_email']) || empty($POST['tu_mensaje'])) { echo 'Hay campos incompletos, rellena todo los campos.'; }else{ // Abrimos un condicional con las condiciones, de que ningún campo esté vacio, en el caso de que algo esté vacio lanza el mensaje de error, si no, continua la ejecución del script.

// Ahora vamos a crear la forma en la que nos llegará el correo a nuestra e-mail y tal cual lo veremos.

$cuerpo = "
||============================
|| Nombre: $nombre [$email]
|| Asunto: $asunto
||============================

Mensaje: $mensaje

";

$destino = "[email protected]"; // Aqui vamos a poner nuestro correo electrónico, es decir, donde queramos recibir los mensajes desde web.

mail($destino, $asunto, $cuerpo, "Reply-To: $email;");

//Por fin la función que envia el correo, teneis la explicación aquí: http://php.grn.es/manual/es/function.mail.php , solo decir que el Reply-To es para que cuando en nuestro cliente de correo o algo, pulsemos sobre responder, automaticamente nos ponga el correo que pusieron en el formulario y no el correo del servidor web, que será el que no has enviado el correo "realmente".

}
?>

Teneis el código más limpito en: http://erdanblo.php5.cz/codigo_php.html



Ejemplo:

Teneis un ejemplo en: http://erdanblo.php5.cz con la única modificación del original, que el mensaje se envia al correo que pongais en el formulario.

(Tarda bastante en llegar el correo debido a que es un hosting gratuito.)

Enlaces:

www.php.net - Manual de PHP
www.apache.org - Página del servidor web.
www.aeoris.net - Embellecedor de código PHP
www.media-vida.net/vertema.php?fid=9&tid=1828828805 - Listado de hostings gratuitos

Nota:

Si vais a publicar este tutorial en otra web que no sea media-vida, dar mención del autor y página (www.media-vida.net) o mejor, dar la URL al tutorial.

Si teneis alguna duda/sugerencia/crítica, responder al post (educadamente).

Cambios:

Comillas en las variables $_POST.
Función de limpiar cadenas ( Autor: murpix - Web: http://213.194.149.215/whosegfx/tema/14/177/)

N

jod0, no sabia k para hacer un script para enviar emails atraves de formularios habia k poner tanto xD, yo pongo lo minimo, nada de limpieza de codigos ni nada de nada, ya que ami parecer si esa informacion no se guarda en una base de datos, no hay problema.

De todas formas, perfect erdanblito :P xD

erdanblo

En realidad no es casi nada, ni 15 lineas, pero está lo de limpiar el código y mandarlo algo bonito... en una cajetilla y tals.

Está el condicional... son cosas que sin ellas pués esa una basofia y esto asi es más o menos decente.

guner

podrías haber creado una función que limpiara los datos de entrada, o hacer directamente
$blabla = strip_tags(stripslashes($_POST['blabla']));

ah, por cierto, dentro de las matrices las claves que son strings con comillas.

Aunque yo hubiera comprobado si magic_quotes_gpc está activado antes de hacer el stripslashes.

erdanblo

#4 Listo.

guner

#5, guay : >

por cierto, muy pertinente el post _

Raya_Powa

la moda de los Tutos xD

Whose

Thx por el tuto, lo subo a tutoriales ^^

Por cierto, podias ahorrarte bastantes lineas
$nombre= cad_limpia($POST['tu_nombre'];
$asunto = cad_limpia($
POST['tu_asunto'];
$email = cad_limpia($POST['tu_email'];
$mensaje = cad_limpia($
POST['tu_mensaje']);

Si fuesen de varios usos estaria bien pero para un solo uso es una tonteria usarlas, las puedes meter directamente y te ahorras codigo.

erdanblo

Soy como el del post que no se la casca y el WH, pués yo igual, mi desde que me desmostraron el shell(-r) y hacerme desaparecer todo lo que pille en el hosting, no me la casco.

Por cierto, añade el autor de la función cuando puedas.

6 meses después
v3sTi4

Gran tutorial, aunque tngo q comentar una cosa:

Tal como lo ha puesto erdanblo no va :-S

Yo soy "noob" en esto del php, pero observando el código creo que el fallo está en un parentesis.

Me daba un error en la línea 14 coincidiendo con:
$nombre= cad_limpia($_POST['tu_nombre'];

Así que intentando ver el fallo creo que es culpa de un parentesis y que por tanto debería quedar así:

$nombre= cad_limpia($_POST['tu_nombre']);

Lo mismo ocurre en las variables de asunto y email:

$nombre= cad_limpia($POST['tu_nombre']);
$asunto = cad_limpia($
POST['tu_asunto']);
$email = cad_limpia($_POST['tu_email']);


Alomejor me he equivocado yo, lo siento, no lo sé con seguridad, como ya he comentado soy novato en este tema, y lo único que se que tal y como lo ha puesto erdanblo no me va y con este detalle del parentesis ya va.

Por favor, edita el post y corrige el fallo, a futuras personas puede serles muy útil.

Y REPITO: Muy buena explicación !!
Supongo que es ampliable el campo de formulario, intentaré crear más campos.

Salu2

erdanblo

Gracias por el aviso, ya esta corregido.

De todos modos, esto tiene poco que explicar, es la cosa más 'tonta' del mundo, pero bueno, mejor esto que ver un formulario de esos de melodysoft. Sobre lo de los campos, puedes añadir todos los que quieras, fijate de los que ya hay.

Usuarios habituales

  • erdanblo
  • v3sTi4
  • Whose
  • Raya_Powa
  • guner
  • Nuguns