pgsmtp: enviando correos desde PostgreSQL

En la realización de una migración de datos desde otro gestor hacia PostgreSQL, tuvimos la necesidad de enviar correos electrónicos desde dentro del gestor, es decir desde dentro lo lógica de negocio en las funciones, PostgreSQL no brinda esta funcionalidad como nativa, pero gracias a la extensibilidad del gestor se puede desarrollar dicha funcionalidad. Por supuesto antes vimos alguna que otra solución al respecto, por ejemplo esta, la cual es en plTCL, y hace años está sin soporte,  también analizamos alguna que otra solución aislada, de las cuales decidimos hacer una nueva y compartirla con ustedes :D.

Para el desarrollo de la misma utilizamos plpython y la biblioteca smtp que está en la biblioteca estándar de python y la empaquetamos en una extensión llamada pgsmtp y puede ser descargada de aquí en PGXN o  en el github. Dicha extensión permite enviar correos electrónicos y adjuntos desde PostgreSQL La instalación de la misma es sencilla y la interacción también :D.

Una vez descargada, instalamos las dependencias, que no es más que el plpython (python 2.x) correspondiente a la versión de PostgreSQL que tenemos instalada, y luego instalamos las extensión en mi caso( PostgreSQL 9.4):

sudo apt-get install postgresql-plpython-9.4
make install

Añadimos el lenguaje plpython a la base de datos y creamos la extensión:


CREATE EXTENSION plpythonu;
CREATE EXTENSION pgsmtp;

Agregamos el usuario y las credenciales pertinentes para enviar los correos en la tabla  pgsmtp.user_smtp_data, lo cual es necesario e imprescindible para que funcione(utilicé gmail), se pueden tener más de un usuario y servidor SMTP para enviar correos:

INSERT INTO pgsmtp.user_smtp_data VALUES ('asot...@gmail.com','smtp.gmail.com',587,'mypass')

--Enviamos un correo con copia a otros usuarios con la función:

-- pgsmtp.pg_smtp_mail(de, para, con_copia,asunto,texto)
select pgsmtp.pg_smtp_mail('asot...@gmail.com','asot...@gmail.com',array['mail@mail.com','other@mail.com'],'correo de prueba','Correo enviado desde postgresql usando pgsmtp');

--Enviamos un correo con copia sin copia con la misma función, pero en la copia pasamos un arreglo vacío:

-- pgsmtp.pg_smtp_mail(de, para, con_copia,asunto,texto)
select pgsmtp.pg_smtp_mail('asot...@gmail.com','asot...@gmail.com',array[''],'correo de prueba','Correo enviado desde postgresql usando pgsmtp');

Y listo así de sencillo :D, a nosotros nos funcionó de maravillas, esperemos que a ustedes les funcione, esta no es la única vía para hacerlo, también puede explotarse el mecanismo de LISTEN-NOTIFY que proporciona PostgreSQL, se puede enviar una señal desde una función y que esté escuchando un programa esta señal y una vez que llegue la señal envíe el correo. Pero bueno para el escenario donde se necesite enviar el correo desde dentro del gestor pgsmtp seria una buena opción.

Nos vemos en otra 😀

 

PD , se pueden enviar adjuntos también, visite el repo en github ( https://github.com/asotolongo/pgsmtp )

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s