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ě:
- Zkontroluje, zda jsou ve frontě emailů záznamy. Pokud ne, přejděte na 3.
- čte data, odešle e-mail, odstraní záznam a provede potvrzení.
- Když je fronta prázdná, spí x sekund
- 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ů.