Envio de eMails y SMS's con PL/SQL

Abro este tema de envio de eMails y SMS's desde Oracle y PL/SQL para que podamos comentar dudas sobre cómo utilizar los paquetes que nos permiten el envío de eMails desde la base de datos, y otros mecanismos para crear nuestros propios sistemas de alertas, o simplemente informativos.

En este comentario de betorey_24 ya podemos encontrar un método para enviar emails con UTL_SMTP.

Y después elicived también nos recomendaba consultar el artículo Sending e-mail from Oracle, de Burleson Consulting

 

Que tal Carlos, una molestia he estado buscando en internet y no veo la forma de como enviar un SMS a un celular desde un PL/SQL, lo que he encontrado es que te lo manda pero como correo a tu cel y lo que me interesa es que sea un vil SMS ¿Sabes si Oracle tiene algo al respecto?

 

Saludos y Gracias.

En respuesta a por isunza

El envio de SMS's depende siempre de que las operadoras ofrezcan una interface para poder hacerlo, y cada una tiene su plataforma, y sus reglas. No creo que Oracle ofrezca ningún package que vaya actualizando con los protocolos de las operadoras telefónicas, por eso todo lo que encuentras es para enviar eMails.

No sé si lo has visto, pero hay operadoras que permiten enviar un eMail a una dirección que incluye el número de móvil, y ellas se encargan de hacer llegar el SMS al móvil. Es la opción más sencilla, pero dependes de si la operadora a la que envías el SMS ofrece este servicio. En EEUU lo tienen muchas, y lo llaman SMS gateway, es cuestión de investigar si la que tu utilizas lo ofrece. De momento puedes consultar este listado.

La otra opción (aparte de tener tu propia plataforma de mensajería ;)) es utilizar un servicio público de terceros que sí se dedican a 'entenderse' con las plataformas de las operadoras. Buscando también se puede llegar a encontrar alguno, aunque el servicio no suele ser gratuíto.

En el blog Inside Oracle APEX publican un ejemplo sobre cómo enviar SMS's con un procedure PL/SQL utilizando los servicios web de Esendex, y un usuario de prueba que has de crearte primero.

Ya nos dirás si al final lo consigues!

Buenos días,

Estoy intentando enviar un mail con una imagen desde Oracle con PL/SQL. Consigo hacerlo adjuntando la imagen, pero lo que quiero es que vaya en el cuerpo del mensaje. ¿Alguien puede ayudarme?.

Muchas gracias

En respuesta a por jonaesp

Microsoft Outlook no soporta en el BOBY imagenes de fondo, si lo que quiere es poner imagenes en el BODY (ya sea por DIV's o por TR's) DIRECTAMENTE NO SE PUEDEN INSERTAR. Lo que puedes hacer es guardarlas en un Directorio de un Servidor WEB y poner la ruta ha dicha imagen en el HTML o bien usando un CSS.

 

Ojala y te sirva de algo la respuesta.

Hola Carlos,

Quisiera ver si Ud. o alguna otra persona de las que aquí visitan me pueden hacer el favor de ayudarme.

Es que necesito enviar un correo desde PL/SQL a través de una cuenta de gmail.

Como el servidor smtp.gmail.com requiere de conexión segura, se me ha hecho imposible.

¿tendrán  ustedes algún procedimiento que resuelva esto?

Un millón de Gracias.

 

En respuesta a por Manuel

Hola Manuel

He encontrado en el post PL/SQL and Gmail (or UTL_SMTP with SSL)  del blog Monkey on Oracle una solución que a lo mejor te sirve.

En el post se explica que UTL_SMTP no soporta SSL, como ya has podido comprobar, y propone salvar el inconveniente utilizando Stunnel, una herramienta que permite crear una capa SSL sobre la conexión.

Ya nos contarás si te funciona.. 

Hola Carlos,

 

Te agradezco infinitamente tu rápida respuesta.

Ese post que me envías, pues lo probé en estos 3 días en que ando buscando la solución a ese problema y no pude terminarlo.

