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.