ORA-24247:发送电子邮件Oracle时,访问控制列表(ACL)拒绝了网络访问

时间:2018-12-14 09:32:18

标签: oracle oracle11g oracle-apex ora-24247

我已经完成了所有活动,即在下面提到,请告诉我我缺少哪一步/活动。

BEGIN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
                                    acl         => 'apex_user.xml',
                                    description => 'access to apex email',
                                    principal   => 'DBUSER',
                                    is_grant    => TRUE,
                                    privilege   => 'connect',
                                    start_date  => SYSTIMESTAMP,
                                    end_date    =>Null
                                    );
 COMMIT;
 END; 
  BEGIN
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
                                        acl       => 'apex_user.xml',
                                       principal => 'DBUSER',
                                       is_grant  => true,
                                       privilege => 'resolve'
                                       );

 COMMIT;
 END;

   BEGIN
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
                                    acl         => 'apex_user.xml',
                                    host        => 'smtp.gmail.com',
                                    lower_port  =>587,
                                    upper_port  =>587
                                    );
COMMIT;
 END;

为确保用户可以访问smtp软件包,请以SYS身份运行

GRANT EXECUTE ON UTL_TCP  TO DBUSER;
GRANT EXECUTE ON UTL_SMTP TO DBUSER;
GRANT EXECUTE ON UTL_MAIL TO DBUSER;
GRANT EXECUTE ON UTL_http TO DBUSER;

启用UTL_MAIL

alter system set smtp_out_server = 'smtp.gmail.com:587' scope = both;

由于我fistname.lastname@gmail.com的安全性较差的应用程序从Google帐户获取的安全性较低,因此我在Oracle中执行以下查询

begin
  utl_mail.send(
  sender     => 'fistname.lastname@gmail.com',
  recipients => 'fistname.lastname@gmail.com',
  message    => 'Hello World'
   );
end;
  

错误报告-   ORA-29279:SMTP永久错误:530 5.7.0必须首先发出STARTTLS命令

,一旦从顶点调用为

并给出错误
APEX_MAIL.SEND( 
    p_to => 'fistname.lastname@gmail.com', 
    p_from => 'fistname.lastname@gmail.com', 
    p_subj => 'APEX_MAIL with attachment', 
    p_body => 'Please review the attachment.', 
    p_body_html => '<b>Please</b> review the attachment');
  

ORA-24247:访问控制列表(ACL)拒绝了网络访问

但是我尝试使用utl_smtp并再次遇到相同的错误

create or replace PROCEDURE send_email(p_to        IN VARCHAR2,
                                       p_from      IN VARCHAR2,
                                       p_message   IN VARCHAR2,
                                       p_smtp_host IN VARCHAR2,
                                       p_smtp_port IN NUMBER DEFAULT 587)
AS
  l_mail_conn   UTL_SMTP.connection;
BEGIN
  l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
  UTL_SMTP.helo(l_mail_conn, p_smtp_host);
  UTL_SMTP.mail(l_mail_conn, p_from);
  UTL_SMTP.rcpt(l_mail_conn, p_to);
  UTL_SMTP.data(l_mail_conn, p_message  || UTL_TCP.crlf || UTL_TCP.crlf);
  UTL_SMTP.quit(l_mail_conn);
END;
  

ORA-29279:SMTP永久错误:530 5.7.0必须首先发出STARTTLS命令。 c13sm6735648wrb.38-gsmtp

请告诉哪个命令或其他错误信息。

2 个答案:

答案 0 :(得分:3)

您不需要任何commit,因为没有为这些操作执行显式DML操作。而且,也不是每个方法调用都需要使用begin..end块。

您的问题源于以下事实,即必须同时调用带有Dbms_Network_Acl_Admin.Add_Privilege选项的privilege => 'connect'方法。因此,您可以使用以下代码:

BEGIN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
                                    acl         => 'apex_user.xml',
                                    description => 'access to apex email',
                                    principal   => 'DBUSER',
                                    is_grant    => TRUE,
                                    privilege   => 'connect',
                                    start_date  => SYSTIMESTAMP,
                                    end_date    =>Null
                                    );
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
                                       acl       => 'apex_user.xml',
                                       principal => 'DBUSER',
                                       is_grant  => true,
                                       privilege => 'connect'
                                       );

  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
                                       acl       => 'apex_user.xml',
                                       principal => 'DBUSER',
                                       is_grant  => true,
                                       privilege => 'resolve'
                                       );


  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
                                    acl         => 'apex_user.xml',
                                    host        => 'smtp.gmail.com',
                                    lower_port  =>587,
                                    upper_port  =>587
                                    );
 END;

通过以下查询,可以检查所有特权访问(通过SYS或SYSTEM模式来检查):

select a.host,p.*
  from dba_network_acl_privileges p
  join dba_network_acls a on a.aclid = p.aclid
 order by a.host, p.principal, p.privilege;

答案 1 :(得分:0)

1)IMHO smtp.gmail.com需要安全的连接和身份验证,但程序包utl_mail不支持这些功能。您可以使用utl_smtp来实现。

2)Apex_mail软件包以其定义者(apex_scheama)的特权运行,并且您的acl列表是为dbuser定义的。同样在这里,您可以通过某种方式进行smtp身份验证。