PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich E-Mails vom PostgreSQL-Trigger senden?

Siehe den wie gewohnt ausgezeichneten depesz-Artikel und pg-message-queue.

Das Versenden von E-Mails direkt aus der Datenbank ist möglicherweise keine gute Idee. Was ist, wenn die DNS-Auflösung langsam ist und alles 30 Sekunden lang hängt und dann abläuft? Was ist, wenn Ihr Mailserver wackelt und 5 Minuten benötigt Nachrichten annehmen? Sie werden Datenbanksitzungen in Ihrem Trigger aufhängen, bis Sie bei max_connections sind und plötzlich können Sie nichts anderes tun, als zu warten oder Transaktionen manuell zu stornieren.

Was ich empfehlen würde, ist, Ihren Trigger NOTIFY zu haben a LISTEN ing-Hilfsskript, das permanent ausgeführt und mit der DB verbunden bleibt (jedoch nicht in einer Transaktion).

Alles, was Ihr Trigger tun muss, ist INSERT eine Zeile in eine Warteschlangentabelle und senden Sie ein NOTIFY . Ihr Skript bekommt den NOTIFY Nachricht, weil sie sich bei LISTEN registriert hat überprüft dafür die Warteschlangentabelle und erledigt den Rest.

Sie können das Hilfsprogramm in jeder beliebigen Sprache schreiben; Normalerweise verwende ich Python mit psycopg2 .

Dieses Skript kann die E-Mail basierend auf Informationen senden, die es in der Datenbank findet. Sie müssen nicht die ganze hässliche Textformatierung in PL/PgSQL vornehmen, Sie können Dinge stattdessen in einer Vorlage in einer leistungsfähigeren Skriptsprache ersetzen und einfach die variablen Daten aus der Datenbank abrufen, wenn ein NOTIFY kommt rein.

Mit diesem Ansatz kann Ihr Helfer jede Nachricht senden und erst dann die Informationen aus der Warteschlangentabelle entfernen. Auf diese Weise haben Sie bei vorübergehenden Problemen mit Ihrem E-Mail-System, die dazu führen, dass das Senden fehlschlägt, die Informationen nicht verloren und können weiterhin versuchen, sie zu senden, bis Sie erfolgreich sind.

Wenn Sie dies wirklich in der Datenbank tun müssen, siehe PgMail.