Envio de eMails y SMS's con PL/SQL

Envio de eMails y SMS's con PL/SQL Carlos 20 May, 2010 - 17:09

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

 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,

En respuesta a por Esteban (no verificado)

Hola, estoy presentando exactamente el mismo problema que tu. ¿Pudiste resolverlo?

 

De antemano gracias por tu respuesta.

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.