天天看点

运用ssis组件实现邮件发送,内容来源于数据库表

ETL的job邮件是ETL过程的重要组成部分,它能让用户知道当前的数据是否可用,job失败时也可以帮助程序员快速的的定位问题。发送邮件的方式有很多,下面是介绍使用SSIS组件实现邮件的发送,发送的内容来源于数据库表的内容,这么做的好处时可以自定义发送的内容。下面是详细步骤:

准备工作:先在数据库里面创建一个测试的错误日志表,并插入测试数据。

CREATE TABLE SSIS_LOG (
id int identity(1,1),
ErrorType nvarchar(50),
ErrorComments nvarchar(500)
)

insert into SSIS_LOG
select '程序报错','字符串长度不够'
UNION ALL
SELECT '数据质量问题','完整的月份应该在1~12之间'
           

1、新建一个SSIS包,创建数据库连接管理器和变量。

运用ssis组件实现邮件发送,内容来源于数据库表

CountNum:错误的个数;ResultList:邮件需要发送的内容

2、新建两个执行sql任务,一个接收错误的个数,一个接收错误的详细信息。

运用ssis组件实现邮件发送,内容来源于数据库表

接收错误的行数:

运用ssis组件实现邮件发送,内容来源于数据库表
运用ssis组件实现邮件发送,内容来源于数据库表

错误的详细结果:

运用ssis组件实现邮件发送,内容来源于数据库表
运用ssis组件实现邮件发送,内容来源于数据库表

3、添加一个脚本任务,并传入参数,如图所示:

运用ssis组件实现邮件发送,内容来源于数据库表

在ReadOnlyVariables里面选择你需要传入的参数:

运用ssis组件实现邮件发送,内容来源于数据库表

我传入的参数除了自定义的参数之外,还添加一个系统的参数:PackageName。

选择完确定之后,编辑脚本:

运用ssis组件实现邮件发送,内容来源于数据库表

4、编辑脚本的任务:

加载类:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Net.Mail;
using System.Text;
using System.Text.RegularExpressions;
using System.Data.OleDb;
           

主方法:

public void Main()
		{
            // TODO: Add your code here
            //用mailTo来接收需要邮件需要发给的人
            string mailTo = Dts.Variables["MailTo"].Value.ToString();
            //mailToCC接收邮件抄送的人
            string mailToCC = Dts.Variables["MailCc"].Value.ToString();
            //CountNum:错误个数
            string ErrorNum = Dts.Variables["CountNum"].Value.ToString();
            //PackageName:包名
            string PackageName = Dts.Variables["PackageName"].Value.ToString();
            string error = string.Empty;
            OleDbDataAdapter dbDataAdapter = new OleDbDataAdapter();
            DataTable table = new DataTable();

            dbDataAdapter.Fill(table, Dts.Variables["ResultList"].Value);

            string test = string.Empty;

            string tb = string.Format("<p style='font-size:15px;'>亲爱的维护人员,</p>" +
                "<p style='font-size:15px;'>此次程序运行,错误的个数:{0}条;</p>" , ErrorNum);
            tb += "<p>下面是错误的详细信息:</p>" +
               "<table style='border: 1px solid #0094ff;width: 1200px; line-height: 25px;>" +
               "<tr style = 'border: 1px solid #cad9ea;text-align: center;font-size:15px;background:LightSteelBlue;'>" +
               "<th style = 'border: 1px solid #cad9ea;'>SSIS包</th>" +
               "<th style = 'border: 1px solid #cad9ea;'>ID</th>" +
               "<th style = 'border: 1px solid #cad9ea;'>错误类型</th>" +
               "<th style = 'border: 1px solid #cad9ea;'>错误详细信息</th>" +
               "</tr>";
            foreach (DataRow item in table.Rows)
            {
                tb += "<tr style = 'border: 1px solid #cad9ea;text-align:left;font-size:12px;'>";
                tb += "<th style = 'border: 1px solid #cad9ea;text-align:left;'>" + PackageName + "</td>";
                tb += "<th style = 'border: 1px solid #cad9ea;text-align:left;'>" + item[0].ToString() + "</td>";
                tb += "<th style = 'border: 1px solid #cad9ea;text-align:left;'>" + item[1].ToString() + "</td>";
                tb += "<th style = 'border: 1px solid #cad9ea;text-align:left;'>" + item[2].ToString() + "</td>";
                tb += "</tr>";
            }
            tb += "</table>";
            string subject = "SSIS包运行日志" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            string bodyInfo = tb;

           var status= SendEmail(mailTo, subject, bodyInfo, mailToCC);

            if (status == 1)
            {
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            else
                Dts.TaskResult = (int)ScriptResults.Failure;
        

        // Close Script Task with success 

    }
           

备注:用表格可以定义长度,样式

邮件方法:

public int SendEmail(string mailTo, string mailSubject, string mailContent, string mailToCC)
        {
          
            string smtpServer = Dts.Variables["MailHost"].Value.ToString(); //SMTP
            string mailFrom = Dts.Variables["MailFrom"].Value.ToString(); 
            string userPassword = Dts.Variables["MailPwd"].Value.ToString(); 
            
            SmtpClient smtpClient = new SmtpClient();
            //smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.Host = smtpServer;

           // smtpClient.Credentials = new System.Net.NetworkCredential(mailFrom, userPassword);
            smtpClient.EnableSsl = false;

            MailMessage message = new MailMessage(); 
            message.Subject = mailSubject;
            message.Body = mailContent;
            message.BodyEncoding = Encoding.UTF8;
            message.IsBodyHtml = true;
            message.Priority = MailPriority.Low;
            MailAddress fromAddress = new MailAddress(mailFrom, "SSIS错误日志Email");
            message.From = fromAddress;

            string[] sEmailTo = Regex.Split(mailTo, ";");
            string[] sEmailToCC = Regex.Split(mailToCC, ";");

            try
            {
                if (sEmailTo != null)
                {
                    for (int i = 0; i < sEmailTo.Length; ++i)
                    {
                        if (sEmailTo[i] != null && sEmailTo[i] != "")
                        {
                            message.To.Add(sEmailTo[i]);
                        }
                    }
                }

                // Multiple cc address
                if (sEmailToCC != null)
                {
                    for (int i = 0; i < sEmailToCC.Length; ++i)
                    {
                        if (sEmailToCC[i] != null && sEmailToCC[i] != "")
                        {
                            message.CC.Add(sEmailToCC[i]);
                        }
                    }
                }
                smtpClient.Send(message);
                return 1;
            }
            catch (Exception ex)
            {
                throw ex;
            }
           
        }
           

保存→关闭→确定。

5、运行这个SSIS包,测试通过,完成。

SSIS包运行截图:

运用ssis组件实现邮件发送,内容来源于数据库表

邮件结果截图:

运用ssis组件实现邮件发送,内容来源于数据库表

至此,一个简单的ssis错误日志邮件成功完成。

热爱技术,靠技术吃饭。

继续阅读