Configurar una base de datos Oracle para que envíe correos a través de Office 365

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.871
Buenas tardes gente de bien. Hace meses que no escribo ningún artículo porque este año hemos tenido demasiadas migraciones y proyectos en la pega así que me queda poco tiempo para la procastinación (hecho lamentable, lo sé).

Una de esas migraciones es llevar nuestro correo desde Exchange On Premise hacia Office 365. Yo no llevo ese proyecto porque no es mi especialidad pero si me afecta: la base de datos Oracle envía correos utilizando Exchange para salir y el pasar a Office 365 me implica hacer un ajuste.

Estuve googleando mucho buscando un tutorial que me de los pasos pero en sitios web guachos de oracle encontré la pista. Vamos a ello.



Mi situación actual:

Mi Exchange on-premise tiene autorizada la IP de mi servidor de base de datos para envío de correos, así que cuando quiero enviar un mail desde la base de datos uso un procedimiento almacenado (plsql) como esto:

Código:
CREATE OR REPLACE PROCEDURE MONITOREO.PRC_ENVIACORREO
AS

   VAR_PARA          VARCHAR2(200);
   VAR_DESDE         VARCHAR2(200);
   VAR_SMTP_SERVER   VARCHAR2(200);
   VAR_BASEDATOS     VARCHAR2(200);
   VAR_SUBJECT       VARCHAR2(200);
   
   l_mail_conn   UTL_SMTP.connection;
   l_boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
    
      
BEGIN

   -- Servidor de correos  
   VAR_SMTP_SERVER := 'ExchangeDeCapa9.local';
   
   VAR_DESDE := '[email protected]';
     -- El destinatario está hardcodeado para efectos del tutorial
   VAR_PARA := '[email protected]';
   
   select sys_context('userenv','db_name') INTO VAR_BASEDATOS 
   from dual;
   
      -- Envía correo de resumen
      l_mail_conn := UTL_SMTP.open_connection(VAR_SMTP_SERVER, 25);
      UTL_SMTP.helo(l_mail_conn, VAR_SMTP_SERVER);
      UTL_SMTP.mail(l_mail_conn, VAR_DESDE);
      UTL_SMTP.rcpt(l_mail_conn, VAR_PARA);
       
      UTL_SMTP.open_data(l_mail_conn);
      UTL_SMTP.WRITE_DATA(l_mail_conn, 'To: ' || VAR_PARA || UTL_TCP.crlf); 
      UTL_SMTP.WRITE_DATA(l_mail_conn, 'Subject: ' || 'Base de datos: ' || VAR_BASEDATOS  || ' ' || VAR_SUBJECT || UTL_TCP.crlf);
      UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
      UTL_SMTP.write_data(l_mail_conn, 'Content-Type: text/html; charset="UTF-8"' || UTL_TCP.crlf || UTL_TCP.crlf);
      UTL_SMTP.write_data(l_mail_conn, 'Prueba de correo enviado por el servidor ' || VAR_SMTP_SERVER);
         
      UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);  
      UTL_SMTP.CLOSE_DATA(l_mail_conn); 

      UTL_SMTP.QUIT(l_mail_conn); 

END;
/

Luego llamo al procedimiento almacenado y sale el correo. Simple, no?

Ok, pero mi Exchange on-premise va a dormir el sueño de los justos pues utilizaremos Office 365 y mi base de datos Oracle ahora tiene que mirar hacia allá, así que esa configuración que les mostré ya no va a funcionar más. ¿Y qué se hace?


1.- Descargar certificados
Mi administrador del correo me envió los enlaces para descargar los certificados DigiCert Global Root CA y Microsoft RSA Root Certificate Authority 2017. Me descargué ambos.

2.- Crear un directorio dentro del servidor de base de datos con la cuenta de sistema operativo que usa la base de datos (generalmente la cuenta oracle). Ese directorio será la ubicación de la wallet.
# mkdir -p /u01/app/oracle/wallet

3.- Copiar los certificados descargados en el punto 1 en esa misma ruta

