Creando mi propio sistema de mail masivo con PHP y MySQL

Ya llevo como algo más de un mes en la práctica en DelPuerto y estoy alegre de ello porque he aprendido hartas cosas que no sabía (que cuando la termine, las mencionaré más adelante). Pero como un pequeño adelanto, les cuento algo que me agradó hacer y desconozco que alguien más haya tenido esta ocurrencia: Crear mi propio sistema de mail masivo.

Ahora: ¿de dónde saqué la idea? ¿cómo nació? Simple: En la práctica necesitan un sistema de e-mail masivo para quien se suscriba a la lista y reciba contenidos, ojalá en HTML. Tras horas intensas de programación y buscando APIs y servicios que me pudieran ayudar con tal labor, he logrado construir dicha herramienta. Lo que usé para todo esto fue:

  • PHPMailer, para el envío de mails. Mejor y más seguro que la función mail que ya provee PHP. Además, lo admito: me encanta la orientación a objetos en PHP, aunque todavía tengo mucho que aprender de ahí. Y ese paradigma se usa en tal framework.
  • CKEditor, un editor HTML/WYSIWYG (What You See Is What You Get, o sea, lo que ves es lo tienes). Como soy el único que cacha de HTML en la práctica, tengo que crear un sistema que sea usable para quien quiera y que se familiarice rápidamente.
  • PHPMyAdmin: es la manera más viable de acceder a la base de datos de mi pega y administrarla. Aunque localmente igual la tengo, en el hosting que usan no tengo otra opción y no sé habilitar el ssh desde el cPanel :C
  • El uso intensivo de expresiones regulares. Hay tantas cosas que parsear, aparte, si uso PHPMailer, no es llegar y adjuntar contenido multimedia, como imágenes.
  • Los alert de Javascript: Me da flojera mostrar otro método de notificación xD pero quizás lo cambie.
  • Un mail que sea como el remitente de estos mails masivos. Como tengo acceso al hosting, pude crearlo y obtener la información necesaria para que PHPMailer se autentifique al SMTP.
Lo que hasta el momento hace:
  • Un formulario disponible para quien quiera llenar sus datos y se suscriba al mail. Por defecto, éste está desactivado.
  • Un panel de control, con un usuario y contraseña para poder acceder. Claramente, hice uso de las sesiones en PHP 😉
  • El administrador tiene las opciones de habilitar y deshabilitar mails. UPDATE: También puede borrarlos de la base de datos.
  • El administrador tiene a su disposición el formulario para enviar los mails masivos. Sólo se consideran los activados. El editor del cuerpo del mail usa CKEditor para mayor facilidad al escribir y darle formato, por ser WYSIWYG. También tiene la opción de conservar o cambiar la firma si así lo desea, y el editor para la misma también es WYSIWYG.
  • En el cuerpo del mail también puede insertar imágenes. Creo que no necesitan más que eso, aparte del texto, claro.
  • Valida todos los campos necesarios del mismo.
  • Desloguearse. Tan básico como el iniciar sesión 😛
  • UPDATE: Ahora el sistema puede mandarle un mail al suscriptor para que active y confirme su correo.
Lo que quiero mejorar/agregar:
  • El uso de jQuery. Quizás quieran efectos bonitos 😀
  • Adjuntar imágenes. Por el momento, ésas sólo se insertan desde una URL.
  • El diseño. Para qué andar con cosas: muy funcional será, pero es muy feo (es el común del informático programar cosas que sirven pero que a la vez son demasiado sencillos o muy feitos 😛 ) Por eso menos mal que hay un diseñador gráfico por estos lares :3
  • Otras cosas que iré descubriendo en el camino 😀
Para implementar un editor con CKEditor, pueden consultar acá la guía del desarrollador (en inglés) 😀
Acerca de cómo mandar mails usando PHPMailer, pueden verlo aquí 😛 Sin embargo, a ese tutorial le hice una mejora que pondré acá para que de verdad mande e-mails masivos.
Supongamos que tenemos una base de datos, con la tabla para el formulario, y que selecciono 2 campos: email y activado. También que quiero insertar imágenes desde una URL, aunque usando PHPMailer tiene otra forma.
El extracto de código sería como el siguiente:
[cc lang=”php” lines=”100″ width=”600″ line_numbers=”true” escaped=”true”] /* Acá hay pura challa anterior */
// Acá eliminamos los backslashes que trae la variable del mensaje desde el formulario
$mensaje = preg_replace(‘/\/i’,”,$_POST[‘mensaje’]);

