PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso enviar e-mail do gatilho PostgreSQL?


Veja o artigo depesz excelente como sempre e pg-message-queue.

Enviar e-mail diretamente do banco de dados pode não ser uma boa ideia. E se a resolução do DNS for lenta e tudo travar por 30 segundos e depois expirar? E se o seu servidor de e-mail estiver oscilando e demorar 5 minutos aceitar mensagens? Você terá sessões de banco de dados bloqueadas em seu gatilho até que esteja em max_connections e de repente você não pode fazer nada além de esperar ou começar a cancelar manualmente as transações.

O que eu recomendo é ter seu acionador NOTIFY a LISTEN script auxiliar que permanece permanentemente em execução e conectado ao banco de dados (mas não em uma transação).

Tudo o que seu gatilho precisa fazer é INSERT uma linha em uma tabela de filas e envie um NOTIFY . Seu script recebe o NOTIFY mensagem porque se registrou em LISTEN para isso, examina a tabela de filas e faz o resto.

Você pode escrever o programa auxiliar em qualquer linguagem conveniente; Eu costumo usar Python com psycopg2 .

Esse script pode enviar o e-mail com base nas informações encontradas no banco de dados. Você não precisa fazer toda a formatação de texto feia em PL/PgSQL, você pode substituir coisas em um modelo em uma linguagem de script mais poderosa, e apenas buscar os dados variáveis ​​do banco de dados quando um NOTIFY entra.

Com esta abordagem, seu ajudante pode enviar cada mensagem e só então remover as informações da tabela de filas. Dessa forma, se houver problemas transitórios com seu sistema de e-mail que causem falha no envio, você não perdeu as informações e poderá continuar tentando enviá-las até conseguir.

Se você realmente precisa fazer isso no banco de dados, veja PgMail.