Paquete para envío de emails App\Component\Email

Paquete para envío de emails App\Component\Email

Hay una variedad grande de paquetes para el envío de emails. Concretamente he probado dos, la que trae Symfony (Symfony\Component\Mailer\MailerInterface y Symfony\Component\Mime\Email;) y Laravel (Illuminate\Support\Facades\Mail) para mi gusto creo que aplican demasiadas capas para configurar un envío. Probablemente es porque se ajustan a algún patrón de diseño.

Desarrollando un gestor de crons y comandos en php, se me presentó la necesidad de hacer envíos en ciertas tareas. No me llamaba mucho la atención tener que instalar algún paquete porque suelen instalar dependencias y cada dos por tres me llegan warnings de actualización. Así pues, tocaba reinventar la rueda. :)

Hace ya algún tiempo creé una clase similar pero no la dejé del todo fina. Reciclando ese código y estructurándolo mejor completé este mini paquete App\Component\Email

He intentado que tenga la mínima dependencia, es decir, que si te descargas la carpeta Email y comentas el trait del log (use App\Traits\LogTrait as Log) en la clase abstracta AEmail podrías reutilizarlo en tu app.

El paquete realmente es un wrapper que por un lado usa la función nativa de php mail(...) y por otro, la librería de PEAR require_once("Mail.php"); require_once("Mail/mime.php"); El motivo de recurrir a PEAR es porque la función mail solo admite la configuración del php.ini, según mi proveedor de hosting esta va fija. Sin embargo, PEAR me permite configurar varios proveedores de correo: gmail, hotmail, etc.

A continuación explico como se realiza el envío: (código fuente de la imagen)

<?php //esta es la plantilla del array de configuración que se le pasaría $config = [ "email" => "someemail@gmail.com", "host" => "ssl://smtp.gmail.com", "username" => "someemail@gmail.com", "password" => "Mi-Password-1234", "auth" => true, "port" => "465", "debug" => true, ]; private function _send() { $this->logpr("emailservice._send"); $this->logpr($this->data,"data"); //ver array anterior config $config = $this->emails["configs"][0]; /** * si se le pasa el array anterior la factoría devuelve una * instancia de la clase App\Component\Email\PearEmail * que es el wrapper de Pear * En caso contrario se crea una instancia de * App\Component\Email\FuncEmail que es el wrapper de la función * mail() */ $r = EmailComponent::get($config) //en caso de gmail es el email de la cuenta (someemail@gmail.com) ->set_from($config["email"]) //los destinatarios, se aplican varios add_to como sean necesarios ->add_to($this->emails["contacts"][0]) //el asunto ->set_subject($this->data["subject"]) //el contenido, por defecto se envía en formato HTML ->set_content($this->data["content"]) //la ruta o rutas de los archivos a adjuntar ->add_attachment([ "path"=>$this->data["path"], ]) //se intenta el envío ->send() //si ha ocurrido algún error se devolverá un array ->get_errors() ; //si r está vacio es que todo ha ido bien $this->logpr($r, "error?"); }

El código completo de este ejemplo lo puedes encontrar aqui

Autor: Eduardo A. F.
Publicado: 11-12-2020 20:29
Actualizado: 11-12-2020 20:35