在 SSIS 中我们可以通过 Send Mail Task 或者 Script Task 来发送邮件,当然还有第三种方式就是写存储过程调用发送邮件存储过程.
Send Mail Task 发送邮件
Send Mail Task 的使用其实非常的简单,配置的步骤也并不多,但是在使用它的时候有几个限制:
- 只能发送普通的文本格式的邮件,也就是说不支持 HTML 格式的邮件。
- 连接 SMTP Server 时不支持用户填写用户名和密码,也就是说用户要么在域环境下 SMTP Server 对用户进行 Windows 方式验证,要么就是访问的 SMTP Server 支持匿名访问,不需要提供用户名和密码。
- SMTP Server 的端口号使用默认的,也就是说如果在域中的 SMTP Server 端口号不是默认的话 Send Mail Task 就无法使用了。
这里是我常用的一个测试服务器地址 http://www.yopmail.com/en/ ,免费的并支持匿名访问,可以通过它来进行邮件发送的测试。关于 Send Mail Task 的使用方式就不在这里演示了,在非域和非 Windows 验证方式下用我提到的可匿名访问的 Yop Mail 一试便知,主要是讲 Script Task 发送邮件的方式。
Script Task 发送邮件
新建一个包并首先创建一个 SMTP 连接 - New Connection。
选择 SMTP 连接管理器。
以我的邮箱为例子 BIWORK@126.com 发送邮箱服务器是 smtp.126.com,这个可以在网易邮箱配置页面查到。但是非常遗憾!在这里仍然是没有地方可以配置用户名和密码的,默认的情况下仍然是只支持 Windows 验证或者匿名访问。
所以说,如果想要在 SMTP Connection 里自己动手配置用户名和密码是不可能的,那么像这种 163,126等等很多很多邮箱直接通过 SMTP Connection 是肯定无法完成发送邮件操作的。
看下图时一定要理解一点:几乎每一个 SSIS 控件的属性都是可配置的,也是可获取的,这是我们在 SSIS ETL 的学习过程中解决很多很多问题的最关键的地方!
新建一些常用的变量,发件人,收件人,抄送,邮件标题,内容,附件地址,还有用户名和密码等。
其中 PV_CONTENT 变量描述的是邮件发送的 HTML 格式的内容,注意是字符串类型的因此需要双引号。
"<h1>Hi BIWORK!</h1> <p> This is a test email from the test SSIS package of BIWORK! </p> <p>Server Name - "+ @[System::MachineName] +"</p> <p>Package Name - "+ @[System::PackageName] +"</p> <p>Package Start Time - "+ (DT_WSTR, 12) ( DT_DBDATE) @[System::StartTime] +"</p> <p></br>Thanks and Regards!</p> <p>Simon</p>"
系统变量的信息也通过表达式嵌入到邮件正文中。
编辑 Script Task 并引入这些变量,Script Task 中的代码 -
using System.Net.Mail; // BIWORK Added using System.Text.RegularExpressions; // BIWORK Added
Main 中的代码包括处理优先级,多个收件人的处理,用户名和密码,添加附件的方式等等。
public void Main() { // Default Priority and SMTP Server Port int iPriority = 1; int smtpPort = 25; //User::PV_ATTACHED_FILE,User::PV_CONTENT,User::PV_MAIL_FROM, //User::PV_MAIL_TO,User::PV_MAIL_TO_CC,User::PV_TITLE String mailFrom = Dts.Variables["User::PV_MAIL_FROM"].Value.ToString(); String mailTo = Dts.Variables["User::PV_MAIL_TO"].Value.ToString(); String mailToCC = Dts.Variables["User::PV_MAIL_TO_CC"].Value.ToString(); String mailTitle = Dts.Variables["User::PV_TITLE"].Value.ToString(); String mailContent = Dts.Variables["User::PV_CONTENT"].Value.ToString(); String mailAttachedFilePath = Dts.Variables["User::PV_ATTACHED_FILE"].Value.ToString(); // User Information String loginUser = Dts.Variables["User::PV_LOGIN_USER"].Value.ToString(); String loginPwd = Dts.Variables["User::PV_LOGIN_PWD"].Value.ToString(); // Get SMTP Server Information from Connection Manager String smtpServer = Dts.Connections["CM_SMTP_126"].Properties["SmtpServer"].GetValue(Dts.Connections["CM_SMTP_126"]).ToString(); try { SmtpClient smtpClient = new SmtpClient(); MailMessage message = new MailMessage(); MailAddress fromAddress = new MailAddress(mailFrom, "BIWORKTEST"); string[] sEmailTo = Regex.Split(mailTo, ";"); string[] sEmailToCC = Regex.Split(mailToCC, ";"); smtpClient.Host = smtpServer; smtpClient.Port = smtpPort; // Login information System.Net.NetworkCredential myCredentials = new System.Net.NetworkCredential(loginUser, loginPwd); smtpClient.Credentials = myCredentials; // Attachment System.Net.Mail.Attachment attachment; attachment = new System.Net.Mail.Attachment(mailAttachedFilePath); message.Attachments.Add(attachment); message.From = fromAddress; // Multiple email to address 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.To.Add(sEmailToCC[i]); } } } // Email priority switch (iPriority) { case 1: message.Priority = MailPriority.High; break; case 3: message.Priority = MailPriority.Low; break; default: message.Priority = MailPriority.Normal; break; } message.Subject = mailTitle; message.IsBodyHtml = true; message.Body = mailContent; smtpClient.Send(message); }catch (Exception ex) { Dts.TaskResult = (int)ScriptResults.Failure; } // Close Script Task with success Dts.TaskResult = (int)ScriptResults.Success; }
保存并执行 SSIS 包,执行成功!