Enviar correos desde Microsoft Dynamics AX mediante código X++ es muy sencillo, pero requiere de demasiado código si se quiere aplicar de manera reutilizable.
Para enviar un email utilizando la clase SysMailer estándar haremos algo parecido a esto:
SysMailer sysMailer; SysEmailParameters sysEmailParameters = SysEmailParameters::find(); InteropPermission interopPermissionClr = new InteropPermission(InteropKind::ClrInterop); InteropPermission interopPermissionCOM = new InteropPermission(InteropKind::ComInterop); Set permissionset = new set(Types::Class); #define.DefaultFromAddress("from@jaestevan.com") ; try { // Permisos permissionset.add(interopPermissionClr); permissionset.add(interopPermissionCOM); CodeAccessPermission::assertMultiple(permissionset); //Inicialización de los parámetros de correo electrónico. sysMailer = new SysMailer(); if (sysEmailParameters.smtpRelayServerName) { sysMailer.SMTPRelayServer(sysEmailParameters.smtpRelayServerName, sysEmailParameters.smtpPortNumber, sysEmailParameters.smtpUserName, sysEmailParameters::password(), sysEmailParameters.ntlm); } else { sysMailer.SMTPRelayServer(sysEmailParameters.smtpServerIPAddress, sysEmailParameters.smtpPortNumber, sysEmailParameters.smtpUserName, SysEmailParameters::password(), sysEmailParameters.ntlm); } // Dirección de origen sysMailer.fromAddress(#DefaultFromAddress); } catch { throw error("No se puede inicializar el envío de emails"); } // OK! SysMailer inicializado con parámetros y dirección de origen // Añadir destinatario sysMailer.tos().appendAddress("test@jaestevan.com"); // Se pueden añadir destinatarios en copia (CC) sysMailer.ccs().appendAddress("cc@jaestevan.com"); // Subject del mensaje sysMailer.subject("Mensaje de prueba"); // Cuerpo del mensaje sysMailer.htmlBody("<a href='https://www.jaestevan.com'>BODY de ejemplo en HTML!</a>"); // Hasta se pueden añadir ficheros adjuntos! sysMailer.attachments().add("ficherodeejemplo.txt"); // Let's dance! sysMailer.sendMail(); // Renuncia de los permisos CodeAccessPermission::revertAssert();
Como se puede ver es bastante facil y la utilización es intuitiva … excepto la parte de inicialización. Para evitar esto se puede construir una clase que encapsule toda esa inicialización para no tenerla que repetir cada vez. De esta manera el código queda todavía mas sencillo:
JAEEmail emailClass; ; // Construir! emailClass = JAEEmail::construct("from@jaestevan.com"); // Añadir destinatario emailClass.addTo("test@jaestevan.com"); // Se pueden añadir destinatarios en copia (CC) emailClass.addCc("cc@jaestevan.com"); // Subject del mensaje emailClass.parmSubject("Mensaje de prueba"); // Cuerpo del mensaje emailClass.parmBody("<a href='https://www.jaestevan.com'>BODY de ejemplo en HTML!</a>"); // Hasta se pueden añadir ficheros adjuntos! emailClass.addAttachment("ficherodeejemplo.txt");
Esta clase se puede heredar para especializar todavía mas su utilización en cada caso, sobrecargando los métodos que se desee para que funcionen de una manera diferente o ampliar la funcionalidad como añadir mas mensajes de error o avisos, configurar valores por defecto, etc. …
Y como la clase estándar tiene una llamada para enviar un email directamente (sin llamar a los métodos por separado):
sysMailer.quickSend("from", "to", "subject", "body", "cc", "attach"); // opcionales
Yo también he hecho un método parecido en mi propia clase. Ya no puede ser mas facil 🙂
// Envío directo! JAEEmail::quickSend("from@jaestevan.com", "test@jaestevan.com", "Mensaje de prueba", "<a href='https://www.jaestevan.com'>BODY de ejemplo en HTML!</a>", "cc@jaestevan.com", // opcional "ficherodeejemplo.txt"); // opcional
Descarga
Gracias Arturo por el comentario.
Llevar el envío de emails a un proceso por lotes es una buena idea. Evitas tener que esperar (el proceso es asíncrono), tienes un Log de emails enviados y puedes aislar la seguridad al usuario del AOS.
Saludos.
Que onda Estevan, oye un comentario, estoy viendo tu articulo me parece muy bueno, yo hice algo parecido pero tuve un problema con el password de los parametros del email, porque ya ves que esta cifrada, por se utiliza el metodo de la tabla y tiene seguridad para que solo una persona con determinados privilegios pueda ejecutar este metodo y que le regrese la clase descifrada.
Y bueno lo solucione poniendo la clave en una macro, y ya me funciono, aunque ahora estoy planenando mover todas la clases que tengo que envian correos a que utilicen el batch de AX porque cuando envias el correo se tarda el proceso en hacer el envio del mismo, porque no lo corre en un thread diferente…
Hola Martha,
El enlace para descargar el proyecto está donde pone “Descargar Objetos (.xpo)”
Saludos.
En esta página antes de la descarga comenta
que En el enlace siguiente esta clase y el código de este post en un proyecto para hacer pruebas.
en donde se puede ver???
Gracias por su apoyo!
Saludos
Martha