ORA-24247: network access denied by access control list (ACL)
Para solucionar debemos de crear ACL en la base de datos, yo recomiendo conectarse como el usuario SYS pero también se puede ejecutar como usuario de tipo DBA. Una de estas situaciones es cuando intentamos enviar correo desde la base de datos.
Para solucionar debemos de crear ACL en la base de datos, yo recomiendo conectarse como el usuario SYS pero también se puede ejecutar como usuario de tipo DBA. Una de estas situaciones es cuando intentamos enviar correo desde la base de datos.
Como prueba podemos ejecutar el siguiente código simple de envio de
correo, si no tenemos permisos nos dará error.
DECLARE
v_mailsever_host VARCHAR2(30) := 'usuario@miempresa.com.pe';
v_mailsever_port PLS_INTEGER := 25;
l_mail_conn
utl_smtp.connection;
BEGIN
l_mail_conn := utl_smtp.open_connection(v_mailsever_host,
v_mailsever_port);
END;
Error obtenido:
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.UTL_TCP", line 17
ORA-06512: at "SYS.UTL_TCP", line 246
ORA-06512: at "SYS.UTL_SMTP", line 115
ORA-06512: at "SYS.UTL_SMTP", line 138
ORA-06512: at line 6
¿Cómo podemos crear la ACL y dar permisos al usuario para poder enviar
correos?
Pues bien, lo podemos hacer de la siguiente forma, previamente nos
conectamos con el usuario SYS y ejecutamos el siguiente Script para crear ACL.
BEGIN
dbms_network_acl_admin.create_acl(acl => 'envio_correos.xml',
description
=> 'Envio de correos',
principal => 'USUARIODBA',
is_grant => TRUE,
privilege => 'connect',
start_date => systimestamp,
end_date => NULL);
COMMIT;
END;
Con esto hemos creado una lista acceso para envió de correo y hemos dado
permisos al usuario 'USUARIODBA' para poder usarla.
Ahora hay que definir el servidor de correo y puerto utilizado sobre la
lista que anteriormente hemos creado
BEGIN
dbms_network_acl_admin.assign_acl(acl
=> 'envio_correos.xml',
host => 'mail.miempresa.com.pe',
lower_port
=> 25,
upper_port => NULL);
END;
Si quisiéramos añadir otro puerto, volveríamos a ejecutar el mismo
código con otro puerto distinto
BEGIN
dbms_network_acl_admin.assign_acl(acl => 'envio_correos.xml',
host => 'mail.miempresa.com.pe',
lower_port
=> 80,
upper_port
=> NULL);
END;
Si quisiéramos que otro usuario tuviera permisos para poder enviar
correos, simplemente ejecutaríamos este código con el usuario al que queramos
dar permisos.
BEGIN
dbms_network_acl_admin.add_privilege(acl => 'envio_correos.xml',
principal => 'USUARIO2',
is_grant => TRUE,
privilege => 'connect');
END;
En caso que queramos eliminar el acl ejecutamos este código.
BEGIN
dbms_network_acl_admin.drop_acl(acl => 'envio_correos.xml');
END;
En caso de que queramos ver qué permisos tenemos dados y qué listas hay
creadas en nuestra base de datos, usaremos las siguientes consultas:
SELECT *
FROM
dba_network_acls;
SELECT *
FROM
dba_network_acl_privileges;
Referencias bibliográficas.
No hay comentarios.:
Publicar un comentario