Envío de correos o mails desde el núcleo de Oracle en PL/SQL

Oracle, pionero en BD relacionales.

Envío de correos o mails desde el núcleo de Oracle en PL/SQL

Notapor Pere » Jue Dic 12, 2013 5:59 pm

En esta ocasión os dejo un pakage para el envio de emails desde el núcleo de la base de datos Oracle. Es posible enviar el mismo correo a múltiples destinatarios. Al final del artículo os dejo un par de ejemplos de como usarlo. Os puede venir bien si no necesitais adjuntar archivos.

Tened en cuenta que debereis cambiar el valor de las constantes que cito a continuacion a vuestro entorno de trabajo. En esencia son los datos del servidor de correo smtp que useis para enviar los mails.

Constantes que deberis adaptar a vuestro entorno de trabajo.
Código: Seleccionar todo

   SMTP_FROM CONSTANT varchar2
(60) := 'notificaciones@empresa.com';
   SMTP_HOST CONSTANT varchar2(60) := 'correo.empresa.com';
   SMTP_PORT CONSTANT number(2)    := 25;
 


Package - Definción:
Código: Seleccionar todo

create or replace package notificaciones is

  type lista_mails_type is table of varchar2
(120) index by binary_integer;
  
  procedure enviar_mail
(p_to in lista_mails_type, p_asunto in varchar2, p_mensaje in varchar2);

end;
 


Package Body - Implementación:
Código: Seleccionar todo

create or replace package body notificaciones is
  procedure enviar_mail
(p_to in lista_mails_type, p_asunto in varchar2, p_mensaje in varchar2) is
     
     SMTP_FROM CONSTANT varchar2
(60) := 'notificaciones@empresa.com';
     SMTP_HOST CONSTANT varchar2(60) := 'correo.empresa.com';
     SMTP_PORT CONSTANT number(2)    := 25;
     CRLF      CONSTANT varchar2(2)  := chr(13) || chr(10);
     
     v_to  varchar2
(1024);
     v_msg varchar2(2048);
     
     v_mail_conn   UTL_SMTP
.connection;
  
  begin
  
     v_mail_conn 
:= UTL_SMTP.open_connection(SMTP_HOST, SMTP_PORT);
  
     UTL_SMTP
.helo(v_mail_conn, SMTP_HOST);
     UTL_SMTP.mail(v_mail_conn, SMTP_FROM);
        
     for i in p_to
.first..p_to.last loop
        UTL_SMTP
.rcpt(v_mail_conn, p_to(i));
        v_to := v_to ||p_to(i)||';';
     end loop;
      
     v_to 
:= rtrim(v_to,';');
     
     v_msg 
:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss') || CRLF ||
              'From: <'|| SMTP_FROM ||'>' || crlf ||
              'Subject: '|| p_asunto || crlf ||
              'To: '||v_to || crlf || '' || crlf || p_mensaje;
  
     UTL_SMTP
.data(v_mail_conn, v_msg);
     UTL_SMTP.quit(v_mail_conn);

  end;
  
end
;
 


Ejemplos de uso del package notificaciones:

Ejemplo 1:
Código: Seleccionar todo
declare

  v_lista_mails notificaciones.lista_mails_type;

begin

  v_lista_mails
(1) := 'abuenafuente@empresa.com';
  v_lista_mails(2) := 'jmmonzon@empresa.com';

  notificaciones.enviar_mail(v_lista_mails, 'Test Mail' ,'Esto es una prueba de envio de mails');

end;
 


Imaginemos que los mails a notificar estan almacenados en una tabla de la BD:

Ejemplo 2:
Código: Seleccionar todo
declare

  v_lista_mails notificaciones.lista_mails_type;

begin

  select email 
    bulk collect into v_lista_mails
    from mails_notificaciones
   where activo 
= 1;

  notificaciones.enviar_mail(v_lista_mails, 'Test Mail' ,'Esto es una prueba de envio de mails');

end;


Y esto es todo, espero os resulte útil.
Pere
 
Mensajes: 74
Registrado: Mar Feb 02, 2010 9:44 pm

Volver a SGBD Oracle

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 21 invitados