Como enviar email en joomla en formato html y con archivos adjuntos

En joomla 1.5 se puede enviar un email facilmente usando la función sendMail() de la clase JUtility. En joomla 1.6 esta función fue depreciada y, aunque sigue funcionando en joomla 2.5, hay que pasarse ya al uso de JMail::sendMail(). Al usar estas funciones no tendremos que preocuparnos de la configuración del servidor de correo, contraseñas, si estamos en Windows o no, etc, pues todo ello ya se habrá configurado en el servidor y en la administración de Joomla y el framework de joomla se encargará de hacer llegar el email según la configuración del sistema.

Antes explicaba el envío de emails desde joomla utilizando JUtility::sendMail(), pero como dije esta función está depreciada desde joomla 1.6. Iba a explicar como utilizar también JMail::sendMail(), pero al final me he decantado por el envío de emails a través de JFactory::getMailer() pues así el mismo código funcionará en joomla 1.5, 1.6, 1.7, 2.5 y muy probablemente en versiones superiores futuras.

JFactory::getMailer()

A través de la función getMailer de la clase JFactory podremos enviar correos electrónicos desde nuestra aplicación de Joomla con unas pocas líneas de código y compatible con todas las versiones de joomla.

//creamos algunas variables para el email que vamos a enviar
$asunto = "Tienes un nuevo email";
$cuerpo = "Aquí va el texto del email.";
$para = "usario@mail.com";
$de = array("yo@midominio.com", "Mi Nombre");

//construimos el objeto a la clase JMail
$mailer = JFactory::getMailer();

//añadimos las variables adecuadas al objeto mailer
//añadimos el remitente (sender)
$mailer->setSender($de);
 
//añadimos el destinatario -- puede ser uno (string) o varios (array)
$mailer->addRecipient($para);

//añadimos el asunto y el contenido del email
$mailer->setSubject($asunto);
$mailer->setBody($cuerpo);
 
//una vez puestas todas las opciones enviamos el email
$mailer->send();

Ejemplo de email en formato html y con archivos adjuntos enviado desde Joomla

Como hemos visto, es muy facil enviar un email desde nuestra extensión de joomla. El ejemplo anterior es de lo más básico, veamos como podemos controlar más opciones del email enviado. Por ejemplo, enviar el email en formato HTML, enviar archivos adjuntos en el email o añadir direcciones a las que enviar copias y copias ocultas:

Obtenemos el puntero a la clase JMail a través de JFactory::getMailer de esta forma:

$mailer = JFactory::getMailer();

Y estos son todos los métodos que podemos utilizar:

$mailer->setSender($desde): Esta es la dirección de correo que aparecerá como remitente del email enviado. Este parámetro puede ser un string en el que especificar la dirección del remitente o un array en el que especificar la dirección y el nombre del remitente.

  • $mailer->setSender('direccion@remitente.com');
  • $mailer->setSender(array('direccion@remitente.com','Nombre Del Remitente'));

$mailer->addRecipient($para, $para_nombre = ""): email de destino y nombre del destinatario. $para puede ser un string o un array:

$para = 'destinatario@correo.com';
$para_nombre = 'Nombre destinatario';

//si hay varios destinatarios dejar $para_nombre vacio y se puede usar
$para[] = array('direccion1@correo.com','Nombre destinatiario 1'); $para[] = array('direccion2@correo.com','Nombre destinatiario 2'); //también puede ser sin especificar nombres de destinatarios $para = array('direccion1@correo.com','direccion2@correo.com');

$mailer->setSubject($asunto): String que contiene el asunto del email.

$mailer->setBody($cuerpo): Aquí ponemos el string que contiene el mensaje, el cuerpo del email. Puede contener html pero en este caso hay que especificar el modo Html en true llamando a la función IsHTML().

$mailer->IsHTML($html): si se llama a esta función mandamos el email en modo html. $html acepta true o false, false por defecto.

