Solo perché puoi non significa che dovresti. Ci sono modi migliori per farlo. Non farlo direttamente da un PL. Se vuoi ignorare i miei avvisi, usa PL/PerlU e scrivilo come faresti con qualsiasi altro client di posta elettronica. Puoi utilizzare tutti i moduli CPAN che ti piacciono per semplificarti la vita.
Due motivi per non farlo:
1) Cosa succede se la transazione viene interrotta/riportata indietro? Hai inviato l'email ma non hai apportato modifiche corrispondenti al db. Stai facendo cose non transazionali all'interno di una transazione.
2) Cosa succede se la tua email si blocca in attesa di una risposta fino a quando non ricevi un timeout TCP dopo 2 minuti? Hai intenzione di dimenticare di inviare un'e-mail al cliente? Annullare la transazione (non è possibile inviare e-mail, non posso dire che abbiamo spedito la parte!)?
Questo è un cattivo idea. Non farlo. Ringrazia PostgreSQL per questo errore e spostalo in un altro demone.
Un molto meglio l'approccio consiste nell'utilizzare LISTEN e NOTIFY e le tabelle di coda. Puoi quindi creare una tabella come questa:
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$;
Quindi fai in modo che la tua procedura memorizzata venga inserita in quella tabella.
Quindi, avere una seconda app client che LISTEN su emails_waiting ascolta (istruzione sql LISTEN emails_waiting
) e quindi fa come segue:
- Verifica se sono presenti record nella coda_email. In caso contrario, vai a 3.
- legge i dati, invia e-mail, elimina il record e si impegna.
- Quando la coda è vuota, dorme per x secondi
- Al risveglio, verifica l'assenza di sincronia. notifiche (dipende dalle librerie client, controlla i documenti). Se ci sono, vai a 1, in caso contrario, vai a 3.
Ciò consente alle tue e-mail di essere messe in coda per l'invio della transazione e di trasferirle automaticamente a un'altra applicazione che può quindi connettersi con l'MTA se lo desideri.
Quella seconda app client può essere scritta nella lingua che preferisci, utilizzando qualsiasi strumento tu conosci. Ha il vantaggio di eliminare tutte le operazioni di rete dalla transazione, quindi se stai inviando tramite un secondo server SMTP e la connessione si interrompe, l'intera transazione del database non attende 2 minuti per il timeout e l'interruzione della transazione . È quindi anche più sicuro contro future modifiche dei requisiti.