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



