Geralmente, seria uma má ideia tentar enviar um e-mail em um gatilho.
- Se o sistema não puder enviar o e-mail (por exemplo, porque o servidor SMTP está temporariamente inativo), o acionador falhará e a instrução de acionamento falhará e será revertida. É muito raro que você realmente queira interromper a transação subjacente simplesmente porque não conseguiu enviar um e-mail.
- O envio de um e-mail não é transacional. Isso significa que você enviará e-mails para alterações que nunca serão confirmadas. E você enviará e-mails várias vezes porque a Oracle opta por reverter e reexecutar todo ou parte de um
INSERT
declaração para manter a consistência de gravação.
Em geral, você será muito mais bem servido com um trabalho de banco de dados que procura periodicamente as linhas que precisam ter um email enviado, envia os emails e, em seguida, atualiza a tabela. Você pode usar o antigo
DBMS_JOB
pacote ou o mais novo e mais sofisticado DBMS_SCHEDULER
pacote. Algo na linha de 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;
que é programado para ser executado, digamos, a cada 5 minutos (você também pode usar o
DBMS_SCHEDULER
pacote) 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;
Você pode usar o pacote UTL_MAIL para implementar o
send_email
procedimento. Você provavelmente só precisa chamar UTL_MAIL.SEND
com os parâmetros apropriados (assumindo que você configurou seu SMTP_OUT_SERVER
parâmetro e seu usuário recebeu acesso apropriado ao UTL_MAIL
pacote e para uma ACL que permite que você se comunique com esse servidor SMTP).