Biasanya merupakan ide yang buruk untuk mencoba mengirim email dalam pemicu.
- Jika sistem tidak dapat mengirim email (misalnya, karena server SMTP sedang down sementara), pemicu akan gagal dan pernyataan pemicu akan gagal dan dibatalkan. Sangat jarang Anda benar-benar ingin menghentikan transaksi pokok hanya karena Anda tidak dapat mengirim email.
- Mengirim email tidak bersifat transaksional. Itu berarti Anda akan mengirim email untuk perubahan yang tidak pernah dilakukan. Dan Anda akan mengirim email beberapa kali karena Oracle memilih untuk mengembalikan dan menjalankan kembali semua atau sebagian dari
INSERT
pernyataan untuk menjaga konsistensi penulisan.
Anda biasanya akan jauh lebih baik dilayani dengan pekerjaan database yang secara berkala mencari baris yang perlu memiliki email yang dikirim, mengirim email, dan kemudian memperbarui tabel. Anda dapat menggunakan DBMS_JOB
yang lebih lama paket atau DBMS_SCHEDULER
yang lebih baru dan lebih canggih kemasan. Sesuatu di sepanjang baris
CREATE OR REPLACE PROCEDURE process_issues
AS
BEGIN
FOR i IN (SELECT *
FROM your_table_name
WHERE issue_added = 1
AND email_sent = 0)
LOOP
send_email( i.issue_id );
UPDATE your_table_name
SET email_sent = 1
WHERE issue_id = i.issue_id;
END LOOP;
END;
yang kemudian dijadwalkan untuk dijalankan, katakanlah, setiap 5 menit (Anda juga dapat menggunakan DBMS_SCHEDULER
paket)
DECLARE
l_jobno PLS_INTEGER:
BEGIN
dbms_job.submit( l_jobno,
'BEGIN process_issues; END;',
sysdate + interval '5' minute,
'sysdate + interval ''5'' minute' );
commit;
END;
Anda dapat menggunakan paket UTL_MAIL
untuk mengimplementasikan send_email
prosedur. Anda mungkin hanya perlu menelepon UTL_MAIL.SEND
dengan parameter yang sesuai (dengan asumsi Anda telah mengonfigurasi SMTP_OUT_SERVER
parameter dan pengguna Anda telah diberikan akses yang sesuai ke UTL_MAIL
paket dan ke ACL yang memungkinkan Anda berkomunikasi dengan server SMTP itu).