4.- usando la cuenta de sistema operativo que usa la base de datos (la misma del paso 2, cargar los certificados que ustedes previamente copiaron en el paso 3. En verde los valores definidos por ustedes.
# orapki wallet add -wallet /u01/app/oracle/wallet -trusted_cert -cert "/u01/app/oracle/wallet/ElCertificadoDigiCertGlobalRootCA.crt" -pwd UnaPasswordCualquiera

# orapki wallet add -wallet /u01/app/oracle/wallet -trusted_cert -cert "/u01/app/oracle/wallet/ElCertificadoMicrosoftRSARootCertificateAuthority.crt" -pwd UnaPasswordCualquiera

Pónganle la contraseña que se les cante pero deben recordarla.

5.- Ahora el bloque plsql para enviar correos debe incluir dos llamadas más: la ubicación de la wallet que indicamos en el paso 2) y la contraseña (que definimos en el paso 4). Es así:

Código:
CREATE OR REPLACE PROCEDURE MONITOREO.PRC_ENVIACORREO
AS

   VAR_PARA          VARCHAR2(200);
   VAR_DESDE         VARCHAR2(200);
   VAR_SMTP_SERVER   VARCHAR2(200);
   VAR_BASEDATOS     VARCHAR2(200);
   VAR_SUBJECT       VARCHAR2(200);
   
   l_mail_conn   UTL_SMTP.connection;
   l_boundary    VARCHAR2(50) := '----=*#abc1234321cba#*=';
    
      
BEGIN

   -- Servidor de correos 
   VAR_SMTP_SERVER := 'capa9.mail.ohmygood.outlook.com';
   
   VAR_DESDE := '[email protected]';
   -- El destinatario está hardcodeado para efectos del tutorial
   VAR_PARA := '[email protected]'; 
   
   select sys_context('userenv','db_name') INTO VAR_BASEDATOS 
   from dual;
   
      -- Envía correo de resumen
      
   l_mail_conn := UTL_SMTP.open_connection(
                                              host => VAR_SMTP_SERVER, 
                                              port => 25,
                                              wallet_path => '/u01/app/oracle/wallet',
                                              wallet_password => 'UnaPasswordCualquiera',
                                              secure_connection_before_smtp => FALSE
                                              );
      UTL_SMTP.helo(l_mail_conn, VAR_SMTP_SERVER);
      UTL_SMTP.mail(l_mail_conn, VAR_DESDE);
      UTL_SMTP.rcpt(l_mail_conn, VAR_PARA);
       
      UTL_SMTP.open_data(l_mail_conn);
      UTL_SMTP.WRITE_DATA(l_mail_conn, 'To: ' || VAR_PARA || UTL_TCP.crlf); 
      UTL_SMTP.WRITE_DATA(l_mail_conn, 'Subject: ' || 'Base de datos: ' || VAR_BASEDATOS  || ' ' || VAR_SUBJECT || UTL_TCP.crlf);
      UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
      UTL_SMTP.write_data(l_mail_conn, 'Content-Type: text/html; charset="UTF-8"' || UTL_TCP.crlf || UTL_TCP.crlf);
      UTL_SMTP.write_data(l_mail_conn, 'Prueba de correo enviado por el servidor ' || VAR_SMTP_SERVER);
         
      UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);  
      UTL_SMTP.CLOSE_DATA(l_mail_conn); 

      UTL_SMTP.QUIT(l_mail_conn); 

END;
/



Igual el administrador de Office 365 les tiene que dar permiso a la IP pero por lo menos con esa configuración puede enviar correos a casillas externas como gmail, hotmail, geocities, etc.


Eso es todo, adelante estudios.



Saludos a la gente de Academia Database, mi casa de estudios virtual. Si quieren adentrarse en el desopilante mundo de Oracle éste es su lugar.

 

cliobrando

Capo
Se incorporó
6 Mayo 2021
Mensajes
197
Offtopic, siempre que me mencionan Oracle recuerdo cuando dijeron que la cantidad de codigo en C de Oracle 12cR2 se media en proporciones biblicas, algo asi como 30 millones de lineas de codigo (y eso es solo lo que está en hecho en C).

Ojala algun dia Oracle tenga una muerte digna, aunque Oracle y digno por lo general no van muy asociados.
 
Upvote 0
Subir