Consulte el excelente artículo de depesz como de costumbre y pg-message-queue.
Enviar correo electrónico directamente desde la base de datos puede no ser una gran idea. ¿Qué sucede si la resolución de DNS es lenta y todo se cuelga durante 30 segundos y luego se agota? ¿Qué pasa si su servidor de correo se tambalea y tarda 5 minutos para aceptar mensajes? Obtendrá sesiones de base de datos colgadas en su disparador hasta que esté en max_connections
y de repente no puede hacer nada más que esperar o comenzar a cancelar transacciones manualmente.
Lo que recomendaría es tener su activador NOTIFY
un LISTEN
ing script de ayuda que permanece permanentemente ejecutándose y conectado a la base de datos (pero no en una transacción).
Todo lo que tiene que hacer su disparador es INSERT
una fila en una tabla de cola y envíe un NOTIFY
. Su secuencia de comandos recibe el NOTIFY
mensaje porque se ha registrado en LISTEN
para ello, examina la tabla de colas y hace el resto.
Puede escribir el programa de ayuda en cualquier idioma que sea conveniente; Usualmente uso Python con psycopg2
.
Ese script puede enviar el correo electrónico según la información que encuentre en la base de datos. No tiene que hacer todo el formato de texto feo en PL/PgSQL, puede sustituir las cosas en una plantilla en un lenguaje de secuencias de comandos más potente y simplemente obtener los datos variables de la base de datos cuando un NOTIFY
entra.
Con este enfoque, su ayudante puede enviar cada mensaje y solo luego eliminar la información de la tabla de cola. De esa forma, si hay problemas transitorios con su sistema de correo que hacen que el envío falle, no habrá perdido la información y podrá seguir intentando enviarla hasta que lo logre.
Si realmente debe hacer esto en la base de datos, consulte PgMail.