Extendiendo PHPMailer

Como habiamos visto en el artículo Envío de email con PHP, PHPMailer, esta clase facilita mucho el envio de mails con PHP.

Como desarrollador he adaptado un poco esta libreria a mis necesidades, como por ejemplo hacer debug sin necesidad de enviar el mail (ya sea por no tener un servidor SMTP local o para no tener que esperar a que se envie y llegue), o formatear los mails salientes con el "estilo" de la empresa.

Para esto les traigo el código base para que puedan usarlo, adaptarlo a sus necesidades o mejorarlo según convenga.

Primero incluyo mi archivo de configuración en el que tengo datos de acceso a base, contantes del sistema, etc. Y también incluyo mi clase para consulta a base de datos y la libería PHPMailer:

include_once("../../conf/archivo_configuracion.php");

include_once("class.mysql.php");
include_once("class.phpmailer.php");

Luego creo mi clase extendiendo con la de PHPMailer y seteo algunas variables de clase:

class Mensajeria extends PHPMailer {
var $debugg   = TRUE; // cambiando este valor paso a modo debug
var $para               = NULL;
var $de                 = SITIO_EMAIL;
var $asunto             = "";
var $cuerpo             = "";
var $contenido          = "";
var $copia  = "";
var $copiaO  = "";
}

Luego creo algunos métodos de mi clase, como por ejemplo para el envio del mensaje. Como se puede ver, valido si estoy en modo de debug para imprimir en pantalla o para enviar el mail de modo convencional:

function enviar( $debug = FALSE ) {
 $this->Subject        = $this->asunto;
 $this->estilar_cuerpo( $this->contenido );
 if($debug){
   echo "De:   " . $this->de[1] . " (" . $this->de[0] . ")
";
   echo "Para: " . $this->para[1] . " (" . $this->para[0] . ")
";
   echo "

Asunto: " . $this->asunto . "

"; echo $this->cuerpo; }else{ $this->Body = $this->cuerpo; $this->From = $this->de[0]; $this->FromName = $this->de[1]; $this->AddAddress( $this->para[0], $this->para[1] ); $this->send(); $this->ClearAddresses(); } }

Con el siguiente método formateamos nuestro mail, es una plantilla HTML que podemos crear a nuestro gusto. Sólo debemos pasarle como parámetro el cuerpo del mail y se encargará de colocarlo en nuestro maquetado.

function estilar_cuerpo($contenido){
 ob_start();
 
 echo '
OSKOI

 

'; $this->cuerpo = ob_get_contents(); ob_end_clean(); }

El siguiente método es muy útil y nos permite reemplazar en el texto del primer parámetro el valor correspondiente almacenado en el array del segundo parámetro. Lo utilizo ara personalizar los emails, por ejemplo tengo el siguiente mensaje de plantilla:

Hola [nombre_completo]!!, este es un mail de prueba.
Saludos de parte de [nombre_empresa].

Entonces debería tener un array con los valores correspondientes para cada campo entre corchetes:

$aDatos['nombre_completo'] = "Pepito";
$aDatos['nombre_empresa'] = "Pepito S.A.";

Y al utilizar el método el resultado sería:

Hola Pepito!!, este es un mail de prueba.
Saludos de parte de Pepito S.A..

Este es el método en cuestión:

function procesar_etiquetas( $texto, $vars ) {
    foreach ( $vars AS $clave => $valor ) {
        $texto    = str_replace( "[".$clave."]", $valor, $texto );
    }

    return $texto;
}

Con esto ya tenemos todo listo para crear nuestro metodos de clase para cada caso, por ejemplo podriamos tener uno para contactar a nuestros clientes:

function contactarCliente($id_cliente){

$db = new db();

$query = "SELECT * FROM `mensajeria` WHERE `constante` = 'CONTACTAR_CLIENTE'";

$mensaje = $db->getRow($query, "NaN", ARRAY_A);

$query = "SELECT CONCAT(nombre, ' ', apellido) AS nombre_completo, email FROM `clientes` WHERE `id` = $id_cliente";

$datos = $db->getRow($query, "NaN", ARRAY_A);

$datos['asunto'] = $this->procesar_etiquetas( $mensaje["asunto"],  $datos );

$this->de             = array( SITIO_EMAIL, SITIO_NOMBRE );
$this->para           = array( $datos['email'], $datos['nombre_completo'] );
$this->asunto         = "Contacto desde " . SITIO_NOMBRE;
$this->contenido      = $this->procesar_etiquetas( $mensaje["mensaje"],  $datos );
$this->enviar($this->debugg);  

return true;

}

Saludos y que lo disfruten!

Bookmark and Share

0 comentarios:

Publicar un comentario