Lenguajes de Programación

Crear formulario de correo con PHP

Aprende a crear un formulario de correo paso a paso con esta guía y videotutorial.

Publicado el 29 de Abril de 2016
Compartir

El primer uso que uno puede necesitar de un lenguaje de script en servidor es el envío de un formulario de contacto por email.

Además de utilizar las variables globales $_GET o $_POST para recibir el contenido de los campos de formulario, desde PHP podemos utilizar con facilidad la función mail() para ese envío si solo queremos utilizar su comportamiento más básico.

https://www.php.net/manual/es/function.mail.php .

Hay que tener en cuenta que mail() no funcionará correctamente en un servidor Windows si no tiene una configuración especial, como la que proporciona XAMPP mediante fakemail para emularlo, o un ejecutable sendmail particular para emular el comportamiento que tiene bajo Linux.

https://www.apachefriends.org/es/index.html .

Si esto lo pruebas en cualquier hospedaje online, que utilizará Linux como sistema operativo, funcionará sin que te tengas que preocupar de este asunto.

Para complicar un poco este ejemplo, vamos a construir una función reutilizable que emplee mail() , añadiendo cabeceras que permitan enviar los mensajes en HTML. Otras alternativas serían emplear la librería PHPMailer o el paquete PEAR Mail .

<?php
function send_email($from, $to, $subject, $message_html, $message_txt = '') {
        
    $email = $to;
    				
    //create a boundary for the email. This 
    $boundary = uniqid('np');
    				
    //headers - specify your from email address and name here
    //and specify the boundary for the email
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: $from \r\n";
    $headers .= "To: $email\r\n";
    //'Reply-To: ' . $from,
    //'Return-Path: ' . $from,
    $headers .= 'Date: ' . date('r', $_SERVER['REQUEST_TIME'])."\r\n";
    $headers .= 'Message-ID: <' . $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME'].$subject) . '@' . $_SERVER['SERVER_NAME'] . '>'."\r\n";
    $headers .= 'X-Mailer: PHP v' . phpversion()."\r\n";
    $headers .= 'X-Originating-IP: ' . $_SERVER['SERVER_ADDR']."\r\n";
    
    $headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";
    
    //here is the content body
    $message = "This is a MIME encoded message.";
    
    //Plain text body
    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-type: text/plain;charset=iso-8859-1\r\n\r\n";
    
    if ( $message_txt == '' ) {
    	$message_txt = nl2br( $message_html );
    	$message_txt = strip_tags( $message_txt );
    }
    $message .= $message_txt;
    //Html body
    $message .= "\r\n\r\n--" . $boundary . "\r\n";
    $message .= "Content-type: text/html;charset=uiso-8859-1\r\n\r\n";
    $message .= $message_html;
    
    $message .= "\r\n\r\n--" . $boundary . "--";
    
    //invoke the PHP mail function
    mail('', $subject, $message, $headers);

}

?>
<!DOCTYPE html>
<html><head></head><body>
<form method="post">
	Nombre:<br><input type="text" required="required" name="name" /><br>
	Apellidos:<br><input type="text" required="required" name="surname" /><br>
	Email:<br><input type="email" required="required" name="email" /><br>
	Asunto:<br><input type="text" required="required" name="subject" /><br>
	Mensaje:<br> 
	<textarea name="message" required="required" rows="4" cols="50"></textarea><br>
	<input type="submit" value="Enviar"/>
</form>
<?php
if ( ! isset($_POST['email']) ) {
	exit;
}

// Construimos el mensaje
$to= 'nuestroemail@example.org';
$reply = 'no-responder@example.org';
$user_email = $_POST['email'];
$subject = 'Mensaje automático: '.$_POST['subject'];

$message = '<table>';
$message .= '<tr><td>Nombre</td><td>'.$_POST['name']."</td></tr>\n";
$message .= '<tr><td>Apellidos</td><td>'.$_POST['surname']."</td></tr>\n";
$message .= '<tr><td>Email</td><td>'.$_POST['email']."</td></tr>\n";
$message .= '<tr><td>Asunto</td><td>'.$_POST['subject']."</td></tr>\n";
$message .= '<tr><td>Mensaje</td><td>'.$_POST['message']."</td></tr>\n";
$message .= '</table>';

echo $message;

send_email($user_email, $to, $subject, $message);
send_email($reply, $user_email, $subject, $message);

En nuestro código de ejemplo, hemos especificado en primer lugar la función de envío de email que vamos a crear, send_mail() , para poder invocarla más adelante.

Esta función emplea mail() como comentábamos, pero estableciendo ciertas cabeceras adicionales siguiendo el estándar de los correos, que añaden información del agente de envío, la IP desde el que se ha originado, un ID de mensaje, etc. Esto favorece una mejor clasificación del mensaje de cara a filtros de spam.

También tenemos en cuenta que, para enviar el mensaje en HTML, definimos unos marcadores que especifican una primera versión del mensaje en dicho formato, y a continuación una nueva versión en formato texto plano. Como es habitual que si construimos la versión HTML no queramos pararnos también a escribir de nuevo la misma versión del mensaje en texto plano, contemplamos que si esta está vacía, se genere desde la versión HTML, utilizando br2nl() para convertir las etiquetas <br> en saltos de línea. A continuación utilizamos strip_tags() para eliminar todas las etiquetas HTML del mensaje. Este simple filtrado no va a producir una versión muy buena del mensaje en texto plano, pero es muy improbable que el usuario la vea nunca ya que todos los clientes de correo muestran por defecto siempre la versión HTML, y al menos con ella nos aseguramos en caso de problema que el mensaje, aunque no muy bien formateado, llega con todo el contenido de texto.

Luego al invocar la función mail() no especificamos el destinatario ni el remitente, ya que también han sido definidos en las cabeceras del mensaje.

Por último, tenemos un formulario básico con varios campos, y el código que compone el mensaje por email para ser enviado según lo encontrado en dicho formulario. Podríamos añadir a este ejemplo alguna validación antes del envío (por ejemplo, que están rellenos los campos obligatorios, siempre es mejor comprobarlo del lado del servidor), o cambiar cómo queremos construir el mensaje. Sería interesante por ejemplo añadir fecha y hora, la dirección IP del usuario que ha realizado el envío. Al final, las llamadas a la función send_mail() envía un mensaje a la persona que ha rellenado el email, utilizando una dirección de remite tipo no-responder, y otro a nosotros mismos, empleando como remite la dirección de email del usuario. Esto último facilitar responder directamente desde nuestro correo al usuario si queremos comunicarnos con él a partir del email del formulario de contacto.


Compartir este post

También te puede interesar...

Tecnología

Sanitizar datos en PHP

18 Mayo 2016 Vicente Herrera
Artículos
Ver todos