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 ...”.

  • Sistemas (Utilidad de envío de correo PKG_CORREO)

  • Curie (Sistema de Gestión de Correo)

  • Justo (Sistema de Gestión de Correo)

  • MNCS (Normativa sobre el envío de correo desde BD)

Debemos distinguir entre “el envío” de correo y “la gestión” de los correos enviados.

Sistemas mantiene la única utilidad de envío de correo desde la BD (paquete PKG_CORREO), que de hecho todos debemos usar (aunque, como os contamos más abajo, sea a través de Servicios de Gestión de Correo de BD):

Además, hay grupos de desarrollo (Curie y Justo) que han desarrollado servicios que permiten gestionar el correo (enviados, fallidos, hacer reenvíos, etc), aunque ambos servicios usan la utilidad de Sistemas (PKG_CORREO) cuando finalmente se envía el correo:

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

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”.

Para crear nuevos anexos se debe indicar el MIME_TYPE de los mismos, el valor por defecto es el “text/plain”. Los valores definidos son:

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:

      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:

  1. Se ha definido un email noreply@um.es para uso y disfrute de cualquier aplicación corporativa de la UMU

  2. 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

  3. 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.

 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:

 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:

  1. Mejor lectura del procedimiento PL/SQL cuando se ve el código

  2. Evitar, de momento, este incidente con el envío de correos hasta que veamos si tiene otra solución mejor.



  • Sin etiquetas