Enviar correo electrónico en PHP es muy fácil, y dado que es una de las cosas que se vuelven necesarias para formularios de contacto, recuperación de contraseñas, mailing list pre-programados entre otras funciones, hoy vamos a ver como hacerlo de manera sencilla y eficiente.
Partiremos de la idea de un formulario muy sencillo, el cual incluíra: nombre, correo electrónico y un comentario ¿Estás listo? ¡Vamos a trabajar!
Preparando el formulario inicial
Usaremos la constante PHP_SELF para indicar que la propiedad action del formulario se ejecuta en el mismo script, también lo sanearemos con htmlentities para evitar ataques XSS muy comunes.
<h1>Prueba de envío de correo</h1> <p>Por favor, escriba sus comentarios.</p> <form method="post" action="<?php htmlentities($PHP_SELF) ?>">
Colocamos los input con los datos necesarios, colocándoles el atributo required para que sea obligatorios. Incluimos un botón de enviar y cerramos el formulario.
<p><label>Su nombre:</label> <input type="text" name="nombre" required /></p> <p><label>Su correo:</label> <input type="email" name="correo" required /></p> <p><label>Su comentario es:</label><br /><textarea name="comentario"></textarea></p> <p><input type="submit" name="ok" value="Enviar" /></p> </form>
Enviando el correo con PHP
Para comenzar a revisar los datos y hacer el envío pertinente, revisamos que el método usado haya sido POST.
if($_SERVER['REQUEST_METHOD']=="POST"){ }
Ahí dentro, verificamos que sean 4 variables y que entre ellas existan la del botón submit
if(count($_POST)==4 && isset($_POST["ok"])){ }
Dentro del último if, haremos el resto del trabajo. Primero, vamos a sanear las variables del formulario.
$nom = htmlspecialchars(strip_tags(trim($_POST["nombre"])), ENT_QUOTES); $cor = htmlspecialchars(strip_tags(trim($_POST["correo"])), ENT_QUOTES); $com = htmlspecialchars(strip_tags(trim($_POST["comentario"])), ENT_QUOTES);
Dado que el atributo required no está soportado por navegadores antiguos, validaremos que al menos tengan cierta longitud: 3 para el nombre, 5 para el correo y 4 para el comentario.
if(strlen($nom)<3 || strlen($cor)<5 || strlen($com)<4){ echo "<p>Sus datos están incompletos. Intente de nuevo.</p>"; }else{ }
Finalmente, dentro del último else, haremos la parte del envío. Primero, el asunto.
$asunto = "Envío de datos desde CableNaranja";
Luego, a quien va dirigido.
$para = "somepony@cablenaranja.com";
Ahora, capturamos el correo de quien lo envía
$de = $cor;
Creamos la cabecera con los elementos mínimos según la especificación RFC-5598, también nos aseguramos de que pueda interpretarse como HTML con UTF-8.
$cabecera = "MIME-Version: 1.0\r\n"; $cabecera.= "Content-type: text/html; charset=UTF-8\r\n"; $cabecera.= "To: $para\r\n"; $cabecera.= "From: $nom <$de>\r\n"; $cabecera.= "Reply-To: $de\r\n"; $cabecera.= "Subject: {$asunto}\r\n"; $cabecera.= "X-Mailer: PHP/" . phpversion() . "\r\n";
El comentario se convierte en el mensaje.
$mensaje = $com;
El asunto puede generar problemas con los caracteres non ASCII en algunos gestores de correo, la especificación RFC 2047 soluciona ese problema usando una codificación de base 64, arreglaremos ese problema al enviar el mensaje.
mail($para, '=?UTF-8?B?'.base64_encode($asunto).'?=', $mensaje, $cabecera);
Y eso es todo. Como siempre, cualquier duda, comentario o sugerencia pueden dejarlo en los comentarios. También pueden descargar el código fuente para probar lo escrito en este artículo.
Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.