PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PL/Perl изпраща поща в Postgresql

Това, че можете, не означава, че трябва. Има по-добри начини да направите това. Не го правете директно от PL. Ако искате да пренебрегнете предупрежденията ми, използвайте PL/PerlU и го напишете, както бихте направили всеки друг имейл клиент. Можете да използвате всякакви CPAN модули, които харесвате, които улесняват живота ви.

Две причини да не го правите:

1) Какво става, ако вашата транзакция бъде прекратена/отменена? Изпратихте имейла, но не направихте съответната промяна в базата данни. Вие правите не-транзакционни неща в транзакция.

2) Какво ще стане, ако имейлът ви виси в очакване на отговор, докато не получите tcp таймаут след 2 минути? Ще забравиш ли да изпратиш имейл на клиента? Прекратяване на транзакцията (не мога да изпратя имейл, не мога да кажа, че сме изпратили частта!)?

Това е лоши идея. не го правете Благодарете на PostgreSQL за тази грешка и го преместете в друг демон.

Много по-добре подходът е да се използват LISTEN и NOTIFY и таблици на опашка. След това можете да създадете таблица като тази:

CREATE TABLE email_queue (
    id serial not null unique,
    email_from text,
    email_to text not null,
    body text not null
); 

CREATE FUNCTION email_queue_trigger() RETURNS TRIGGER 
LANGUAGE PLPGSQL AS $F$
    BEGIN
        NOTIFY emails_waiting;
    END;
$F$;

След това накарайте вашата съхранена процедура да се вмъкне в тази таблица.

След това имайте второ клиентско приложение, което СЛУША на прослушванията на emails_waiting (sql израз LISTEN emails_waiting ) и след това прави следното:

  1. Проверява дали има записи в email_queue. Ако не отидете на 3.
  2. чете данни, изпраща имейл, изтрива записа и се ангажира.
  3. Когато опашката е празна, заспива за x секунди
  4. При събуждане проверява за асинхронизация. известия (зависи от клиентските библиотеки, проверете документите). Ако има, отидете на 1, ако не, отидете на 3.

Това позволява вашите имейли да бъдат поставени на опашка за изпращане във вашата транзакция и това автоматично да бъде предадено на друго приложение, което след това може да се свърже с MTA, ако изберете.

Това второ клиентско приложение може да бъде написано на езика по ваш избор, като се използват каквито инструменти познавате. Той има предимството да прави всички мрежови неща извън транзакцията, така че ако изпращате през втори SMTP сървър и връзката прекъсне, цялата ви транзакция на базата данни не чака 2 минути, за да изтече и прекъсне транзакцията . Освен това е по-безопасно срещу бъдещи промени в изискванията.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да разделя заявка на няколко заявки или да създам паралелизъм, за да ускоря заявката?

  2. PostgreSQL, Npgsql връща 42601:синтактична грешка при или близо до $1

  3. Използване на колона в sql join без добавянето й към група по клауза

  4. openerp:вътрешна грешка в сървъра на ubuntu

  5. Мога ли да добавя УНИКАЛНО ограничение към PostgreSQL таблица, след като вече е създадена?