Lihat artikel depesz excellent-as-usual, dan pg-message-queue.
Mengirim email langsung dari database mungkin bukan ide yang bagus. Bagaimana jika resolusi DNS lambat dan semuanya hang selama 30 detik lalu habis? Bagaimana jika server email Anda goyah dan membutuhkan waktu 5 menit untuk menerima pesan? Anda akan mendapatkan sesi database yang terhenti di pemicu Anda sampai Anda berada di max_connections
dan tiba-tiba Anda tidak dapat melakukan apa pun selain menunggu atau mulai membatalkan transaksi secara manual.
Yang saya sarankan adalah memicu NOTIFY
sebuah LISTEN
ing skrip pembantu yang tetap berjalan secara permanen dan terhubung ke DB (tetapi tidak dalam transaksi).
Yang harus dilakukan pemicu Anda adalah INSERT
baris ke dalam tabel antrian dan mengirim NOTIFY
. Skrip Anda mendapatkan NOTIFY
pesan karena telah terdaftar ke LISTEN
untuk itu, memeriksa tabel antrian, dan melakukan sisanya.
Anda dapat menulis program pembantu dalam bahasa apa pun yang nyaman; Saya biasanya menggunakan Python dengan psycopg2
.
Script itu dapat mengirim email berdasarkan informasi yang ditemukannya di database. Anda tidak perlu melakukan semua pemformatan teks jelek di PL/PgSQL, Anda dapat menggantinya menjadi template dalam bahasa skrip yang lebih kuat, dan cukup ambil data variabel dari database saat NOTIFY
masuk.
Dengan pendekatan ini, pembantu Anda dapat mengirim setiap pesan dan hanya kemudian menghapus info dari tabel antrian. Dengan begitu jika ada masalah sementara dengan sistem email Anda yang menyebabkan pengiriman gagal, Anda tidak kehilangan info dan dapat terus mencoba mengirimnya sampai Anda berhasil.
Jika Anda benar-benar harus melakukan ini di database, lihat PgMail.