Zie het uitstekende depesz-artikel en pg-message-queue.
Het is misschien geen goed idee om e-mail rechtstreeks vanuit de database te verzenden. Wat als de DNS-resolutie traag is en alles 30 seconden blijft hangen en daarna een time-out krijgt? Wat als uw mailserver wankelt en 5 minuten duurt? berichten accepteren? Databasesessies blijven hangen in uw trigger totdat u bij max_connections
bent en plotseling kunt u niets anders doen dan wachten of handmatig transacties annuleren.
Wat ik zou aanraden is om je trigger NOTIFY
. te hebben a LISTEN
ing helper-script dat permanent actief blijft en verbonden blijft met de database (maar niet in een transactie).
Het enige wat je trigger hoeft te doen is INSERT
een rij in een wachtrijtabel en stuur een NOTIFY
. Je script krijgt de NOTIFY
bericht omdat het zich heeft geregistreerd bij LISTEN
daarvoor, onderzoekt de wachtrijtabel en doet de rest.
U kunt het hulpprogramma in elke gewenste taal schrijven; Ik gebruik meestal Python met psycopg2
.
Dat script kan de e-mail verzenden op basis van informatie die het in de database vindt. U hoeft niet alle lelijke tekstopmaak in PL/PgSQL te doen, u kunt in plaats daarvan dingen vervangen door een sjabloon in een krachtigere scripttaal, en gewoon de variabele gegevens uit de database halen wanneer een NOTIFY
komt binnen.
Met deze aanpak kan uw helper elk bericht verzenden en pas daarna de informatie uit de wachtrijtabel verwijderen. Op die manier, als er tijdelijke problemen zijn met uw e-mailsysteem waardoor het verzenden mislukt, bent u de informatie niet kwijt en kunt u blijven proberen om het te verzenden totdat het is gelukt.
Als je dit echt in de database moet doen, zie PgMail.