PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PL/Perl mengirim email di Postgresql

Hanya karena Anda tidak bisa berarti Anda harus melakukannya. Ada cara yang lebih baik untuk melakukan ini. Jangan langsung dari PL. Jika Anda ingin mengabaikan peringatan saya, gunakan PL/PerlU dan tulis seperti yang Anda lakukan pada klien email lainnya. Anda dapat menggunakan modul CPAN apa pun yang Anda suka yang membuat hidup Anda lebih mudah.

Dua alasan untuk tidak:

1) Bagaimana jika transaksi Anda dibatalkan/digulung kembali? Anda telah mengirim email tetapi tidak membuat perubahan yang sesuai pada db. Anda melakukan hal-hal non-transaksional di dalam suatu transaksi.

2) Bagaimana jika email Anda hang menunggu tanggapan sampai Anda mendapatkan tcp timeout setelah 2 menit? Apakah Anda akan melupakan email pelanggan? Batalkan transaksi (tidak dapat mengirim email, tidak dapat mengatakan bahwa kami telah mengirimkan bagiannya!)?

Ini adalah buruk ide. Jangan lakukan itu. Terima kasih PostgreSQL untuk kesalahan ini dan pindahkan ke daemon lain.

jauh lebih baik pendekatan adalah dengan menggunakan LISTEN dan NOTIFY, dan tabel antrian. Anda kemudian dapat membuat tabel seperti ini:

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

Kemudian masukkan prosedur tersimpan Anda ke dalam tabel itu.

Kemudian, miliki aplikasi klien kedua yang MENDENGARKAN di emails_waiting mendengarkan (pernyataan sql LISTEN emails_waiting ) dan kemudian lakukan sebagai berikut:

  1. Memeriksa apakah ada catatan di email_queue. Jika tidak pergi ke 3.
  2. membaca data, mengirim email, menghapus catatan, dan melakukan.
  3. Saat antrian kosong, tidur selama x detik
  4. Saat bangun, periksa asinkron. pemberitahuan (tergantung pada pustaka klien, periksa dokumen). Jika ada, ke 1, jika tidak, ke 3.

Hal ini memungkinkan email Anda untuk diantrekan untuk pengiriman transaksi Anda dan untuk ini secara otomatis diteruskan ke aplikasi lain yang kemudian dapat terhubung dengan MTA jika pilihan Anda.

Aplikasi klien kedua itu dapat ditulis dalam bahasa pilihan Anda, menggunakan alat apa pun yang Anda ketahui. Ini memiliki keuntungan melakukan semua hal jaringan di luar transaksi, jadi jika Anda mengirim melalui server SMTP kedua, dan koneksi macet, seluruh transaksi basis data Anda tidak menunggu selama 2 menit untuk waktu habis dan membatalkan transaksi . Dengan demikian juga lebih aman terhadap perubahan persyaratan di masa mendatang.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara diam menginstal Postgresql di Ubuntu melalui. file docker?

  2. Postgres:Tambahkan batasan jika belum ada

  3. Mendapatkan NoSuchMethodError:javax.persistence.Table.indexes() saat melakukan kueri JPA

  4. Bagaimana cara memeriksa apakah layanan yang saya tidak tahu namanya berjalan di Ubuntu

  5. Menerapkan batasan tanggal unik pada kolom TIMESTAMP di postgresql