{"id":731,"date":"2019-11-21T08:15:50","date_gmt":"2019-11-21T12:45:50","guid":{"rendered":"http:\/\/gregorgonzalez.com.ve\/blog\/?p=731"},"modified":"2019-11-21T08:42:30","modified_gmt":"2019-11-21T13:12:30","slug":"error-en-fechas-al-enviar-correo-utl_smtp-oracle","status":"publish","type":"post","link":"https:\/\/gregorgonzalez.com.ve\/blog\/error-en-fechas-al-enviar-correo-utl_smtp-oracle\/","title":{"rendered":"Error en fechas al enviar correo UTL_SMTP &#8211; Oracle"},"content":{"rendered":"<p>Oracle incluye un paquete para el manejo de env\u00edo de correo directamente desde la base de datos. Desde que me toc\u00f3 realizar una funci\u00f3n para enviar notificaciones a clientes, he trabajado a la par con dicha librer\u00eda, todas las pruebas fueron correctas, desde cambio de formato a html, m\u00faltiples recipientes de correo separados por coma, sin embargo al visualizar los correos no hab\u00eda notado algo importante, aunque llegaba a la bandeja de entrada de primero en outlook, ten\u00edan la fecha errada y si tienes ordenado los correos por fecha, no se encontrar\u00edan en la fecha de hoy.<\/p>\n<p>Este problema se debe a que hay que especificar un formato de fecha correcto que acepta la librer\u00eda smtp de oracle en su encabezado. El encabezado es obligatorio y no hay forma autom\u00e1tica de que obtenga la fecha actual, uno debe especificarla manualmente.<\/p>\n<p>Inicialmente utiliz\u00e1bamos un formato simple en ANSI el cual es lo com\u00fan para estos sistemas:<\/p>\n<p>&#8216;Date: &#8216; || to_char(sysdate, &#8216;YYYY-MM-DD HH24:MI:SS&#8217;)<\/p>\n<p>Luego al leer la documentaci\u00f3n oficial, se debe utilizar el est\u00e1ndar de RFC1123 el cual indica que podemos usarla de esta manera<\/p>\n<p>Dy, DD Mon YYYY HH24:MI:SS<\/p>\n<p>Que aunque no es com\u00fan indicar texto entre fechas, usualmente es solo n\u00fameros, es un est\u00e1ndar adecuado para oracle. Esto nos imprimir\u00eda:<\/p>\n<p>SELECT TO_CHAR(SYSTIMESTAMP, Dy, DD Mon YYYY HH24:MI:SS) FROM DUAL;<\/p>\n<p>\u00abFri, 09 Aug 2019 14:09:21\u00bb<\/p>\n<p>Que es un formato correcto, sin embargo al cambiarnos de servidor de pruebas a producci\u00f3n, notamos que dej\u00f3 de funcionar y la fecha llegaba errada tanto para las horas como los meses, mostraba la fecha 5 meses atr\u00e1s.<\/p>\n<p>Entonces al verificar, en producci\u00f3n mostraba \u00abVie 09 Ago\u00bb, porque estaba configurado en espa\u00f1ol y el texto en espa\u00f1ol no es un est\u00e1ndar para la cabecera, siempre debe ser en ingl\u00e9s, entonces se tuvo que modificar. Tambi\u00e9n para ser mas preciso las horas, se puede agregar la zona horaria \u00abTZH:TZM\u00bb quedando de esta manera:<\/p>\n<p>&#8216;Date: &#8216; || TO_CHAR(SYSTIMESTAMP, &#8216;Dy, DD Mon YYYY HH24:MI:SS TZH:TZM&#8217;,&#8217;NLS_DATE_LANGUAGE=ENGLISH&#8217;)<\/p>\n<p>Aunque se discute si se le puede agregar una coma o utilizar el doble puntos, esto depende completamente del servidor smtp, puede o no puede reconocer \u00abDy, DD mon\u00bb con coma, o incluso el doble puntos \u00abHH24:MI:SS\u00bb, as\u00ed que basta con probar y comprobar.<\/p>\n<p>Nuestra funci\u00f3n final qued\u00f3 de la siguiente manera:<\/p>\n<pre class=\"lang:plsql decode:true\">UTL_SMTP.DATA(v_conex,\r\n    'Date: '   || TO_CHAR(SYSTIMESTAMP, 'Dy, DD Mon YYYY HH24:MI:SS TZH:TZM','NLS_DATE_LANGUAGE=ENGLISH') || CRLF ||\r\n    'From: '   || v_desde || CRLF ||\r\n    'Subject: '|| v_titulo || CRLF ||\r\n    'To: '     || v_email  || CRLF ||\r\n    'MIME-Version: 1.0'|| CRLF ||    \r\n    'Content-Type: text\/html;charset=UTF-8'|| CRLF ||            \r\n    CRLF ||\r\n    CONVERT_SPECIAL_CHAR(v_mensaje)|| CRLF\r\n);<\/pre>\n<p>Utilizando el Date correcto, cambiando el correo en html y convertimos los caracteres especiales a html con una funci\u00f3n propia. Esto es importante, que sea en html para evitar problemas con acentos y caracteres utf8.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oracle incluye un paquete para el manejo de env\u00edo de correo directamente desde la base de datos. Desde que me toc\u00f3 realizar una funci\u00f3n para enviar notificaciones a clientes, he trabajado a la par con dicha librer\u00eda, todas las pruebas fueron correctas, desde cambio de formato a html, m\u00faltiples recipientes de correo separados por coma, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":660,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[239],"tags":[274,178,241,275,276],"_links":{"self":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/731"}],"collection":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/comments?post=731"}],"version-history":[{"count":2,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/731\/revisions"}],"predecessor-version":[{"id":733,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/731\/revisions\/733"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media\/660"}],"wp:attachment":[{"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media?parent=731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/categories?post=731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/tags?post=731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}