//Patrones para el código de imágenes y el obtener el nombre de archivo de imagen
$patron_img = ‘/[0-9a-zA-Z]+[.](jpg|JPG|jpeg|gif|png)/’;
$regex = ‘/<img[^>]+>/i’;

//Creamos el array para obtener las URLs del mensaje
preg_match_all($regex,$mensaje,$links,PREG_SET_ORDER);

//Proceso de creación del array que guarda las URLs de imágenes del mensaje
$links_string = ”;
foreach($links as $link){
$links_string .= $link[0].’|’;
}

$array_links = explode(‘|’,$links_string,-1);

$img_url = array(); //Inicializando el arreglo de las URLs

$p_img_regex = ‘/(alt|title|src)=(“[^”]*”)/i’; //Por si tiene esas propiedades

for($i = 0; $i < count($array_links); $i++) {
$link_def = array();
preg_match($p_img_regex,$array_links[$i],$link_def);
$img_url[] = $link_def[2];
}

//Ahora empieza el proceso para guardar los nombres de los archivos desde las URLs
$img_file = array(); //Inicializando el arreglo para los archivos

for($i = 0; $i < count($img_url); $i++) {
$imagenes = array();
preg_match_all($patron_img,$img_url[$i],$imagenes,PREG_SET_ORDER);
$img_file[] = $imagenes[0];
}

$cadena = ”;

foreach($img_file as $img){
$cadena .= $img[0].’|’;
}

//Creando el arreglo para los nombres de los archivos
$img_name = explode(‘|’,$cadena,-1);

$ids = array();

//Para eliminar los sufijos del archivo con preg_split
$s_img = ‘/.(png|gif|jpeg|jpg|JPG)$/’;

for($i = 0; $i < count($img_name); $i++) {
$elemento = preg_split($s_img,$img_name[$i],-1);
$id_img = $elemento[0].’img’;
$ids[] = ‘cid:’.$id_img;
$cid = ‘cid:’.$id_img;
//Así es como en PHPMailer se adjuntan las imágenes
$mail->AddEmbeddedImage($img_name[$i],$cid,$img_name[$i]);
}

//Creando el nuevo mensaje. $img_url e $ids son arreglos.
$nuevo_mensaje = str_replace($img_url,$ids,$mensaje);

//El cuerpo con una firma previamente definida
$mail->Body = $nuevo_mensaje.'<br> — <br>’.$firma;

//Definamos que sea HTML
$mail->IsHTML(true);

//Incluyendo código para conectarse a la base de datos
include(“../conectar.php”);
$tabla = “mailmasivo”;
$selecciona = mysql_select_db($bd,$conecta) or die (“No se puede seleccionar la base de datos $bd”);

//Seleccionando las tablas email y activado
$consulta = “select email,activado from $tabla”;
$q = mysql_query($consulta) or die (“No se pudo realizar la consulta”);
//La parte del mail masivo

while($mailses = mysql_fetch_row($q)){
if($mailses[1] == 1)
$mail->AddAddress($mailses[0]);
}

// Aquí más challa para mandar mensaje y/o algo más

[/cc]

Lo demás se les tendrá que ocurrir a ustedes, porque por ahora, esto es top secret 😉

Y claro, una muestra.

 

Espero que les sea de utilidad. Bienvenidos los comentarios, y si toman algo de acá, no olviden darme créditos 😀

Jorgicio

4 comentarios en “Creando mi propio sistema de mail masivo con PHP y MySQL

  1. Hola Jorcicio,
    Ya usaste jquery para animar lo que envias por emailing? no te ha dado problemas al tratarse de scripts que te lo interprete como codigo malicioso el explorador o el antivirus?

    Espero tus comentarios, gracias de antemano!

    • Hola 😀
      Al decir verdad, ya comprobé que con demasiados mails, sí da problemas, eso ya depende de las políticas del hosting que hayas contratado y que permite estas cosas, porque suelen considerarlas SPAM. Así que fíjate bien en esos detalles antes de probar 🙂
      Y respecto a animar lo que envío… dudo que se pueda, hasta el momento, no he visto animaciones en un correo :S

      Gracias por pasarte y espero que te haya servido de ayuda 😀
      Saludos

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *