Paquete UTL_MAIL en 12c

El paquete UTL_MAIL es uno de esos paquetes que, aunque en mi opinión no debería de usarse nunca, siempre nos encontramos con casos de aplicaciones que hacen uso del mismo.
Si migramos (no update) a la 12c (creo que los ultimos patchsets de la 11g puede pasar también), nos encontramos con que aparece este error:

PLS-00201: el identificador 'SYS.UTL_MAIL' se debe declarar
PLS-00201: identifier 'SYS.UTL_MAIL' must be declared

El motivo de este error queda bastante claro en la entrada de Database PL/SQL Packages and Types Reference UTL_MAIL de la documentación de los paquetes de la 12g.

UTL_MAIL no está instalado de forma predeterminada debido al requisito de configuración SMTP_OUT_SERVER y la exposición de la seguridad que ello implica.
Con la instalación de UTL_MAIL, usted deberá configurar el sistema para agregar la salida a los puertos definidos en SMTP_OUT_SERVER .

Así pues nos tocará instalarlo a mano con:

sqlplus sys/
SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb

y dar los permisos al esquema que nos necesite

GRANT EXECUTE ON UTL_MAIL TO esquema;

En cualquier caso, aunque lo instalemos a mano, tendremos que empezar a lidiar con el paquete UTL_SMTP, con lo que nos vendrá bien tener a mano las entradas :

ORA-29279 Errors using UTL_SMTP

One of the most common error using Fine Grained Acess and UTL_SMTP is the ORA-2927SMTP permanent error
This aren’t databae errors, this error are a generic authentication issue with the configuration of the SMTP server and fortunately, Oracle has a solution about it.


Contact your SMTP administrator for additional assistance as this solution may require your e-mail administrator to make the necessary changes.

More information :

  • ORA-29279 SMTP: 554 Using Utl_smtp To Send Email (Doc)
  • Document 604763.1 – Check SMTP Server Availability for ORA-29278 or ORA-29279 errors using UTL_SMTP to Send Email
  • ORA-2427 con el paquete SMTP

Errores ORA-29279 usando UTL_SMTP

Con la implementacion del Fine Grained Acess en la gestión de conexiones de la base de datos,el DBA acaba siendo en muchos casos el punto de entrada de la resolucion de errores que nada tienen que ver con el motor de la base de datos.
Uno de estos errores muy comunes son los ORA-29279 usando UTL_SMTP

Afortunadamente, Oracle es muy claro al respecto.
Los errores ORA-29279 no son un error del motor, sino que nos transmite os escalan el error que dando el servidor de correo


Contact your SMTP administrator for additional assistance as this solution may require your e-mail administrator to make the necessary changes.

Así que, claro y en botella.
Mas info en :

  • ORA-29279 SMTP: 554 Using Utl_smtp To Send Email (Doc ID 1471828.1)
  • Document 604763.1 – Check SMTP Server Availability for ORA-29278 or ORA-29279 errors using UTL_SMTP to Send Email
  • ORA-2427 con el paquete SMTP

ORA-24247 con el paquete STMP

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-ora-ORA-24247.jpg

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: