如何使用Oracle存储过程发送电子邮件

时间:2018-03-19 12:07:18

标签: oracle11g

我正在创建自动风险评估。 如果发现风险,电子邮件将发送给关注董事。这项工作甚至在休息一周。 我已经创建了计算风险的程序,它正在运作。但是如何让它自动发送电子邮件到特定的电子邮件。 xxx@gmail.com。我发现了一个生产者,但它显示和错误: 访问控制列表(ACL)拒绝网络访问 这是程序:

  create or replace PROCEDURE     SEND_MAIL (
msg_to varchar2 , 
msg_subject varchar2 ,
msg_text varchar2  )
IS
c utl_smtp.connection;
rc integer; 
msg_from varchar2(50) := 'smsnotfication@gmail.com'; 
mailhost VARCHAR2(30) := '192.168.10.13'; --  technova local database host 

BEGIN
c := utl_smtp.open_connection(mailhost,465); -- SMTP on port 25 
utl_smtp.helo(c, mailhost);
utl_smtp.mail(c, msg_from);
utl_smtp.rcpt(c, msg_to);

utl_smtp.data(c,'From: Oracle Database' || utl_tcp.crlf ||
'To: ' || msg_to || utl_tcp.crlf ||
'Subject: ' || msg_subject || 
utl_tcp.crlf || msg_text);
utl_smtp.quit(c);

EXCEPTION
WHEN UTL_SMTP.INVALID_OPERATION THEN
dbms_output.put_line(' Invalid Operation in Mail attempt 
using UTL_SMTP.');
WHEN UTL_SMTP.TRANSIENT_ERROR THEN
dbms_output.put_line(' Temporary e-mail issue - try again'); 
WHEN UTL_SMTP.PERMANENT_ERROR THEN
dbms_output.put_line(' Permanent Error Encountered.'); 
END;

1 个答案:

答案 0 :(得分:0)

您似乎没有创建ACL,是吗?如果没有,这是我脚本的摘录 - 看看。

在分配ACL时注意HOST - 此可能需要是您提到的IP地址。

我从未尝试过做你正在做的事情,但是 - 希望 - 它会帮助你。

SELECT * FROM dba_network_acls;

-- Drop ACL ====================================================================

BEGIN
   DBMS_NETWORK_ACL_ADMIN.drop_acl (acl => 'myacl.xml');
END;

-- Create ACL ==================================================================

BEGIN
   DBMS_NETWORK_ACL_ADMIN.create_acl (acl           => 'myacl.xml',
                                      description   => 'SMTP, MAIL, HTTP Access',
                                      principal     => 'SCOTT',
                                      is_grant      => TRUE,
                                      privilege     => 'connect',
                                      start_date    => NULL,
                                      end_date      => NULL);
END;

-- Assign ACL ==================================================================

BEGIN
   DBMS_NETWORK_ACL_ADMIN.assign_acl (acl          => 'myacl.xml',
                                      HOST         => '*',     --> 192.168.10.13 ?
                                      lower_port   => NULL,
                                      upper_port   => NULL);
END;

-- Add privilege ===============================================================

BEGIN
   -- SCOTT
   DBMS_NETWORK_ACL_ADMIN.add_privilege (acl          => 'myacl.xml',
                                         principal    => 'SCOTT',
                                         is_grant     => TRUE,
                                         privilege    => 'connect',
                                         start_date   => NULL,
                                         end_date     => NULL);

   DBMS_NETWORK_ACL_ADMIN.add_privilege (acl          => 'myacl.xml',
                                         principal    => 'SCOTT',
                                         is_grant     => TRUE,
                                         privilege    => 'resolve',
                                         start_date   => NULL,
                                         end_date     => NULL);
END;
/
COMMIT;