См. отличную статью о depesz и pg-message-queue.
Отправка электронной почты непосредственно из базы данных может быть не самой лучшей идеей. Что делать, если разрешение DNS медленное и все зависает на 30 секунд, а затем истекает время ожидания? Что делать, если ваш почтовый сервер шатается и принимает сообщения 5 минут? Вы будете зависать от сеансов базы данных в своем триггере до тех пор, пока не достигнете max_connections
, и внезапно вы ничего не сможете сделать, кроме как подождать или начать отмену транзакций вручную.
Я бы порекомендовал, чтобы ваш триггер NOTIFY
LISTEN
ing вспомогательный скрипт, который постоянно работает и подключен к БД (но не в транзакции).
Все, что нужно сделать вашему триггеру, - это INSERT
создать строку в таблице очереди и отправить NOTIFY
. Ваш сценарий получает сообщение NOTIFY
, потому что он зарегистрировался для него в LISTEN
, проверяет таблицу очереди и делает все остальное.
Вы можете написать вспомогательную программу на любом удобном языке; Обычно я использую Python с psycopg2
.
Этот сценарий может отправлять электронную почту на основе информации, которую он находит в базе данных. Вам не нужно выполнять все уродливое форматирование текста в PL / PgSQL, вместо этого вы можете подставлять элементы в шаблон на более мощном языке сценариев и просто извлекать данные переменных из базы данных, когда приходит NOTIFY
.
При таком подходе ваш помощник может отправлять каждое сообщение и только затем удалять информацию из таблицы очереди. Таким образом, если в вашей почтовой системе возникают временные проблемы, которые приводят к сбою отправки, вы не потеряли информацию и можете продолжать попытки отправить ее, пока не добьетесь успеха.
Если вам действительно необходимо сделать это в базе данных, см. PgMail.
person
Craig Ringer
schedule
17.08.2012