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包,创建数据库连接管理器和变量。

CountNum:错误的个数;ResultList:邮件需要发送的内容
2、新建两个执行sql任务,一个接收错误的个数,一个接收错误的详细信息。
接收错误的行数:
错误的详细结果:
3、添加一个脚本任务,并传入参数,如图所示:
在ReadOnlyVariables里面选择你需要传入的参数:
我传入的参数除了自定义的参数之外,还添加一个系统的参数:PackageName。
选择完确定之后,编辑脚本:
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错误日志邮件成功完成。
热爱技术,靠技术吃饭。