Se den fremragende-som-sædvanlige depesz-artikel og pg-besked-kø.
Det er måske ikke en god idé at sende e-mail direkte fra databasen. Hvad hvis DNS-opløsningen er langsom, og alt hænger i 30 sekunder og derefter timeout? Hvad hvis din e-mail-server ryger og tager 5 minutter at acceptere beskeder? Du vil få databasesessioner hængt op i din trigger, indtil du er ved max_connections
og pludselig kan du ikke gøre andet end at vente eller begynde manuelt at annullere transaktioner.
Det, jeg vil anbefale, er at have din trigger NOTIFY
en LISTEN
et hjælpescript, der forbliver permanent kørende og forbundet til DB'en (men ikke i en transaktion).
Det eneste, din trigger skal gøre, er INSERT
en række ind i en køtabel og send en NOTIFY
. Dit script får NOTIFY
besked, fordi den er registreret til LISTEN
for det, undersøger køtabellen og klarer resten.
Du kan skrive hjælpeprogrammet på et hvilket som helst sprog, der passer dig; Jeg bruger normalt Python med psycopg2
.
Dette script kan sende e-mailen baseret på oplysninger, det finder i databasen. Du behøver ikke at lave al den grimme tekstformatering i PL/PgSQL, du kan erstatte ting med en skabelon i et mere kraftfuldt scriptsprog i stedet, og bare hente de variable data fra databasen, når en NOTIFY
kommer ind.
Med denne tilgang kan din hjælper sende hver besked og først derefter fjerne informationen fra køtabellen. På den måde, hvis der er forbigående problemer med dit mailsystem, der får afsendelsen til at mislykkes, har du ikke mistet oplysningerne og kan fortsætte med at forsøge at sende dem, indtil det lykkes.
Hvis du virkelig skal gøre dette i databasen, se PgMail.