sql >> Databasteknik >  >> RDS >> PostgreSQL

PL/Perl skicka e-post i Postgresql

Bara för att du kan betyder det inte att du borde. Det finns bättre sätt att göra detta. Gör det inte direkt från en PL. Om du vill ignorera mina varningar, använd PL/PerlU och skriv det som vilken annan e-postklient som helst. Du kan använda vilka CPAN-moduler som helst som gör ditt liv enklare.

Två skäl att inte:

1) Vad händer om din transaktion avbryts/återställs? Du har skickat mejlet men inte gjort någon motsvarande ändring i db. Du gör icke-transaktionella saker i en transaktion.

2) Vad händer om din e-post hänger sig och väntar på svar tills du får en tcp timeout efter 2 minuter? Kommer du att glömma att maila kunden? Avbryta transaktionen (kan inte skicka e-post, kan inte säga att vi har skickat delen!)?

Det här är en dålig aning. Gör det inte. Tacka PostgreSQL för detta fel och flytta ut det till en annan demon.

En mycket bättre tillvägagångssätt är att använda LISTEN och NOTIFY och kötabeller. Du kan sedan skapa en tabell så här:

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

Låt sedan din lagrade procedur infogas i den tabellen.

Ha sedan en andra klientapp som lyssnar på emails_waiting-lyssningarna (sql-sats LISTEN emails_waiting ) och gör sedan enligt följande:

  1. Kontrollerar om det finns poster i email_queue. Om inte, gå till 3.
  2. läser data, skickar e-post, raderar posten och förbinder sig.
  3. När kön är tom sover i x sekunder
  4. Vid väckning, kontrollerar om det är asynkront. meddelanden (beror på klientbibliotek, kontrollera dokument). Om det finns, gå till 1, om inte, gå till 3.

Detta gör att dina e-postmeddelanden kan ställas i kö för att skicka in din transaktion och för att detta automatiskt skickas till en annan applikation som sedan kan ansluta till MTA om du vill.

Den andra klientappen kan skrivas på det språk du väljer, med vilka verktyg du än känner till. Det har fördelen att göra alla nätverksgrejer ur transaktionen, så om du skickar via en andra SMTP-server, och anslutningen hänger sig, väntar inte hela din databastransaktion i 2 minuter innan den tar timeout och avbryter transaktionen . Det är därmed också säkrare mot framtida kravförändringar.



  1. Jag vill visa detta resultat med hjälp av codeigniter

  2. Jämför String i Oracle Case When

  3. hämta data från mysql med ajax och json till olika textområden

  4. Hur kan jag få förfäder-ID för godtyckligt rekursionsdjup i en SQL-fråga?