Zobacz artykuł depesz o doskonałych jak zwykle i pg-message-queue.
Wysyłanie e-maili bezpośrednio z bazy danych może nie być dobrym pomysłem. Co się stanie, jeśli rozpoznawanie DNS jest powolne i wszystko zawiesza się na 30 sekund, a następnie kończy się? Co zrobić, jeśli Twój serwer poczty chwieje się i zajmuje 5 minut akceptować wiadomości? Sesje bazy danych będą zawieszone w wyzwalaczu, dopóki nie osiągniesz max_connections
i nagle nie możesz nic zrobić, tylko czekać lub ręcznie anulować transakcje.
Zalecam posiadanie wyzwalacza NOTIFY
LISTEN
ing skryptu pomocniczego, który pozostaje stale uruchomiony i połączony z bazą danych (ale nie w transakcji).
Wszystko, co musi zrobić Twój wyzwalacz, to INSERT
wiersz do tabeli kolejki i wyślij NOTIFY
. Twój skrypt otrzyma NOTIFY
wiadomość, ponieważ została zarejestrowana w LISTEN
w tym celu sprawdza tabelę kolejek i robi resztę.
Program pomocniczy można napisać w dowolnym dogodnym języku; Zwykle używam Pythona z psycopg2
.
Ten skrypt może wysłać wiadomość e-mail na podstawie informacji znalezionych w bazie danych. Nie musisz robić całego brzydkiego formatowania tekstu w PL/PgSQL, możesz zamiast tego podstawić elementy do szablonu w potężniejszym języku skryptowym i po prostu pobrać dane zmiennej z bazy danych, gdy NOTIFY
wchodzi.
Dzięki takiemu podejściu Twój pomocnik może wysłać każdą wiadomość i dopiero wtedy usunąć informacje z tabeli kolejki. W ten sposób, jeśli wystąpią przejściowe problemy z systemem pocztowym, które powodują niepowodzenie wysyłania, nie utracisz informacji i możesz kontynuować próby wysłania ich, dopóki się nie uda.
Jeśli naprawdę musisz to zrobić w bazie danych, zobacz PgMail.