Hoy vamos a ver como resolver errores ORA-24247 en la version 11g . Aunque desde aquí siempre hemos mantenido (y mantendremos) que la base de datos no debería ser la responsable de enviar correos o conectarse a «vete a saber donde» hay entornos en los que nos vemos obligados a ello.
¿Que ocurre si nos encontramos con un error de este tipo ?

ERROR at line 1:
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 "XXX", line 36
ORA-06512: at line 1
Este error es debido a que no contamos con una ACl para el servicio de red, las ACLs son un elemento nuevo de Oracle 11g (11.1.0.6) que establece un filtrado mas detallado (fine-grained access) y que controla el acceso a algunos paquetes como el UTL_SMTP o el UTL_HTTP.
¿como lo solicionamos?
Sencillamente tenemos que crear una ACL que nos permita acceder al puerto 25 de nuestro servidor de correo.
En este caso lo haremos para
- SMTP Server 127.0.0.1 (localhost de la BBDD)
- Puerto 25 ( puerto estandard de correo)
- usuarios Usuario1 y usuario2
Así pues , ejecutaremos :
begin
--creamos la ACL
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL
(acl => 'send_mail.xml',
description => '
send_mail ACL',
principal => 'USUARIO1',
is_grant => true,
privilege => 'connect');
-- Asignamos privilegios al usuario elegido
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'send_mail.xml',
principal => 'USUARIO1',
is_grant => true,
privilege => 'connect');
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'send_mail.xml',
principal => 'USUARIO1',
is_grant => true,
privilege => 'resolve');
-- Asignamos provilegios al usuario elegido
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'send_mail.xml',
principal => 'USUARIO2',
is_grant => true,
privilege => 'connect');
--Asignamos recursos
dbms_network_acl_admin.assign_acl (
acl => 'send_mail.xm',
host => '127.0.0.1',
lower_port => 25,
upper_port => 25);
END;
/
COMMIT;
Si queremos ver las ACL creadas
SELECT * FROM dba_network_acls;
Y los privilegios de cada una de ellas
SELECT acl
,principal
,privilege
,is_grant
,invert
,start_date
,end_date
FROM dba_network_acl_privileges;
Como siempre , mas información en oracle en las notas: