Se den utmärkta som vanligt depesz-artikeln och pg-meddelandekön.
Att skicka e-post direkt från databasen kanske inte är en bra idé. Vad händer om DNS-upplösningen är långsam och allt hänger sig i 30 sekunder och sedan timeout? Vad händer om din e-postserver har en vinglig och tar 5 minuter acceptera meddelanden? Du kommer att få databassessioner hängda i din trigger tills du är på max_connections
och plötsligt kan du inte göra annat än att vänta eller börja manuellt avbryta transaktioner.
Det jag skulle rekommendera är att ha utlösaren NOTIFY
en LISTEN
ett hjälpskript som körs permanent och är anslutet till databasen (men inte i en transaktion).
Allt din utlösare behöver göra är att INSERT
en rad i en kötabell och skicka en NOTIFY
. Ditt skript får NOTIFY
meddelande eftersom det har registrerats för LISTEN
för det, undersöker kötabellen och gör resten.
Du kan skriva hjälpprogrammet på vilket språk som helst; Jag använder vanligtvis Python med psycopg2
.
Det skriptet kan skicka e-postmeddelandet baserat på information som det hittar i databasen. Du behöver inte göra all ful textformatering i PL/PgSQL, du kan istället byta ut saker i en mall på ett kraftfullare skriptspråk och bara hämta variabeldata från databasen när en NOTIFY
kommer in.
Med detta tillvägagångssätt kan din hjälpare skicka varje meddelande och först därefter ta bort informationen från kötabellen. På det sättet om det finns tillfälliga problem med ditt e-postsystem som gör att sändningen misslyckas, har du inte förlorat informationen och kan fortsätta att försöka skicka den tills du lyckas.
Om du verkligen måste göra detta i databasen, se PgMail.