Mandar un mail con HTML y PHP

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Es posible montar un formulario HTML que envíe los datos a un documento PHP que será el encargado de mandar el mail en apenas unos minutos. Si eres diseñador, esta es una pequeña batalla que a menudo tienes que librar, así que espero que te sirva de ayuda.

Si quieres profundizar hasta el infinito en el aprendizaje de maquetación con HTML y de programación con PHP, puedes consultar los curos de HTML y PHP de esta misma web.

Mandar un mail en PHP

Para mandar un mail con PHP basta con una sola línea de código. Basta con usar la función mail de PHP, que tiene una estructura muy sencilla:

<?php 
 mail($correo_destino, $asunto, $mensaje);
?>

y ya está!

Opcionalmente existe un cuarto parámetro que contiene las cabeceras.

Necesitamos un formulario HTML

Para usar la función PHP mostrada en el código anterior, debemos enviarle cierta información que será recogida en un formulario HTML. Esta información, al menos, será:

  • El mail del remitente, necesario para poder responderle.
  • El asunto
  • El propio texto del mensaje mensaje.

Así pues, escribimos el código fuente de un formulario HTML en que el que hay unos cuantos inputs y un textarea para el mensaje. Cada uno de estos elementos está identificado con un name. Usaremos ese name para poder recojer sus valores cuando lleguemos al documento PHP.

¿Cómo vinculamos el documento HTML con el PHP? El action de un formulario es el atributo que define a dónde vamos a ir cuando pulsemos el botón de envío. Por tanto, el valor del action del formulario será la ubicación del documento dónde este fichero PHP se encuentra.

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

 <label for="subject">Asunto</label>
 <input type="text" name="subject" id="subject"><br>

 <label for="from">Correo</label>
 <input type="text" name="from" id="from"><br>

 <label for="msg">Mensaje: </label>
 <textarea name="msg" id="msg" cols="30" rows="10"></textarea><br>

 <input type="submit">

</form>

Y recoger los datos enviados con en nuestro documento PHP

Para recoger los datos enviados desde nuestro formulario HTML que utiliza el atributo method=»post», utilizaremos $_POST y pondremos entre los corchetes el valor del atributo name de los campos del formulario cuya información quiero recoger.

Tras recoger estos datos, se los paso a la función mail. Podemos tener esta función dentro de una estructura if, que devolverá true en el caso de que el mail haya sido enviado con éxito

<?php 
// Esto es para activar la visualización de errores en el servidor, por si los hubiese
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

$subject = $_POST['subject'];// El valor entre corchetes son los atributos name del formulario html
$msg = $_POST['msg'];
$from = $_POST['from'];

// El from DEBE corresponder a una cuenta de correo real creada en el servidor
$headers = "From: pablomonteserin@pablomonteserin.com\r\n"; 
$headers .= "Reply-To: $from\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=utf-8\r\n"; 
 
if(mail($from, $subject, $msg,$headers)){
 echo "mail enviado";
 }else{
 $errorMessage = error_get_last()['msg'];
 echo $errorMessage;
}
?>

Error super típico que suelen tener mis alumnos al hacer este ejercicio

Para poder ejecutar el código PHP de este ejemplo, necesitas un servidor web. Cuando tu código PHP se está ejecutando correctamente en un servidor web, tu no puedes ver este código PHP. Si al hacer el envío, llegas a un documento de texto en el que puedes leer el código PHP del fichero… no lo estás haciendo bien.

Por otro lado, si estás ejecutando el ejemplo en local (localhost), muy probablemente no te funcionará, ya que no tendrás un servicio de correo electrónico configurado.

Necesitarás subir tu código fuente a un servicio de alojamiento web para que el código funcione.

Advertencia

Una última cosa a tener en cuenta. Algunos servidores tienen deshabilitada la función mail de php. En algunos casos basta una llamada telefónica o un mail para que te la habiliten. En otros casos, no te la van a habilitar aunque lo solicites. En mi caso con CDMon, no he tenido problemas, pero antes, cuando estaba en Hosteruope, tuve que solicitar que me la activasen.

Por otra parte, utilizando servidores gratuitos, a menudo la función mail de php está deshabilitada por defecto. En el caso de que estes haciendo las pruebas en tu localhost, habrá que configurarlo y no te lo recomiendo si no tienes una buena razón.

Código HTML y PHP para mandar un mail

Subir un fichero al servidor

<form action="form.php" method="post"  enctype="multipart/form-data">
 <input type="file" name="foto">
