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();

Continue Reading…

Un novato en la Conferencia Agile Spain 2011

Conferencia Agile Spain 2011

Voy a procurar no extenderme mucho para contar lo sucedido en estos dos días de conferencias que hemos podido disfrutar en la Universidad Jaime I de Castellón, empezando como no podía ser de otra manera felicitando la impecable organización por parte de los organizadores de Agile Spain. Un 10 para ellos y mi agradecimiento.

Después comentar que es mi primer evento “masivo” en la comunidad Agile Spain así que no tengo la oportunidad de hacer una valoración comparativa como otros compañeros están haciendo. Como es obvio, sólo voy a comentar las charlas a las que asistí. Ha quedado un poco largo, si te aburre puedes bajar directamente a las conclusiones 🙂

Conferencia Agile Spain 2011

Voy a procurar no extenderme mucho para contar lo sucedido en estos dos días de conferencias que hemos podido disfrutar en la Universidad Jaime I de Castellón, empezando como no podía ser de otra manera felicitando la impecable organización por parte de los organizadores de Agile Spain. Un 10 para ellos y mi agradecimiento.

Después comentar que es mi primer evento “masivo” en la comunidad Agile Spain así que no tengo la oportunidad de hacer una valoración comparativa como otros compañeros están haciendo. Como es obvio, sólo voy a comentar las charlas a las que asistí. Ha quedado un poco largo, si te aburre puedes bajar directamente a las conclusiones 🙂

Continue Reading…

¿Agile en el canal Dynamics? ¿Locura?

Insanity: doing the same thing over and over again and expecting different results.- Albert Einstein
(Locura es hacer lo mismo una y otra vez y esperar resultados diferentes)

Como expuse en mi anterior post: ¿Sure Step vs Agile? Condenados a entendernos, estoy convencido de que un cambio de filosofía hacia el mundo ágil no sólo es positivo sino que es totalmente posible dentro del mundo de los grandes ERP en general, y del canal Dynamics en particular.

Como exponía en ese artículo, hay varios handicap que superar como la resistencia al cambio (hay que cambiar la mentalidad de muchas personas involucradas), la falta de confianza en el sistema para proyectos de largo alcance o incluso la falta de colaboración del cliente. Sin embargo hay ciertos trabajos muy típicos de esta industria que son ideales para empezar a experimentar con este cambio, a pesar de que el proyecto, en general, se gestione con Sure Step:

  • Migraciones (cambios de versión): Una migración es un proceso totalmente acotado con tareas claramente definidas y planificables, pero lo importante es que en este proceso no es tan importante la documentación (a menudo no es para nada importante) como la implicación del cliente en el proceso tanto para la realización de diversas pruebas al finalizar cada tarea, como para solucionar consultas sobre la marcha en caso de imprevistos (en las migraciones siempre hay imprevistos). Lo de “ágil” se vuelve literal ya que cuando el proceso de migración termina se tiene que implantar en tiempos de parada del cliente, casi siempre en un fin de semana.
  • Soporte post-arranque: Cuando se da por finalizada una implantación nueva y el cliente empieza a utilizar el sistema, a menudo se dará cuenta de que hay pequeños (o grandes) detalles que quiere modificar porque no se habían previsto durante las fases previas. La buena gestión de estas modificaciones puede diferenciar el éxito o el fracaso de una implantación ya que una cosa es que el proyecto finalice, y otra que el cliente de por cubiertas sus necesidades (o las que cree que lo son). Hacerle participe del coste y el esfuerzo de esos “extra” puede ser determinante para cerrar la implantación con todas las partes satisfechas.
  • Actualciones de mantenimiento: De la misma manera que en el punto anterior, trabajar con un sistema programable como lo son todos los grandes ERP’s hace que siempre haya pequeños o grandes cambios a realizar para optimizar el trabajo diario. La buena gestión de las necesidades, el desarrollo y la implantación de los cambios sin interferir el trabajo de los usuarios es determinante para que los mantenimientos se finalicen con éxito y sin fricciones.

Si alguien ya ha empezado o esta interesado en estos cambios me encantaría recibir opiniones en los comentarios. Y si alguien quiere comentar o debatir en persona estaré en la próxima Conferencia Agile-Spain 2011 (#cas_2011)

AX TIP: Validar permisos (claves de seguridad) por código

A veces en nuestros desarrollos queremos limitar ciertos procesos a usuarios que tengan activa determinada clave de seguridad (Security Key):


(la imagen es de la documentación oficial)

 Para hacerlo utilizaremos las funciones que el estándar dispone para ello. Encontramos un ejemplo de utilización en la clase estándar SysTest:

// Only a developer can run unit tests
if (hasSecuritykeyAccess(securitykeynum(SysDevelopment), AccessType::Delete))
{
    // Código protegido
    ...
}
else
{
    throw error(strfmt("@SYS97038", securitykeystr(SysDevelopment), enum2str(AccessType::Delete)));
}