使用脚本任务发送 HTML 邮件消息
适用范围:SQL ServerAzure 数据工厂中的 SSIS Integration Runtime
Integration Services SendMail 任务仅支持纯文本格式的邮件消息。 但是,您可以使用脚本任务以及 .NET Framework 的邮件功能轻松发送 HTML 邮件消息。
注意
如果希望创建可更方便地重用于多个包的任务,请考虑以此脚本任务示例中的代码为基础,创建自定义任务。 有关详细信息,请参阅 开发自定义任务。
说明
以下示例使用 System.Net.Mail 命名空间配置和发送 HTML 邮件。 该脚本从包变量获取电子邮件的“To”、“From”、“Subject”和“正文”,使用它们创建新的 MailMessage,并将其 IsBodyHtml 属性设置为 True。 然后,该脚本从另一个包变量获取 SMTP 服务器名称,初始化 System.Net.Mail.SmtpClient 实例,并调用其 Send 方法发送 HTML 消息。 该示例将消息发送功能封装到一个可在其他脚本中重用的子例程中。
不使用 SMTP 连接管理器配置此脚本任务示例
创建名为
HtmlEmailTo
、HtmlEmailFrom
和HtmlEmailSubject
的字符串变量,并向它们分配相应的值,以用于有效的测试消息。创建一个名为
HtmlEmailBody
的字符串变量,并向其分配 HTML 标记字符串。 例如:<html><body><h1>Testing</h1><p>This is a <b>test</b> message.</p></body></html>
创建一个名为
HtmlEmailServer
的字符串变量,并向其分配一个可接收匿名传出消息的可用 SMTP 服务器的名称。将这五个变量全部分配到新脚本任务的 ReadOnlyVariables 属性。
将 System.Net 和 System.Net.Mail 命名空间导入代码。
本主题中的示例代码从包变量获取 SMTP 服务器名称。 当然,还可以利用 SMTP 连接管理器封装连接信息,并在代码中从连接管理器提取服务器名称。 SMTP 连接管理器的 AcquireConnection 方法以下列格式返回一个字符串:
SmtpServer=smtphost;UseWindowsAuthentication=False;EnableSsl=False;
可以使用 String.Split 方法将此参数列表从每个分号 (;) 或等号 (=) 处分为一个单独的字符串数组,然后提取该数组的第二个参数 (subscript 1) 作为服务器名称。
使用 SMTP 连接管理器配置此脚本任务示例
通过从 ReadOnlyVariables 列表删除
HtmlEmailServer
变量修改先前配置的脚本任务。将获取服务器名称的代码行:
Dim smtpServer As String = _ Dts.Variables("HtmlEmailServer").Value.ToString
替换为以下代码行:
Dim smtpConnectionString As String = _ DirectCast(Dts.Connections("SMTP Connection Manager").AcquireConnection(Dts.Transaction), String) Dim smtpServer As String = _ smtpConnectionString.Split(New Char() {"="c, ";"c})(1)
代码
Public Sub Main()
Dim htmlMessageFrom As String = _
Dts.Variables("HtmlEmailFrom").Value.ToString
Dim htmlMessageTo As String = _
Dts.Variables("HtmlEmailTo").Value.ToString
Dim htmlMessageSubject As String = _
Dts.Variables("HtmlEmailSubject").Value.ToString
Dim htmlMessageBody As String = _
Dts.Variables("HtmlEmailBody").Value.ToString
Dim smtpServer As String = _
Dts.Variables("HtmlEmailServer").Value.ToString
SendMailMessage( _
htmlMessageFrom, htmlMessageTo, _
htmlMessageSubject, htmlMessageBody, _
True, smtpServer)
Dts.TaskResult = ScriptResults.Success
End Sub
Private Sub SendMailMessage( _
ByVal From As String, ByVal SendTo As String, _
ByVal Subject As String, ByVal Body As String, _
ByVal IsBodyHtml As Boolean, ByVal Server As String)
Dim htmlMessage As MailMessage
Dim mySmtpClient As SmtpClient
htmlMessage = New MailMessage( _
From, SendTo, Subject, Body)
htmlMessage.IsBodyHtml = IsBodyHtml
mySmtpClient = New SmtpClient(Server)
mySmtpClient.Credentials = CredentialCache.DefaultNetworkCredentials
mySmtpClient.Send(htmlMessage)
End Sub
public void Main()
{
string htmlMessageFrom = Dts.Variables["HtmlEmailFrom"].Value.ToString();
string htmlMessageTo = Dts.Variables["HtmlEmailTo"].Value.ToString();
string htmlMessageSubject = Dts.Variables["HtmlEmailSubject"].Value.ToString();
string htmlMessageBody = Dts.Variables["HtmlEmailBody"].Value.ToString();
string smtpServer = Dts.Variables["HtmlEmailServer"].Value.ToString();
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;
htmlMessage = new MailMessage(From, SendTo, Subject, Body);
htmlMessage.IsBodyHtml = IsBodyHtml;
mySmtpClient = new SmtpClient(Server);
mySmtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
mySmtpClient.Send(htmlMessage);
}