sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik e-mail verzenden vanuit de PostgreSQL-trigger?

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.



  1. SQLite3.Exception:databaseschijfkopie is verkeerd ingedeeld

  2. Hoe kan ik ALLE beurzen weergeven die een gebruiker heeft ontvangen?

  3. SQLAlchemy:filteren op waarden die zijn opgeslagen in de geneste lijst van het JSONB-veld

  4. TANH() Functie in Oracle