</form>
form.php
if(isset($_FILES['foto'])){
 $errors= array();
 $file_name = $_FILES['foto']['name'];
 $file_size = $_FILES['foto']['size'];
 $file_tmp = $_FILES['foto']['tmp_name'];
 $file_type = $_FILES['foto']['type'];
 $file_ext=strtolower(end(explode('.',$_FILES['foto']['name'])));
   
 $url = dirname(__FILE__)."/uploads/".$file_name;
   
 $extensions= array("jpeg","jpg","png","pdf","zip", "rar");
   
 if(in_array($file_ext,$expensions)=== false){
  $errors[]="Estensión no permitida.";
 }
   
 if($file_size > 10485760) {
  $errors[]='File size must be excately 10 MB';
 }

 if (empty($errors)==true) {
  if(move_uploaded_file($file_tmp,$url)){
   echo "subida con exito";
   chmod($url, 0777);
  }else{
   echo "problema en la subida";
  }
 }
}

PHPmailer para mandar correos con PHP

PHP Mailer es la solución open source más utilizada para programar el envío de mails.

Es un script de php que nos permitirá enviar correos teniendo un mayor número de opciones de envío que si hubiesemos utilizado la función mail() de php. Las ventajas/diferencias de PHP Mailer frente a la función mail() de PHP son:

  • PHP Mailer utiliza programación orientada a objetos.
  • No precisa un servidor de correos local para enviar los mails (es posible mandar los mails desde tu cuenta de gmail, por ejemplo).
  • Permite que el receptor del mensaje lo reciba en texto plano en lugar de HTML, en el caso de que su cliente no pueda procesar código HTML.
  • Es utilizado por WordPress, Joomla o Drupal.
Mandar un mail con HTML y PHP 1

Instalación

Para utilizarlo, lo más cómo es tener instalado composer.

composer require phpmailer/phpmailer

Tras alojar la carpeta descargada en el servidor, debemos cargar los archivos necesarios:

//Load Composer's autoloader
require './vendor/autoload.php';

Además, las siguientes dos líneas deben estar en el fichero en el que instanciamos PHPMailer ($mail = new PHPMailer(true);), no vale incluir un fichero que las tenga:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

Puedes consultar su documentación en este enlace: https://github.com/PHPMailer/PHPMailer

Debemos probar esta librería en el servidor remoto, ya que en localhost a menudo nos hace falta una librería para poder enviar los mails.

Uso básico

Para mandar un mail desde el servidor de correo local:

$mail = new PHPMailer(true);
$mail->isHTML(true);                                  //Set email format to HTML
$mail->CharSet = 'UTF-8';
$mail->Subject = $subject;
$mail->Body    = $msg;
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
$mail->setFrom($emailCliente, $nombreCliente);
$mail->addAddress($emailDestinatario, $nombreDestinatario);   
$mail->send();

Para usarlo con una cuenta de gmail:

$mail = new PHPMailer();
$mail->CharSet = 'utf-8';
$mail->Host = "smtp.googlemail.com";
$mail->From = "pablomonteserin@pablomonteserin.com";
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Username = "usuario@gmail.com";
$mail->Password = "password";
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->AddAddress("mailDestinatario@example.com");
$mail->AddAddress("paramonty@gmail.com");
$mail->SMTPDebug  = 1;   //Muestra las trazas del mail, 0 para ocultarla
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

/*if ($archivoName != "") {
 $mail->AddAttachment($archivoTemp, $archivoName);
}*/
if(!$mail->send()) {
 echo 'Message could not be sent.';
 echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
 echo 'Message has been sent';
}

Si todo va bien, nos llegará un mail a nuestra cuenta de google informándonos de que han intentado acceder a nuestra cuenta. Si pulsamos en el enlace que se nos ofrece, podremos permitir el acceso a la cuenta de google desde localhost.

El código HTML del formulario

Recuerda que para enviar imágenes, el código HTML del cliente deberá ser similar a este:

<form action="index.php" method="post" enctype="multipart/form-data"/>
<input name="archivo" id="archivo" type="file"/>

Función para enviar imágenes como adjunto

function attachImageIfExists($mail, $file){
 if(isset($file)){
  $errors= array();
  $file_name = $file['name'];
  $file_size = $file['size'];
  $file_tmp = $file['tmp_name'];
  $file_type = $file['type'];
  $file_ext=strtolower(end(explode('.',$file['name'])));
      
  $extensions= array("jpeg","jpg","png","pdf");

  if(in_array($file_ext,$extensions)=== false){
   $errors[]="extension not allowed, please choose a PDF, JPEG or PNG file.";
  }
      
  if($file_size > 2097152) {
   $errors[]='File size must be excately 2 MB';
  }
      
  if(empty($errors)==true) {
         $filepath = "uploads/".$file_name;
   move_uploaded_file($file_tmp,"uploads/".$file_name); //The folder where you would like your file to be saved
   echo "Success";
  if(isset($filepath))$mail->addAttachment($filepath);
  }else{
   print_r($errors);
  }
 }
 return null;
}

Ejercicio

Utilizando la plantilla adjunta (o un diseño propio), hacer una web con idiomas y por la que navegaremos redireccionando siempre a index.php y cargando con include los contenidos según sea oportuno.

La web estará compuesta de dos páginas; una con información y otra que nos permitirá mandar un mail al pulsar el botón de envío.

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.