Voir l'excellent article depesz, comme d'habitude, et pg-message-queue.
L'envoi d'e-mails directement à partir de la base de données n'est peut-être pas une bonne idée. Que se passe-t-il si la résolution DNS est lente et que tout se bloque pendant 30 secondes, puis expire ? Que faire si votre serveur de messagerie est bancal et prend 5 minutes accepter les messages ? Vous obtiendrez des sessions de base de données bloquées dans votre déclencheur jusqu'à ce que vous soyez à max_connections
et tout à coup, vous ne pouvez rien faire d'autre qu'attendre ou commencer à annuler manuellement les transactions.
Ce que je recommanderais, c'est d'avoir votre déclencheur NOTIFY
un LISTEN
ing script d'assistance qui reste en cours d'exécution en permanence et connecté à la base de données (mais pas dans une transaction).
Tout ce que votre déclencheur doit faire est INSERT
une ligne dans une table de file d'attente et envoyer un NOTIFY
. Votre script obtient le NOTIFY
message car il s'est enregistré sur LISTEN
pour cela, examine la table de file d'attente et fait le reste.
Vous pouvez écrire le programme d'assistance dans n'importe quel langage qui vous convient; J'utilise habituellement Python avec psycopg2
.
Ce script peut envoyer l'e-mail en fonction des informations qu'il trouve dans la base de données. Vous n'avez pas à faire tout le formatage de texte laid en PL/PgSQL, vous pouvez substituer des éléments dans un modèle dans un langage de script plus puissant à la place, et simplement récupérer les données variables de la base de données lorsqu'un NOTIFY
entre.
Avec cette approche, votre assistant peut envoyer chaque message et ensuite seulement supprimer les informations de la table de file d'attente. De cette façon, si votre système de messagerie rencontre des problèmes transitoires qui entraînent l'échec de l'envoi, vous n'avez pas perdu les informations et pouvez continuer à essayer de les envoyer jusqu'à ce que vous réussissiez.
Si vous devez vraiment le faire dans la base de données, consultez PgMail.