我已经设法使用带有VB.NET代码的脚本任务从我的SSIS包发送电子邮件。我不擅长编写脚本,我基本上在网上看了各种脚本,让我到达我的位置。我遇到的问题是我在BIDS中的SSIS包中设置了所有变量,并在包中将它们设置为 ReadOnly 。
如果我为 Attachment 包变量指定了值,那么一切正常,但如果我没有,那么我的脚本就会失败。当我用脚本发送电子邮件时,我并不总是想发送附件。我希望修改代码,以便如果在BIDS的SSIS包中没有为我的 Attachement 变量指定值,那么我的脚本任务只会在正文中发送消息而不会失败。 / p>
如果可能的话,发送附件时也希望能够发送多个附件。我也意识到,现在我已经设置了我的脚本,因为我似乎不再需要SSIS中的 SendMail Task
,所有内容都可以从脚本和我在SSIS中设置的变量中完成。
我是否应该能够将 Script Task
连接到 Send Mail Task
以使它们协同工作?
这是我的脚本任务代码:
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Net.Mail
Imports System.Net
<System.AddIn.AddIn("ScriptMain", Version:="1.0", Publisher:="", Description:="")> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
Enum ScriptResults
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
End Enum
Public Sub Main()
MsgBox(Dts.Variables("Username").Value.ToString)
Dim myHtmlMessage As MailMessage
Dim mySmtpClient As SmtpClient
Dim mailAuthentication As System.Net.NetworkCredential
mailAuthentication = New System.Net.NetworkCredential( _
Dts.Variables("Username").Value.ToString(), _
Dts.Variables("Password").Value.ToString())
myHtmlMessage = New MailMessage( _
Dts.Variables("From").Value.ToString(), _
Dts.Variables("To").Value.ToString(), _
Dts.Variables("Subject").Value.ToString(), _
Dts.Variables("Body").Value.ToString())
myHtmlMessage.Attachments.Add(New Attachment(Dts.Variables("Attachments").Value.ToString))
mySmtpClient = New SmtpClient(Dts.Variables("SMTPServer").Value.ToString(), Dts.Variables("Port").Value.ToString())
mySmtpClient.UseDefaultCredentials = False
mySmtpClient.Credentials = mailAuthentication
mySmtpClient.EnableSsl = True
mySmtpClient.Send(myHtmlMessage)
Dts.TaskResult = ScriptResults.Success
End Sub
End Class
答案 0 :(得分:1)
更改脚本中的以下行,使用函数 Attachments
检查变量 String.IsNullOrEmpty
中的值是否为空
在内部使用包变量时,最好在变量范围前添加 User::
或 System::
Script Task
。
要再添加一个条件,您可以使用函数 System.IO.File.Exists
检查文件是否确实存在于指定路径中,然后再将其添加到邮件附件中。
myHtmlMessage.Attachments.Add(New Attachment(Dts.Variables("Attachments").Value.ToString))
Dim attachment As String = Dts.Variables("User::Attachments").Value.ToString()
If Not String.IsNullOrEmpty(attachment) Then
If System.IO.File.Exists(attachment) Then
myHtmlMessage.Attachments.Add(New Attachment(attachment))
End If
End If
答案 1 :(得分:1)
“我不应该将脚本任务连接到发送邮件任务以使它们一起工作吗?”
您可以使用Expressions(第三个标签)使Send Email Task
动态。表达式允许您根据值在SSIS包中执行任何操作。如您所见,您需要修改的大多数属性都显示在下拉列表中。