Add an unknown number of attachments to html email

44 Views Asked by At

I have a SSIS package containing just a script task that sends an email.
The package is fed all the necessary params (To, from, subject, body) and also a param (string) containing a list of filenames, separated by a pipe.
I would like to add those filenames as attachments to the email I am sending.
I guess I somehow have to split the string and loop through it to add the files using attachment.add method.
But my knowledge of C# is not enough.
Who can and is willing to explain to me how to do this?

Code as follows:

        #region Help:  Introduction to the script task
        /* The Script Task allows you to perform virtually any operation that can be accomplished in
        * a .Net application within the context of an Integration Services control flow. 
        * 
        * Expand the other regions which have "Help" prefixes for examples of specific ways to use
        * Integration Services features within this script task. */
        #endregion 
        #region Namespaces
        using System;
        using System.Data;
        using Microsoft.SqlServer.Dts.Runtime;
        using System.Windows.Forms;
        using System.Net;
        using System.Net.Mail;
        #endregion namespace ST_3806baf576ce4ad1ab06519f6706197b
        {
            /// <summary>
            /// ScriptMain is the entry point class of the script.  Do not change the name, attributes,
            /// or parent of this class.
            /// </summary>
            [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
            public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
            {
                #region Help:  Using Integration Services variables and parameters in a script
                /* To use a variable in this script, first ensure that the variable has been added to 
                 * either the list contained in the ReadOnlyVariables property or the list contained in 
                 * the ReadWriteVariables property of this script task, according to whether or not your
                 * code needs to write to the variable.  To add the variable, save this script, close this instance of
                 * Visual Studio, and update the ReadOnlyVariables and 
                 * ReadWriteVariables properties in the Script Transformation Editor window.
                 * To use a parameter in this script, follow the same steps. Parameters are always read-only.
                 * 
                 * Example of reading from a variable:
                 *  DateTime startTime = (DateTime) Dts.Variables["System::StartTime"].Value;
                 * 
                 * Example of writing to a variable:
                 *  Dts.Variables["User::myStringVariable"].Value = "new value";
                 * 
                 * Example of reading from a package parameter:
                 *  int batchId = (int) Dts.Variables["$Package::batchId"].Value;
                 *  
                 * Example of reading from a project parameter:
                 *  int batchId = (int) Dts.Variables["$Project::batchId"].Value;
                 * 
                 * Example of reading from a sensitive project parameter:
                 *  int batchId = (int) Dts.Variables["$Project::batchId"].GetSensitiveValue();
                 * */         #endregion         #region Help:  Firing Integration Services events from a script
                /* This script task can fire events for logging purposes.
                 * 
                 * Example of firing an error event:
                 *  Dts.Events.FireError(18, "Process Values", "Bad value", "", 0);
                 * 
                 * Example of firing an information event:
                 *  Dts.Events.FireInformation(3, "Process Values", "Processing has started", "", 0, ref fireAgain)
                 * 
                 * Example of firing a warning event:
                 *  Dts.Events.FireWarning(14, "Process Values", "No values received for input", "", 0);
                 * */
                #endregion         #region Help:  Using Integration Services connection managers in a script
                /* Some types of connection managers can be used in this script task.  See the topic 
                 * "Working with Connection Managers Programatically" for details.
                 * 
                 * Example of using an ADO.Net connection manager:
                 *  object rawConnection = Dts.Connections["Sales DB"].AcquireConnection(Dts.Transaction);
                 *  SqlConnection myADONETConnection = (SqlConnection)rawConnection;
                 *  //Use the connection in some code here, then release the connection
                 *  Dts.Connections["Sales DB"].ReleaseConnection(rawConnection);
                 *
                 * Example of using a File connection manager
                 *  object rawConnection = Dts.Connections["Prices.zip"].AcquireConnection(Dts.Transaction);
                 *  string filePath = (string)rawConnection;
                 *  //Use the connection in some code here, then release the connection
                 *  Dts.Connections["Prices.zip"].ReleaseConnection(rawConnection);
                 * */
                #endregion 
                /// <summary>
                /// This method is called when this script task executes in the control flow.
                /// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
                /// To open Help, press F1.
                /// </summary>
                public void Main()
                {
                    //$Package::parAttachment
                    //$Package::parBody
                    //$Package::parFromLine
                    //$Package::parSubject
                    //$Package::parToLine
                    //$Package::parAttachment eg. "c:\file1.txt|c:\file2.txt|file3.txt"
                    //$Project::parFolderSource
                    //$Project::parDestinationConnString             
    
    string htmlMessageFrom = Dts.Variables["$Package::parFromLine"].Value.ToString();
    string htmlMessageTo = Dts.Variables["$Package::parToLine"].Value.ToString();
    string htmlMessageSubject = Dts.Variables["$Package::parSubject"].Value.ToString();
    string htmlMessageBody = Dts.Variables["$Package::parBody"].Value.ToString();
    string smtpServer = "mail.mydomain.com";             

SendMailMessage(htmlMessageFrom, htmlMessageTo, htmlMessageSubject, htmlMessageBody, true, smtpServer);             Dts.TaskResult = (int)ScriptResults.Success;         }         private void SendMailMessage(string From, string SendTo, string Subject, string Body, bool IsBodyHtml, string Server)
                {             MailMessage htmlMessage;
                    SmtpClient mySmtpClient;
                    string attachFile = Dts.Variables["$Package::parAttachment"].Value.ToString();             System.Net.Mail.Attachment attachment;
                    attachment = new System.Net.Mail.Attachment(attachFile);             htmlMessage = new MailMessage(From, SendTo, Subject, Body);
                    htmlMessage.IsBodyHtml = IsBodyHtml;
                    htmlMessage.Attachments.Add(attachment);             mySmtpClient = new SmtpClient(Server);
                    mySmtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
                    mySmtpClient.Send(htmlMessage);         }         #region ScriptResults declaration
                /// <summary>
                /// This enum provides a convenient shorthand within the scope of this class for setting the
                /// result of the script.
                /// 
                /// This code was generated automatically.
                /// </summary>
                enum ScriptResults
                {
                    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
                    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
                };
                #endregion     }
        }
1

There are 1 best solutions below

0
Henrov On BEST ANSWER

Solved it like this: creating an array from a string

private void SendMailMessage(string From, string SendTo, string Subject, string Body, bool IsBodyHtml, string Server)
        {
            MailMessage htmlMessage;
            SmtpClient mySmtpClient;
            string strAttachment = Dts.Variables["$Package::parAttachment"].Value.ToString();
            Array array = strAttachment.Split('|');
            System.Net.Mail.Attachment attachment;
            htmlMessage = new MailMessage(From, SendTo, Subject, Body);
            htmlMessage.IsBodyHtml = IsBodyHtml;
            foreach (var item in array)
            {
                // work with item here                
                string attachFile = item.ToString();
                attachment = new System.Net.Mail.Attachment(attachFile);
                htmlMessage.Attachments.Add(attachment);
            };
            mySmtpClient = new SmtpClient(Server);
            mySmtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
            mySmtpClient.Send(htmlMessage);
        }