HOWTO: Enviar emails desde X++

Email

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='http://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='http://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='http://www.jaestevan.com'>BODY de ejemplo en HTML!</a>",
                    "cc@jaestevan.com",         // opcional
                    "ficherodeejemplo.txt");    // opcional

Descarga

4 comentarios
  • jaestevan
    diciembre 16, 2011

    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.

  • Arturo
    diciembre 15, 2011

    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…

  • jaestevan
    noviembre 26, 2011

    Hola Martha,

    El enlace para descargar el proyecto está donde pone “Descargar Objetos (.xpo)”

    Saludos.

  • Martha
    noviembre 25, 2011

    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