21-02-2019 Actualización de PKG_CORREO por parte de Sistemas, se añade el MIME_TYPE C_TIPO_PDF=“application/pdf” how_to_pkg_correo-v05.pdf
14-02-2017 IMPORTANTE Servicio de Correo de Pruebas para el Entorno de Desarrollo
12-11-2015 Actualización de PKG_CORREO por parte de Sistemas, añadiendo 2 parámetros más how_to_pkg_correo-v04.pdf
9-3-2015: Dirección de correo noreply para aplicaciones que envian mensajes y no quieren respuesta
Esta parte sólo pueden modificarla las personas que aparecen bajo Contactos. Los Desarrolladores que usan lo que se explica en esta entrada de la Wiki, pueden escribir Guías Técnicas (GTs) y FAQs en la sección de más abajo titulada “Wiki de ...”.
Contactos
Sistemas (Utilidad de envío de correo PKG_CORREO)
Merche moncina@um.es. Ext 3325
Jaiban jaiban@um.es. Ext 3325
Curie (Sistema de Gestión de Correo)
Carmen Cárceles mccm@um.es. Ext 7316
Vanessa vlo@um.es. Ext 7316
Justo (Sistema de Gestión de Correo)
Paco Guzman pguzman@um.es. Ext 4356
Paco Armero pacoar@um.es. Ext 4662
MNCS (Normativa sobre el envío de correo desde BD)
Juan Luis Serradilla juanlu@um.es. Ext 7604
Información Oficial
Debemos distinguir entre “el envío” de correo y “la gestión” de los correos enviados.
...
Si es la primera vez que vas a enviar correo desde BD, infórmate bien de todas las opciones que tienes expuestas anteriormente, leyendo la documentación de cada una de ellas, y entendiendo su funcionamiento y sus limitaciones. Todas las opciones deben incluir alguna “tabla de log” donde poder ver si se ha producido algún error al enviar el correo, que en el caso de la utilidad de Sistemas de envío directo de correo se llama TRAZAS_CORREO.
Wiki de Enviar Correo Electrónico desde la BD
FAQs
MIME_TYPEs definidos en el PKG_CORREO
Sistemas ha hecho una actualización de PKG_CORREO para incluir el MIME_TYPE C_TIPO_PDF=“application/pdf”.
...
| Bloque de código | ||
|---|---|---|
| ||
C_TIPO_TXT = “text/plain” C_TIPO_HTML = “text/html”; C_TIPO_APP = “application/octet-stream” C_TIPO_PDF = “application/pdf”; |
Los correos llegan a los desarrolladores en lugar de a los usuarios
Si los correos NO están llegando a los usuarios, pero sin embargo, les están llegando a los desarrolladores, es posible que durante el desarrollo/test se haya activado el parámetro FORZAR (TRUE) para que en el entorno de Desarrollo/Test NO le lleguen los correos a los usuarios, sino a los desarrolladores que están haciendo las pruebas. En tal caso, debes poner FORZAR a FALSE, para que el correo se envíe a los destinatarios correctos.
Para hacer pruebas en Desarrollo/Test es mejor utilizar el Servicio de Correo de Pruebas
Usar una imagen como firma del cuerpo del correo
Sistemas (Merche) ha hecho una actualización de PKG_CORREO para incluir dos nuevos parámetros en los procedimientos del CREA_CORREO:
| Bloque de código | ||
|---|---|---|
| ||
DESTINO VARCHAR2,
DESTINOCC VARCHAR2,
DESTINOCO VARCHAR2,
ASUNTO VARCHAR2,
ORIGEN VARCHAR2,
TIPCUERPO VARCHAR2,
CUERPO VARCHAR2,
CODERR OUT NUMBER,
MENERR OUT VARCHAR2,
ACUSE VARCHAR2,
FORZAR BOOLEAN DEFAULT FALSE,
DESTINOTEST VARCHAR2 DEFAULT NULL,
APLICACION VARCHAR2 DEFAULT NULL,
FIRMA BLOB DEFAULT NULL,
TIPO_FIRMA VARCHAR2 DEFAULT NULL |
Los dos últimos son los nuevos, donde FIRMA es un archivo BLOB que se pasa y el TIPO_FIRMA es el tipo de imagen que se está pasando, este parámetro tiene la forma “image/jpg” o “image/png”, etc…
Si no se pasa nada en la firma, el paquete de correo sigue funcionando como hasta ahora.
Gestionar CODERR devuelto por CREA_CORREO para llamar o no a FIN_CORREO
El procedimiento CREA_CORREO devuelve un código distinto de 0 si ha habido algún error, en cuyo caso cierra la conexión en el propio procedimiento, por lo que es fundamental que se controle el error devuelto para, en caso de error (CODERR <> 0) no hacer la llamada al FIN_CORREO.
Enviar correo desde una aplicación FundeWEB
Lee la guía técnica para Enviar correo electrónico desde una aplicación FundeWEB
Componer mensaje de correo sin generar spam
En el 2011, MNCS publicó la Normativa de envío de correo desde Aplicaciones, donde en los puntos 1 y 2 se explica qué hay que hacer para que un mensaje NO sea detectado como SPAM:
Lo ideal es componer el mensaje como sólo texto (Content-Type “text/plain”), identificar al remitente (con “Nombre Apellidos”), y que el asunto no tenga todas las letras en mayúsculas.
Identificar el remitente con “nombre apellidos”), es decir, en lugar de poner “meloinvento@um.es”, usar “PEPITO PEREZ meloinvento@um.es”, indicando no sólo la dirección de correo del remitente, sino también su nombre y apellidos.
Repetir lo anterior para el destinatario (también CC y BCC).
El asunto NO debe estar todo en mayúsculas.
Si el cuerpo es html (Content-Type “text/html”), debe estar bien formado, y si es posible, incluir también la versión en sólo texto.
La fecha y la hora deben ser correctas.
Además, para la correcta visualización del mensaje en el cliente, indicaremos el juego de caracteres en el “Content-Type” (por ejemplo “text/plain; charset=ISO-8859-1“).
Dirección de correo noreply para aplicaciones que envian mensajes y no quieren respuesta
Para aquellas aplicaciones que quieran informar desde una cuenta de correo, en la que nos se quiere recibir respuesta, desde Telemática no informan que:
Se ha definido un email noreply@um.es para uso y disfrute de cualquier aplicación corporativa de la UMU
Se ha añadido un filtro en la estafeta de entrada de la UMU que sistemáticamente elimina cualquier mensaje dirigido a noreply@um.es
A partir de ahora, las aplicaciones que envíen notificaciones de las que no se desea respuesta deben usar noreply@um.es en el FROM (envelope sender), From: (cabecera) y en el Return-Path: (sobre todo)
Aparecen Espacios en Blanco en el Cuerpo del Mensaje
22-9-2014 (juanlu): Actualización. ¿Cuando exactamente se generan los espacios en blanco q estropean los mensajes html? Cuando al servidor SMTP le llegan 1000 bytes sin LF (Line Feed/Salto de Línea/CHR(10)). En este caso, habría q introducir un CHR(10) en el código fuente del PL/SQL, bien con “intros” en el editor (Toad/SQLdeveloper) o bien concatenando CHR(10) a pelo. Esto no afecta a las ristras de caracteres q van codificadas (p.e. una imagen incrustada). Ten en cuenta que un “<BR/>” NO es un CHR(10) (ó LF). OJO q esto afecta solo a ristras de caracteres q se envían directamente al servidor SMTP desde BD (como es el caso de PKG_CORREO).
17-9-2014 (juanlu): Actualización. Sistemas ha puesto consulta a Oracle y han respondido diciendo q en el cuerpo NO puede haber líneas de más de 1000 caracteres, por lo q hay q tener esto muy en cuenta, y no introducir líneas largas al editar los paquetes/procedimientos/funciones que crean los mensajes que se envían desde BD. De este modo se soluciona este problema y se aumenta la legibilidad del citado código PL/SQL.
| Bloque de código | ||
|---|---|---|
| ||
Note that as per SMTP RFC specification, there is a limit of 1000 chars per line.
In other words, after each 1000 chars (or less), the client must insert a new line character (CRLF).
You should split long lines so that each one will not exceed 1000 chars. This should not be a problem because
many document types (such as HTML as in the ct's test case) is not affected by the extra newlines.
If you wants to preseve the document's long lines, you needs to apply a transfer-encoding (e.g. quote-printable)
on top of the original document. Please see the documentation on PL/SQL package API utl_encode.quoted_printable_encode
(http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_encode.htm#i996731) for more info. |
FAQ original:
Se han detectado casos en los que el paquete de correo inserta un espacio en blanco en medio del cuerpo del mensaje, sin importar si es un VARCHAR2, LONG o CLOB.
Tras varias pruebas realizadas, hemos detectado una posible causa de este error que puede solventarse si formateamos de manera adecuada los mensajes.
Esta incidencia se ha probado desde las herramientas TOAD y SQL Developer obteniendo los mismos resultados. Se trata básicamente de NO generar líneas demasiado largas en el cuerpo del mensaje, y darles formato intentando evitar al máximo las concatenaciones en la variable que se genera del cuerpo del mensaje.
Ejemplo:
| Bloque de código | ||
|---|---|---|
| ||
declare
vc_destino varchar2(100);
vc_origen varchar2(100);
vc_asunto varchar2(100);
vc_cuerpo varchar2(32000);
ErrorMessage VARCHAR2(32000);
ErrorStatus NUMBER;
begin
vc_origen := 'moncina@um.es';
vc_destino := 'moncina@um.es'; --cambiar para hacer pruebas
vc_asunto := 'Pruebas correo';
-- Colocamos todo el texto en una sola linea
vc_cuerpo := 'Se ha registrado en el sistema la inscripción en prácticas en empresa que ha realizado.<br><br><style> body { font-size:11px;font-family:Verdana, Arial, Helvetica, sans-serif } table { font-size:11px;font-family:Verdana, Arial, Helvetica, sans-serif } </style>Operación realizada el: 09-abr-2013 9:01:40<br><br>Datos de la inscripción: <hr><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F"> <tr> <td align="center"> <font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Datos personales</b></font> </td> </tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td> <table width="100%" border="0" cellspacing="1" cellpadding="2"> <tr bgcolor="#FFFFFF"> <td width="39%" bgcolor="#DADADA">Teléfonos de contacto</td> <td width="61%"> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr><td>617341541<a href="https://practicas.um.es/practicas/practicasalumno.inscripcion.modificar_inscripcion.do"></a></td></tr></table> </td> </tr> <tr bgcolor="#FFFFFF"> <td width="39%" bgcolor="#DADADA">Correo electrónico de contacto</td> <td width="61%"> josemanuel.nieto@um.es</td> </tr> <tr bgcolor="#FFFFFF"> <td width="39%" bgcolor="#DADADA">Provincia/Zona/Municipio de Prácticas</td> <td width="61%">MURCIA</td> </tr></table></td></tr></table><br><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F"> <tr> <td align="center"> <font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Titulación por la que realiza la inscripción</b></font> </td> </tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td> <table width="100%" border="0" cellspacing="1" cellpadding="2"> <tr bgcolor="#FFFFFF"> <td width="22%" bgcolor="#DADADA">Curso académico</td> <td width="10%">2012</td> <td width="20%" bgcolor="#DADADA">Titulación</td> <td>LICENCIADO EN ADMINISTRACIÓN Y DIRECCIÓN DE EMPRESAS</td></tr> </table></table><br><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F"> <tr> <td align="center"> <font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Idiomas que conoce</b></font> </td> </tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td> <table width="100%" border="0" cellspacing="1" cellpadding="2"> <tr bgcolor="#DADADA"> <td>Idioma</td> <td>Nivel</td> </tr><tr bgcolor="#FFFFFF"><td>INGLÉS</td><td>CONVERSACION</td></tr> </table></table><br><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F"> <tr> <td align="center"> <font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Cursos realizados</b></font> </td> </tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td> <table width="100%" border="0" cellspacing="1" cellpadding="2"><tr bgcolor="#FFFFFF"><td>No ha indicado ningún curso realizado.</td></tr> </table></table><br><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F"> <tr> <td align="center"> <font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Otros datos de interés</b></font> </td> </tr></table><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> <tr> <td> <table width="100%" border="0" cellspacing="1" cellpadding="2"> <tr bgcolor="#FFFFFF"> <td width="30%" bgcolor="#DADADA">Incluir prácticas en Cv?</td> <td>Si</td> </tr> <tr bgcolor="#FFFFFF"> <td width="30%" bgcolor="#DADADA">Compensación económica</td> <td>No</td> </tr> <tr bgcolor="#FFFFFF"> <td bgcolor="#DADADA">Desplazamiento</td> <td>Si</td> </tr> <tr bgcolor="#FFFFFF"> <td bgcolor="#DADADA">Permiso de conducir</td> <td>Si</td> </tr> <tr bgcolor="#FFFFFF"> <td bgcolor="#DADADA">Vehículo propio</td> <td>Si</td> </tr> <tr bgcolor="#FFFFFF"> <td bgcolor="#DADADA">Conocimientos en informática</td> <td>Si</td> </tr> <tr bgcolor="#FFFFFF"> <td bgcolor="#DADADA">Periodo en el que desea realizar las práctica</td> <td>A lo largo del curso</td> </tr> <tr bgcolor="#FFFFFF"> <td bgcolor="#DADADA">Horario deseado</td> <td>Indiferente </td></tr> </table></table><br> </table></table><br>';
vc_cuerpo := 'Se ha registrado en el sistema la inscripción en prácticas en empresa que ha realizado.<br><br>
<style>
body { font-size:11px;font-family:Verdana, Arial, Helvetica, sans-serif }
table { font-size:11px;font-family:Verdana, Arial, Helvetica, sans-serif }
</style>
Operación realizada el: 09-abr-2013 9:01:40<br><br>
Datos de la inscripción:
<hr>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F">
<tr>
<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Datos personales</b></font></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr bgcolor="#FFFFFF">
<td width="39%" bgcolor="#DADADA">Teléfonos de contacto</td>
<td width="61%">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>617341541<a href="https://practicas.um.es/practicas/practicasalumno.inscripcion.modificar_inscripcion.do"></a></td>
</tr>
</table>
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="39%" bgcolor="#DADADA">Correo electrónico de contacto</td>
<td width="61%"> josemanuel.nieto@um.es</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="39%" bgcolor="#DADADA">Provincia/Zona/Municipio de Prácticas</td>
<td width="61%">MURCIA</td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F">
<tr>
<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Titulación por la que realiza la inscripción</b></font></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr bgcolor="#FFFFFF">
<td width="22%" bgcolor="#DADADA">Curso académico</td>
<td width="10%">2012</td>
<td width="20%" bgcolor="#DADADA">Titulación</td>
<td>LICENCIADO EN ADMINISTRACIÓN Y DIRECCIÓN DE EMPRESAS</td>
</tr>
</table>
</table>
<br>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F">
<tr>
<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Idiomas que conoce</b></font></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr bgcolor="#DADADA">
<td>Idioma</td>
<td>Nivel</td>
</tr>
<tr bgcolor="#FFFFFF">
<td>INGLÉS</td>
<td>CONVERSACION</td>
</tr>
</table>
</table>
<br>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F">
<tr>
<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Cursos realizados</b></font></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr bgcolor="#FFFFFF">
<td>No ha indicado ningún curso realizado.</td>
</tr>
</table>
</table>
<br>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#8BCB1F">
<tr>
<td align="center"><font face="Verdana, Arial, Helvetica, sans-serif" color="#FFFFFF"><b>Otros datos de interés</b></font></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">
<tr>
<td>
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr bgcolor="#FFFFFF">
<td width="30%" bgcolor="#DADADA">Incluir prácticas en Cv?</td>
<td>Si</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="30%" bgcolor="#DADADA">Compensación económica</td>
<td>No</td>
</tr>
<tr bgcolor="#FFFFFF">
<td bgcolor="#DADADA">Desplazamiento</td>
<td>Si</td>
</tr>
<tr bgcolor="#FFFFFF">
<td bgcolor="#DADADA">Permiso de conducir</td>
<td>Si</td>
</tr>
<tr bgcolor="#FFFFFF">
<td bgcolor="#DADADA">Vehículo propio</td>
<td>Si</td>
</tr>
<tr bgcolor="#FFFFFF">
<td bgcolor="#DADADA">Conocimientos en informática</td>
<td>Si</td>
</tr>
<tr bgcolor="#FFFFFF">
<td bgcolor="#DADADA">Periodo en el que desea realizar las práctica</td>
<td>A lo largo del curso</td>
</tr>
<tr bgcolor="#FFFFFF">
<td bgcolor="#DADADA">Horario deseado</td>
<td>Indiferente</td>
</tr>
</table>
</table>
<br>
</table>
</table>
<br>';
--
PKG_CORREO.CREA_CORREO(
DESTINO => vc_destino,
DESTINOCC => null,
DESTINOCO => null,
ASUNTO => vc_asunto || ' UMU',
ORIGEN => vc_origen,
TIPCUERPO => 'H',
CUERPO => vc_cuerpo,
CODERR => ErrorStatus,
MENERR => ErrorMessage,
ACUSE => 'N',
FORZAR => true,
DESTINOTEST => null,
APLICACION => 'CURIE'
);
PKG_CORREO.FIN_CORREO;
end; |
El resultado cuando colocamos el texto en una sola línea es el siguiente:
El resultado cuando colocamos el texto en múltimples líneas evitando al máximo las concatenaciones es el siguiente:
Por lo tanto, se recomienda el uso de variables para preparar el cuerpo del mensaje, pero también generarlo en una estructura formateada para:
Mejor lectura del procedimiento PL/SQL cuando se ve el código
Evitar, de momento, este incidente con el envío de correos hasta que veamos si tiene otra solución mejor.