$mailer->addCC(): Aquí ponemos la dirección de email (o array de direcciones de email) a la que el correo electrónico será enviado como "Copia de Carbón". Todos los usuarios que reciban el email podrán ver quién más recibió copia. Este campo es opcional y está vacío por defecto.

$mailer->addBCC(): esta opción se conoce en español como CCO y es la "copia de carbón oculta". En esta opción se debe poner la dirección de email (o array de direcciones de email) a la que el email será enviado sin que el destinatario del email pueda ver quién más recibió copia. Parámetro opcional, vacío por defecto.

$mailer->addReplyTo(): Dirección de email a la que se enviará la respuesta si el destinatario hace clic en "responder". Opcional. Se puede utilizar un array de direcciones para que se envíe la respuesta a varias direcciones.

addBCC, addCC y addReplyTo aceptan los mismos parámetros que lo explicado para addRecipient.

$mailer->addAttachment($adjunto): A través de esta función añadimos archivos adjuntos al email. $adjunto es un string que contiene la ruta completa hacia el archivo que deseamos que se envíe como documento adjunto al email. También puede ser un array que contenga varias rutas a varios archivos. Parámetro opcional, nulo por defecto.

Vistos todos los parámetros, ¿Cómo enviar un email desde joomla en formato html y con documentos adjuntos? Veamos un ejemplo:

<?php 
  $mailer = JFactory::getMailer();
  $mailer->addRecipient(array('manolo@undominio.com','conchi@undominio.com'));
$mailer->setSender(array('info@dominio.com','Mi WEB')); $mailer->setSubject('Visitanos!'); $cuerpo = '<p>Hey!</p> <p>Mi blog ha sido actualizado.</p> <p>Puedes visitarlo en <a href="http://www.dominio.com">Mi blog</a></p>';

  //para especificar que el email va en formato html, y luego añadimos el cuerpo del email.
$mailer->isHtml(true);
$mailer->setBody($cuerpo);

//enviar copia
  $mailer->addCC('copia@mailser.com');

//enviar copias ocultas
$mailer->addBCC(array('simon@otrodominio.com','nick@otrodominio.com'));

//añadir archivos adjuntos
 $attachment[] = '/home/my_site/public_html/images/stories/food/coffee.jpg'; $attachment[] = '/home/my_site/public_html/images/stories/food/milk.jpg';
$mailer->addAttachment($attachment);

//establecer dirección y nombre al que se enviarán las respuestas
$mailer->addReplyTo('no_reply@dominio.com','No Reply - Mi Web');

//enviar el email una vez establecidas todas las opciones
if($mailer->send()) {
//email enviado
}
 ?>

Cómo has visto no es nada complicado enviar emails con Joomla en formato html y con archivos adjuntos, la clase JMail hace todo el trabajo duro. También es interesante el uso de la clase JMailHelper() que contiene varios métodos que nos ayudarán a que las direcciones utilizadas sean correctas o que el cuerpo y el asunto del email no contengan código malicioso. Esto es útil si estos datos provienen, por ejemplo, de un formulario que rellena un usuario en la web:

//importamos la clase JMailHelper
jimport('joomla.mail.helper');

//obtenemos los valores vie post o get
$para = JRequest::getVar('para', '');
$asunto = JRequest::getVar('asunto', '');
$mensaje = JRequest::getVar('mensaje', '');
$de = JRequest::getVar('de', '');
 
//verificamos los datos con los métodos de JMailHelper
if(!JMailHelper::isEmailAddress($para) || !JMailHelper::isEmailAddress($de))return false;
 
if(!JMailHelper::cleanAddress($para) || !JMailHelper::cleanAddress($de)) return false;

//limpiamos el asunto de posible código malicioso
$subject = JMailHelper::cleanSubject($asunto);

//limpiamos el mensaje (cuerpo del email) de posible código malicioso
$body = JMailHelper::cleanText($mensaje); 


Comentarios (0)

Smileys

:confused::cool::cry::laugh::lol::normal::blush::rolleyes::sad::shocked::sick::sleeping::smile::surprised::tongue::unsure::whistle::wink: