Nombrando archivos adjuntos en el adaptador de SMTP

BTS ofrece la posibilidad de enviar correos electrónicos a través del adaptador SMTP, para lo cual basta con definir un pipeline de envió (send pipeline) personalizado y agregar un nuevo "MIME/SMIME encoder" en el cual debemos especificar la propiedad "Send body part as attachment" como "True" como se muestra en la siguiente figura.

Cuando se envía el email el adaptador SMTP automáticamente asigna el valor "Attachment0" como nombre del archivo adjunto, pero existen dos formas de cambiar el nombre por defecto al archivo adjunto enviado.

Una primera forma es una ayuda que trae el propio MSDN, en esta ayuda se muestra la forma en la cual definiendo una utilizando el método SetPartProperty de la clase XLANGPart.

using System;using Microsoft.XLANGs.BaseTypes; //comes from Microsoft.XLANGs.BaseTypes.dllusing MIME; //comes from Microsoft.Biztalk.GlobalPropertySchemas.dll

namespace

SMTPUtils{   public class Part   {      ...      public static void SetFileName(XLANGPart part, string fileName)      {         part.SetPartProperty(typeof(MIME.FileName), fileName);      }      ...   }}

**

** Extraido de Source Code for the SMTP Utilities

Luego, desde la orquestación basta con establecer el código que se muestra a continuación en un "Expression Shape", donde Message_ToSend es el mensaje a enviar al puerto.

SMTPUtils.Part.SetFileName(Message_ToSend.part, "FileName.xml");

Esta es una forma muy sencilla de establecer el nombre del archivo adjunto en el caso de existir la orquestación, pero ¿Como podemos establecer el nombre del archivo adjunto si no utilizamos una orquestación? De acuerdo a la arquitectura de BTS, es posible utilizar solamente puerto relacionador para enlutar mensajes en nuestra plataforma EAI sin necesidad de utilizar elementos como orquestaciones.

Existe otra forma de establecer el nombre del archivo adjunto y es por medio de un pipeline personalizado de ensamblado. No es la intención de este post explicar como se construye un assembly de ensamblado, para mayor información visitar Developing an Assembling Pipeline Component.

Al desarrollar el nuevo Ensamblador basta con establecer la propiedad FileName al namespace MIME/SMIME con el nombre del nuevo archivo al BodyPart del mensaje, este código debe de escribirse en el metodo Execute(IPipelineContext, IBaseMessage) tal como lo muestra el código descrito:

...public IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg){   // asignar nombre de archivo al body principal   inmsg.BodyPart.PartProperties.Write( "FileName", https://schemas.microsoft.com/BizTalk/2003/mime-properties, "FileName.xml");   return inmsg;}...

En el anterior código hemos utilizado el método Write de la interfaz IBaseMessageContext el cual escribe una propiedad dentro del contexto del mensaje, en este caso dentro del contexto del BodyMessagePart.

  • El primer parámetro es el nombre de la propiedad, en nuestro caso FileName
  • El segundo parámetro es el namespace del schema correspondiente a MIME/SMIME que es https://schemas.microsoft.com/BizTalk/2003/mime-properties
  • El tercer parámetro es el valor de la propiedad, en nuestro caso el nombre del archivo adjunto

Después de haber desarrollado el ensamblador, basta con referenciarlo desde el pipeline personalizado tal como lo muestra la Figura 1. Dicha figura tiene dos componentes de pipeline en el stage "Encode", el primer es el componente "MIME/SMIME" en el cual le indicamos a BTS que se va a enviar el mensaje como un archivo adjunto y el componente posterior es llamado "XSL Transform… " en el cual se especifica el nombre del archivo adjunto además de realizar en forma adicional otra operación específica.

ATENCIÓN

Es necesario hacer una aclaración respecto a la documentación de MSDN la cual dice:

"To set the file name for MIME attachments, use the FileName property in the System namespace for the message part"

Esta afirmación no es del todo cierta, ya que es necesario establecer la propiedad FileName a cada "message part" del namespace "MIME/SMIME" tal como se mostró en el código anteriormente escrito en ves del namespace "System" como lo dice la documentación.

Autor: Carlos Medina

Este mensaje se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho