sql >> Base de Datos >  >> RDS >> PostgreSQL

PL/Perl enviar correo en Postgresql

El hecho de que puedas no significa que debas hacerlo. Hay mejores maneras de hacer esto. No lo hagas directamente desde un PL. Si desea ignorar mis advertencias, use PL/PerlU y escríbalo como lo haría con cualquier otro cliente de correo electrónico. Puede usar cualquier módulo de CPAN que le guste para facilitarle la vida.

Dos razones para no hacerlo:

1) ¿Qué sucede si su transacción se anula o retrocede? Ha enviado el correo electrónico pero no ha realizado ningún cambio correspondiente en la base de datos. Estás haciendo cosas no transaccionales dentro de una transacción.

2) ¿Qué sucede si su correo electrónico se cuelga esperando una respuesta hasta que obtiene un tiempo de espera de tcp después de 2 minutos? ¿Vas a olvidarte de enviar un correo electrónico al cliente? ¿Cancelar la transacción (no se puede enviar un correo electrónico, no se puede decir que hemos enviado la pieza)?

Esto es malo ocurrencia. no lo hagas Agradezca a PostgreSQL por este error y muévalo a otro demonio.

Un mucho mejor El enfoque es usar LISTEN y NOTIFY, y tablas de cola. A continuación, puede crear una tabla como esta:

CREATE TABLE email_queue (
    id serial not null unique,
    email_from text,
    email_to text not null,
    body text not null
); 

CREATE FUNCTION email_queue_trigger() RETURNS TRIGGER 
LANGUAGE PLPGSQL AS $F$
    BEGIN
        NOTIFY emails_waiting;
    END;
$F$;

Luego haga que su procedimiento almacenado se inserte en esa tabla.

Luego, tenga una segunda aplicación de cliente que ESCUCHE en las escuchas de emails_waiting (sentencia sql LISTEN emails_waiting ) y luego hace lo siguiente:

  1. Comprueba si hay registros en la cola de correo electrónico. Si no, vaya a 3.
  2. lee datos, envía correos electrónicos, elimina el registro y confirma.
  3. Cuando la cola está vacía, duerme durante x segundos
  4. Al activarse, comprueba la sincronización. notificaciones (depende de las bibliotecas del cliente, consulte los documentos). Si los hay, pase al 1, si no, pase al 3.

Esto permite que sus correos electrónicos se pongan en cola para enviar su transacción y que esto se pase automáticamente a otra aplicación que luego puede conectarse con el MTA si así lo desea.

Esa segunda aplicación de cliente se puede escribir en el idioma de su elección, utilizando cualquier herramienta que conozca. Tiene la ventaja de hacer todas las cosas de la red fuera de la transacción, por lo que si está enviando a través de un segundo servidor SMTP y la conexión se cuelga, toda la transacción de la base de datos no espera 2 minutos para que se agote el tiempo de espera y se cancele la transacción. . También es más seguro frente a futuros cambios en los requisitos.