Contenido

Enviar emails HTML con PHP

9 Jun

+ 18

Enviar un mail en texto con PHP es tan sencillo como usar la función mail(), que únicamente puede ocuparnos una línea de texto como esta:

mail($to, $asunto, $body, $headers);

Resalto los $headers por que son la clave para permitirnos enviar un email en HTML. En ellos indicaremos los datos que los lectores de correo deberán tener en cuenta para distinguir entre un simple email de texto y uno de HTML.

$headers = "From: " . strip_tags($from) . "\r\n";
$headers .= "Reply-To: ". strip_tags($to) . "\r\n";
$headers .= "CC: CON COPIA\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

Como podemos ver en el código en negrita estamos indican que el Content-type del email es un text/html y con la codificación ISO-8859-1, además de permitir añadir un emails en copia o incluso en copia oculta.

Esto nos permitirá usar un HTML bastante limitado, pero en fin HTML para hacer nuestros emails algo más elegantes y más ordenados. Nuestro $body ya podrá contener dichos tags.

$body = '<strong>Texto en negrita</strong> este no lo es :D';

La mágia es que podemos seguir usando la misma función mail() para enviar nuestro email.
Via

  • Yo lo ampliaría metiendo un archivo adjunto, que siempre viene bien. De todos modos, buen tutorial para que algo que siempre da pegas 😀

  • Buen tutorial!!!

    Nunca esta de más recordar esta funcion tan vital de PHP

  • @patoroco: A ver si esta tarde puedo dedicarle unos minutos. Si alguien se anima y nos ilustra, actualizaré el post cuando tenga un ratillo 😀

  • Yo la verdad es que no uso phpmailer, si no Swift Mailer, para mi la mejor colección de clases para gestionar el envío de correo, ya que permite diferentes protocolos de envío, attachments facilísimos, envío por lotes (por ejemplo para newsletters) etc etc http://swiftmailer.org/

    En cuanto lo de adjuntar ficheros en el email, es tan simple como generar boundarys (marcas en los emails) hacer un readfile y poco más …. a ver si alguien se anima y escribe algo jejeje, yo si encuentro un poco de tiempo ya prepararé algo 🙂

  • Se me ha olvidado comentar antes, muchos servidores, generalmente los compartidos, deshabilitan ciertas funciones, y generalmente la funcion mail es una de ellas, por eso es aconsejable el uso de clases como Swift Mailer o PHP Mailer (en PEAR seguro que habrá más) que permiten el envio mediante SMTP y una cuenta externa (por ejemplo de gmail) …

  • @epplestun: Me declaro fan de Swift Mailer, antes usaba PHPmailer, pero la librería Swift es tremenda, super fácil de usar y muy potente como bien dices.

    Para el envío de attachments y envío a múltiples correos es estupenda.

  • He usado la funciòn mail enviando html, pero encuentro un problema cuando el correo se ve en google o en outlook.

    El problema es que no interpreta el html y por lo tanto se ven todas las etiquetas.

    Sería bueno que alguien comentara una alternativa para que esto no suceda y que no tengamos que prescindir del html.

  • Giovanny, con el código que ha puesto anieto2k es correcto. Pero acuerdate de poner los tags de (html,head,body…) en la variable mensaje.

    Pero tengo una mejora que quizás os pueda ser interesante. A ver si puedo copiar el código en los comentarios.

    
    $email_enviar = "prueba@prueba.com";
    $asunto = "El asunto que quieras";
    
    /* To send HTML mail, you can set the Content-type header. */
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
    $headers .= "From: prueba \r\n";
    $headers .= "Reply-To: prueba \r\n";
    $mensaje_mail="";
    
    ob_start();
    nclude('plantilla/mail.tpl.php');
    $mensaje_mail .= ob_get_contents();
    $mensaje_mail = eregi_replace("__EMAIL__",$email_usuario,$mensaje_mail);
    ob_end_clean();
    ob_end_flush();
    
    $ok = @mail($email_enviar, stripslashes($asunto), wordwrap(stripslashes($mensaje_mail)), $headers);
    

    Entonces solo hay que crear un HTML en plantilla/mail.php (poner los tags de html, body …) , este es el mensaje que se enviará. Además si le pones una etiqueta __EMAIL__ se podrá personalizar.

    A ver si llega el código. Cualquier duda ya sabéis.

  • 2 cosas. La plantilla es plantilla/mail.tpl.php no plantilla/mail.php
    y hay un fallo en el código que se ha producido al copiar, lo siento :D.

    
    $email_enviar = "prueba@prueba.com";
    $asunto = "El asunto que quieras";
    
    /* To send HTML mail, you can set the Content-type header. */
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
    $headers .= "From: prueba \r\n";
    $headers .= "Reply-To: prueba \r\n";
    $mensaje_mail="";
    
    ob_start();
    include('plantilla/mail.tpl.php');
    $mensaje_mail .= ob_get_contents();
    $mensaje_mail = eregi_replace("__EMAIL__",$email_usuario,$mensaje_mail);
    ob_end_clean();
    ob_end_flush();
    
  • @Chefwww: Muchas gracias Chefwww
    Estuve también escudriñando un poco y me encontré que el problema principal con gmail y outlook radica en la utilización de estilos.
    Acá les dejo el link donde puedan informase acerca de lo que acabo de comentar

    http://www.htmleando.com/archivo/email-gmail-microsoft-outlook-2007

  • Interesante el artículo giovanny, yo por regla general no pongo bgcolor ni css externos. Y normalmente se ve bien en los lectores de correos. Pero es bueno saber exactamente que etiquetas no son soportadas.

    Gracias!

  • Tampoco estaría de menos acabar aconsejando que el reply-to y el from sean la misma dirección.
    Porque últimamente hay servicios de correo electrónico que se ponen raros y te meten a spam rápidamente 😉

  • De las aplicaciones que nombran (Swift Mailer, phpmailer, etc) alguna de ellas sirve para envio de correo masivo (digamos unos 8 mil mails).

  • @kaminito: Si, lo que pasa es que deacuerdo a la capacidad del servidor de correo se pueden quedar algunos en cola, y más si es un servidor compartido.
    Pero existe mailbrain con el que se puede gestionar el envio de miles de correos, lo malo es que es pago.

  • Hola Agustin, veo que hay comentarios de todo tipo pero no veo que a nadie le moleste el encode utilizado.

    La idea de este post es la abstracción, como dice Agustin la magia esta en usar siempre la funcion mail(). Entonces porque si hablamos de abstraccion seguimos usando la norma iso cuanod no es unicode? Para hacerla redonda tendriamos que usar ya de una vez el UTF-8, ahi si quedaria super abstracto y reutilizable para mandar mails en turco, griego, chino o español sin jamas tocar nada.

    Yo lo que hago es meter todo en un metodo de una clase (tools) y pasarle como parametro un array. Si les interesa pongo abajo el codigo. Tambien acepto correcciones.

    public function sendMail(array $datos)
    	{
    		$headers = "From: " . strip_tags($datos['from']) . "\r\n";
    		$headers .= "Reply-To: ". strip_tags($datos['reply']) . "\r\n";
    		$headers .= "CC: ". strip_tags($datos['cc'])."\r\n";
    		$headers .= "MIME-Version: 1.0\r\n";
    		$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    		
    		return mail($datos['to'], $datos['subject'], $datos['body'], $headers);
    	}
    

    PARTE FRONT

    <?php
    require 'includes/init.php';
    $arrDatos['to'] = "julian.somoza@gmail.com";
    $arrDatos['from'] = $_POST['email'];
    $arrDatos['subject'] = "Formulario de contacto - Orfega";
    $arrDatos['body'] = "
    							Nombre: ".$_POST['name']."
    							Telefono: ".$_POST['phone']."
    							Mensaje: ".$_POST['comments'].
    							"";
    
    $oTools = new Tools();
    if($oTools->sendMail($arrDatos))
    {
    	header("Location: ".PATH."contact/thanks/");
    }
    else
    {
    	echo "El mail no pudo ser enviado. Consulte con el administrador del sitio.";
    }
    ?>
  • Una pregunta como podria implemnetar este codifo en html debido aque estoy haciendo algo parecido pero ahun es muy basico y apenas me inicio en php

  • Hola Agustin, veo que hay comentarios de todo tipo pero no veo que a nadie le moleste el encode utilizado.

    La idea de este post es la abstracción, como dice Agustin la magia esta en usar siempre la funcion mail(). Entonces porque si hablamos de abstraccion seguimos usando la norma iso cuanod no es unicode? Para hacerla redonda tendriamos que usar ya de una vez el UTF-8, ahi si quedaria super abstracto y reutilizable para mandar mails en turco, griego, chino o español sin jamas tocar nada.
    Yo lo que hago es meter todo en un metodo de una clase (tools) y pasarle como parametro un array. Si les interesa pongo abajo el codigo. Tambien acepto correcciones.

    public function sendMail(array $datos)
    	{
    		$headers = "From: " . strip_tags($datos['from']) . "\r\n";
    		$headers .= "Reply-To: ". strip_tags($datos['reply']) . "\r\n";
    		$headers .= "CC: ". strip_tags($datos['cc'])."\r\n";
    		$headers .= "MIME-Version: 1.0\r\n";
    		$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    
    		return mail($datos['to'], $datos['subject'], $datos['body'], $headers);
    	}
    

    PARTE FRONT

    <?php
    require 'includes/init.php';
    $arrDatos['to'] = "julian.somoza@gmail.com";
    $arrDatos['from'] = $_POST['email'];
    $arrDatos['subject'] = "Formulario de contacto - Orfega";
    $arrDatos['body'] = "
    
    							Nombre: ".$_POST['name']."
    							Telefono: ".$_POST['phone']."
    							Mensaje: ".$_POST['comments'].
    							"";
    
    $oTools = new Tools();
    if($oTools->sendMail($arrDatos))
    {
    	header("Location: ".PATH."contact/thanks/");
    }
    else
    {
    	echo "El mail no pudo ser enviado. Consulte con el administrador del sitio.";
    }
    ?>

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.