ORA-24247: доступ к сети запрещен списком контроля доступа (ACL) при отправке электронной почты оракулом - PullRequest
0 голосов
/ 14 декабря 2018

я выполнил все действия, то есть упомянуто ниже, скажите, пожалуйста, какой шаг / действие я пропускаю.

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;

Как только я выполню следующий запрос в Oracle, так как fistname.lastname@gmail.com имеет менее безопасное приложение, чем true из аккаунта Google

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 как

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 голосов
/ 14 декабря 2018

1) IMHO smtp.gmail.com требует защищенного соединения и аутентификации, но пакет utl_mail не поддерживает эти функции.Вы можете достичь этого с помощью utl_smtp.

2) Пакет Apex_mail запускается с привилегиями их определителя (apex_scheama), и ваш список acl определен для dbuser.Также здесь вы как-то делаете проверку подлинности smtp.

0 голосов
/ 14 декабря 2018

Вам не нужно никаких 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...