Hay una primera parte donde se instala el Stunnel y luego se comprueba usando telnet localhost 1925 y debe dar el resultado: 220 mx.google.com ESMTP 5sm18031572eyh.34

Hasta ahí todo mee fue bien, pero de ahí hacia abajo NO logré hacerlo ... lógicamente debe ser algo que no estoy entendiendo.

Por ejemplo, debajo de:

" Para crear una lista de control de acceso para el usuario de la aplicación, y que le permite conectarse a localhost en el puerto 1925, haga lo siguiente:"

viene un código que no logro entender si se trata de un PROCEDURE, me parece como si fueran 3 PROCEDURE, tampoco me doy cuenta si esos procedimientos lo ejecuto una sola vez.

Volveré a intentar a ver si logro algo ... si Ud. tiene algún comentario que darme, se lo agradezco.

Gracias.

En respuesta a por Manuel

En el código que comentas, por lo que veo se está utilizando el package dbms_network_acl_admin para configurar la conexión sobre la que se está utilizando Stunnel. No es un procedure, son simplemente tres pasos previos que tienes que ejecutar directamente para que después el procedure funcione, una inicialización previa.

 

 Hola Carlos: 
Soy nuevo aqui, me parece muy interesante el blog. Necesito mandar un e.mail con PLSQL, lo enviar, pero no se como adjuntar un archivo, agradeceria tu ayuda. Muchas gracias.

 

Otra duda... Quiero enviar mail comun desde la base de datos, ya lo logre hacer con SYS pero quiero hacerlo con otro usuario y no me deja, me da error de que no tiene habilitado ACL.

Cuando quiero ejecutar el siguiente codigo para crear ACL:

BEGIN

   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (

    'utl_smtp.xml',

    'SMTP Access',

    'USUARIO',

    TRUE,

    'connect',

    null,

    null

  );

  COMMIT;

END;

 

y los otros 2 procedimientos que siguen tampoco me deja, porque me dice que esta corrupto el package body DBMS_NETWORK_ACL_ADMIN.

 

Sabes como puedo solucionar eso?

 

 

En respuesta a por diegozaw

Hola Diego

 

Si el código del package está corrupto tendrías que repararlo volviendo a cargar el código del package. Te enlazo un post que explica cómo reparar packages inválidos.

Pero sobretodo asegúrate antes de tocar nada de que realmente el cuerpo del package no está bien, ya que la operación de recrear y recompilar los packages y vistas del catálogo no deja de ser delicada.

Como explican en el post, antes de nada, para comprobar el estado general utiliza a sentencia 

SELECT r.comp_name, r.version, r.status FROM dba_registry r;

 

Hice todo lo que decia pero no me funciona, es mas me compila todo menos el package DBMS_NETWORK_ACL_ADMIN.

Tengo otra base de datos que tambien tiene corrupto ese package pero igual envia con otro usuario distinto a SYS, es muy raro.

En respuesta a por diegozaw

Buscando un poco he encontrado este post donde comentan que para utlizar ACL se ha de tener instalado previamente XML DB, ya que las ACL se almacenan en XML DB:

The 11g allows access to external packages UTL_TCP, UTL_HTTP, UTL_SMTP, UTL_MAIL, UTL_INADDR, DBMS_LDAP, but the access must be granted explicitly. Please note that ACLs are stored in XML DB and user must install XML DB for the use of ACL, if not installed.

Podría ser eso, comprueba si tienes instalado XML DB, y prueba suerte de nuevo :)

 

Hola Carlos

Esta buenisimo el tema, pero tengo una duda. Yo cree ya una ACL direccionando al correo de la empresa y todo funciono perfecto.

Ahora necesito utilizar gmail, solo funciona con Stunnel? debe instalarse en el servidor donde este la base de datos?

gracias por la ayuda

 

Hola Carlos, mi pregunta es: como se puede recibir correos mediante Oracle, poder obtener el remitente, asunto, cuerpo del mensaje y los archivos adjuntos? muchas gracias por la ayuda

En respuesta a por Yesenia

