sql >> Databáze >  >> RDS >> PostgreSQL

PL/Perl posílejte poštu v Postgresql

To, že můžeš, neznamená, že bys měl. Existují lepší způsoby, jak to udělat. Nedělejte to přímo z PL. Pokud chcete ignorovat moje varování, použijte PL/PerlU a napište to jako kterýkoli jiný e-mailový klient. Můžete použít libovolné moduly CPAN, které vám usnadní život.

Dva důvody proč ne:

1) Co když se vaše transakce přeruší / vrátí zpět? Odeslali jste e-mail, ale neprovedli jste žádnou odpovídající změnu v databázi. V rámci transakce děláte netransakční věci.

2) Co když váš e-mail přestane čekat na odpověď, dokud vám po 2 minutách nevyprší časový limit tcp? Zapomenete na e-maily zákazníkovi? Zrušit transakci (nelze odeslat e-mail, nemůžeme říci, že jsme část odeslali!)?

To je špatné idea. Nedělej to. Poděkujte PostgreSQL za tuto chybu a přesuňte ji do jiného démona.

Mnohem lepší přístup je používat LISTEN a NOTIFY a frontové tabulky. Potom můžete vytvořit tabulku takto:

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$;

Poté nechte svou uloženou proceduru vložit do této tabulky.

Pak mějte druhou klientskou aplikaci, která LISTEN naslouchá na emails_waiting (výpis SQL LISTEN emails_waiting ) a poté postupujte následovně:

  1. Zkontroluje, zda jsou ve frontě emailů záznamy. Pokud ne, přejděte na 3.
  2. čte data, odešle e-mail, odstraní záznam a provede potvrzení.
  3. Když je fronta prázdná, spí x sekund
  4. Při probuzení zkontroluje asynchronní. upozornění (závisí na klientských knihovnách, zkontrolujte dokumenty). Pokud existují, přejděte na 1, pokud ne, přejděte na 3.

To umožňuje, aby vaše e-maily byly zařazeny do fronty pro odeslání vaší transakce a aby byly automaticky předány jiné aplikaci, která se pak může spojit s MTA, pokud si to přejete.

Tato druhá klientská aplikace může být napsána v jazyce, který si vyberete, pomocí jakýchkoli nástrojů, které znáte. Má výhodu v tom, že provádí všechny síťové věci mimo transakci, takže pokud odesíláte přes druhý server SMTP a připojení přestane fungovat, celá vaše databázová transakce nečeká 2 minuty, než vyprší časový limit a přeruší transakci. . Je tak také bezpečnější proti budoucím změnám požadavků.



  1. jak získat první nebo (jakýkoli) prvek ze seznamu LiveData v architektuře Android MVVM?

  2. Rozdíl mezi levým a pravým spojením v SQL Server

  3. Typ ENUM v SQLAlchemy s PostgreSQL

  4. Jak zjistit, že nainstalovaný klient Oracle je 32bitový nebo 64bitový?