Monday, September 19, 2016

Sending file as attachment using BizTalk Orchestration

The Simple Mail Transfer Protocol (SMTP) adapter is used to exchange information between a server running Microsoft BizTalk Server and other applications by means of the SMTP protocol. BizTalk Server can send messages to other applications by creating an e-mail message and delivering it to a specified e-mail address. BizTalk supports both ways - Static configuration and Dynamic configuration of SMTP adapter.

You would need to send email from Orchestration for various scenarios like dynamic mailto address/ Subject/Body or in workflow notification is to be send  where Subject changes depending upon  various scenarios ex. on success -- Subject is to be sent is "Transaction/Process completed successfully" and in error scenario "Transaction/Process failed" etc.

To demonstrate how to configure SMTP Port dynamically and how to add attachments, have used following scenario:



Scenario:


Keeping it simple, you receive a message which has details of email to be sent in it. You construct email message and configure SMTP adapter using those details.


Building the Solution:


1. Create schema for message holding email details

2. Create orchestration

Create an orchestration containing a Receive shape to receive Email_Details message from a static one way Receive port  followed by a Construct message shape containing a Message assignment shape where SMTP adapter is configured dynamically, and a send shape to send Email message through Dynamic port(code below). We also need to create two message,one for the input message based on Email Details schema and one for the output message based on String datatype.


SMTP.Attachments is the property available with SMTP adapter which provides a way to pass the path of files to be attached. If more than one fie is to be attached then, paths can be concatenated using pipe(|).

Constructing Email message and configuring dynamically SMTP server


MSG_Email= System.String.Empty;

MSG_Email(SMTP.Subject) = MSG_EmailDetails.Subject;

MSG_Email(SMTP.From) = MSG_EmailDetails.FromAddress;

MSG_Email(SMTP.SMTPHost) = "DemoMachinePM";

MSG_Email(SMTP.EmailBodyText) = MSG_EmailDetails.Body;

MSG_Email(SMTP.EmailBodyTextCharset) = "UTF-8";

MSG_Email(SMTP.Attachments) = MSG_EmailDetails.Attachments;

//For sending email to cc address use below line of code
MSG_Email(SMTP.CC) = MSG_EmailDetails.CcAddress;

MSG_Email(Microsoft.XLANGs.BaseTypes.ContentType) = "text/plain";
Port_Dynamic_SendEmail(Microsoft.XLANGs.BaseTypes.Address) = "mailto:"+MSG_EmailDetails.ToAddress;

I have set MSG_Email as System.String, as I don't intend to do anything with BizTalk message(MSG_EmailDetails). In case I needed to send the BizTalk message as an attachment then I would set MSG_Email as System.Xml.XmlDocument and assign the MSG_EmailDetails to it.

MSG_Email = MSG_EmailDetails;

And to send this also as an attachment would add following code

MSG_Email(SMTP.MessagePartsAttachments) = 1;

The send port used to send email is set as Dynamic one way (only send) with Pass Thru pipeline and address is set to toAddress.

3. Deploy and Test

Sign the application and deploy it, create a Recieve port with Receive Location having XmlReceive Pipeline. Send port would be already available as it is created while deploying solution because of it's dynamic binding.

To test the application, create the instance of MSG_EmailDetails and populate it with values and drop the file at location which is binded to the receive location.

Case 1: Input file (with one attachment info)


<ns0:Email xmlns:ns0="http://EmailAttachmentDemo.EmailDetails">

  <ToAddress>maheshstiwari@gmail.com</ToAddress>

  <CcAddress>maheshkumar.tiwari@emtecinc.com</CcAddress>

  <FromAddress>demo@demomachine.com</FromAddress>

  <Subject>Email with attachment from demo server</Subject>

  <Body>Dynamic Email with attachment from demo server.</Body>

  <Attachments>C:\Test\Attachment1.txt</Attachments>

</ns0:Email>

Output (Email delivered with one attachment)

Case 2: Input file (with two attachment info)

In order to sent multiple attachment, '|' (pipe) is used as delimeter(marked in red below sample)


<ns0:Email xmlns:ns0="http://EmailAttachmentDemo.EmailDetails">

  <ToAddress>maheshstiwari@gmail.com</ToAddress>

  <CcAddress>maheshkumar.tiwari@emtecinc.com</CcAddress>

  <FromAddress>demo@demomachine.com</FromAddress>

  <Subject>Email with attachment from demo server</Subject>

  <Body>Dynamic Email with multiple attachment from demo server.</Body>

  <Attachments>C:\Test\Attachment1.txt|C:\Test\Attachment2.txt</Attachments>

</ns0:Email>

Output (Email delivered with two attachment)
Case 3: Sending Email Message also as an attachment


For sending MSG_Email message as attachment use below line of code

       

               MSG_Email(SMTP.MessagePartsAttachments) = 1;




As can be seen mail is received by address in cc along with EmailMessage as attachment too

Note:  
1.The location where attachments are, should be accessible
2.Toemail address must not be empty and its size must not exceed 256 characters
3.CCemail address size must not exceed 1024 characters


Download Sample:



No comments:

Post a Comment