La verdad es que nunca he utilizado Oracle para recibir o almacenar correos. No sé si existe algún package específico que te permita parsear directamente los campos sobre una tabla, y además almacenar ficheros adjuntos.

Si no, lo que seguro que encontrarás es alguna utilidad externa para convertir los mails a XML, y después podrías importarlos a Oracle con las utilidades para trabajar con XML.

 

Hola, cómo puedo enviar emails a otros dominios como hotmail, etc? Internamente puedo enviar emails, pero para enviar externos me sale ORA-29279:SMTP permanent error: 550 5.7.1 Unable to relay.
Gracias de antemano

Hola Carlos,

Actualmente existe un procedimiento que esta utilizan el utl_SMTP. Los correos salen perfectamente sin ningun problema. Sin embargo luego de varios dias, resulta que los correos no salen, entonces bajo la base de datos e inmediatamente empiezan a salir. Sabes que podrá ser el problema? Algun parametro en la base de datos?

Muchas gracias por su ayuda.

saludos,

Buenos dias...hay alguna manera de recibir correo en plsql..es que necesitamos recorrer la cabecera del correo para sacar de ahi la fecha en la q se ha enviado un correo..me podrias dar algun tipo de orientacion ya sea en este lenguaje o algun otro.. Gracias.

En respuesta a por Jean Carlos Oyague (no verificado)

Lo que yo tengo es un archivo en lenguaje pl/sql que permite enviar mensajes desde mi dominio da.go.cr. Si desea le puedo dar ese archivo, escríbame a: mgarcia at da.go.cr Con ese archivo no creo que pueda resolver lo de recorrer la cabecera del correo, pero si lo necesita, ya sabe, estoy a su disposición.

Hola Carlos, estoy probando UTL_MAIL sobre una Base Oracle 11G (que utiliza UTL_SMTP haciendo mas facil la programacion del PL/SQL para enviar mails).

Pero me encuentro con un problema que no logro resolver. Para descartar un tema de conectividad use el UTL_SMTP y resolvio perfecto. Se enviaron los mails. Ahora cuando utilizo el UTL_MAIL me da un error extraño de tipo de datos.

Intente cambiar todo al tipo de dato definido en el PR de UTL_SMTP y nada.

Copio debajo el codigo ORA que me arroja:

ORA-06502: PL/SQL: error numérico o de valor ORA-06512: en "SYS.UTL_MAIL", línea 654
ORA-06512: en "SYS.UTL_MAIL", línea 671 ORA-06512: en "PRC_SEND_MAIL", línea 19
ORA-06512: en línea 1

La linea #19 se corresponde con la llamada al UTL_MAIL.SEND()
La llamada la hago asi: EXEC PRC_SEND_MAIL('laura@dominio', 'laura@dominio');
y te paso el código porque no le encuentro la vuelta.

CREATE OR REPLACE PROCEDURE PRC_SEND_MAIL (p_from IN VARCHAR2, p_to IN VARCHAR2, p_cc IN VARCHAR2 DEFAULT NULL, p_co IN VARCHAR2 DEFAULT NULL, p_subject IN VARCHAR2 DEFAULT 'Subject vacio', p_message IN VARCHAR2 DEFAULT 'Mensaje vacio') AS mail_conn UTL_SMTP.connection;
p_smtp_host VARCHAR2 (30) := 'smtp-desarrollo.grupo.dominio.com';
p_smtp_port NUMBER :=25;
vMType VARCHAR2(30) := 'text/plain;
charset=us-ascii';
BEGIN mail_conn := UTL_SMTP.open_connection (p_smtp_host, p_smtp_port);
UTL_MAIL.SEND( sender => p_from, recipients => p_to, cc => p_cc, bcc => p_co, subject => p_subject, message => p_message, mime_type => vMType, priority => 3 );
UTL_SMTP.quit (mail_conn);
EXCEPTION WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error THEN NULL;
dbms_output.put_line ('Error: '||SQLERRM);

/ Les agradecere muchisimo vuestras colaboraciones.