如何在 SSIS 包中添加条件以仅在附件可用时发送邮件

How to add condition in SSIS package to send mails only if attachments are available

提问人:Saurabh Kulkarni 提问时间:11/2/2021 最后编辑:Nick.McSaurabh Kulkarni 更新时间:11/10/2021 访问量:955

问:

我创建了一个 SSIS 包,其中包含一个脚本任务,用于在变量“|”后面添加新的附件名称和路径,并在 foreach 循环下运行它以在变量值中包含所有附件名称和路径。然后,我将该变量作为附件传递给发送邮件任务。此包通过批处理文件执行运行良好,并发送一封包含多个文件的电子邮件。

现在,我想将该批处理文件安排为每小时运行一次,为此,我需要在包中添加逻辑,以便在有 2 个附件可用时才发送邮件。如果没有附件或只有一个附件,则不应发送任何电子邮件。这样我想删除手动作业执行。你能帮忙吗?我是 SSIS 开发的新手。脚本任务代码如下:

if (Dts.Variables["User::FileNamesList"].Value.ToString() == "")
            {
                Dts.Variables["User::FileNamesList"].Value = Dts.Variables["User::InputPath"].Value.ToString() + Dts.Variables["User::Year"].Value.ToString() +"\\" + Dts.Variables["User::FileName"].Value.ToString();
            }
            else
            { 
                Dts.Variables["User::FileNamesList"].Value = Dts.Variables["User::FileNamesList"].Value.ToString() + "|" + Dts.Variables["User::InputPath"].Value.ToString() + Dts.Variables["User::Year"].Value.ToString() + "\\" + Dts.Variables["User::FileName"].Value.ToString();
            }

Image of the package

SSIS系列

评论


答:

1赞 KeithL 11/2/2021 #1

任何涉及邮件的事情都可以在脚本任务中更好地处理。

让我解释一下“更好”。您可以对收件人、抄送、密件抄送、回复等进行更多控制。以及能够发送 html 格式的正文。

这应该运行整个应用程序:

    {
        var fis = Directory.GetFiles(@"C:\folder"); //a 2nd param can be added for search pattern (ex. "*.xls")
        //Check for number of files
        if(fis.Length>1)
        {
            SendEmail("Where's it going", "Here are some files", "What you want in the body", fis);
            //Archive
            foreach (var f in fis)
                File.Move(f, @"archive folder path" + new FileInfo(f).Name);
        }

    }

    public static void SendEmail(string to, string subject, string body, string[] filePaths)
    {
        string from = "[email protected]";
        
        using (MailMessage mail = new MailMessage())
        {
            SmtpClient SmtpServer = new SmtpClient("YourSMTPClient");

            mail.From = new MailAddress(from);

            mail.To.Add(new MailAddress(to));

            mail.Subject = subject;

            mail.IsBodyHtml = true;
            mail.Body = body;

            foreach (var f in filePaths)
            {
                Attachment file;
                file = new Attachment(f);
                mail.Attachments.Add(file);
            }

            SmtpServer.Port = 9999; //Your SMTP port
            SmtpServer.Credentials = new NetworkCredential(from, pword);

            SmtpServer.EnableSsl = true;

            SmtpServer.Send(mail);
        }
    }

评论

0赞 Saurabh Kulkarni 11/10/2021
嗨,KeithL,谢谢你的笔记。但是我能够在脚本任务中添加变量来计算文件数(基本上,每次循环执行都会增加 1),然后我在连接到邮件发送任务的箭头中添加了一个简单的条件,以首先检查变量值是否与预期值匹配(在 SSIS 中创建了一个变量并分配了最大预期文件计数), 所以它现在只会在文件夹中有 2 个文件可用时发送邮件。我添加了一个块只是为了重置变量,并且还附加了来自foreach循环的第二个箭头,如果条件不匹配,则运行。
0赞 Saurabh Kulkarni 11/10/2021
请看下面的回答。
0赞 Saurabh Kulkarni 11/10/2021 #2

这在同一天得到了解决。我能够在我的脚本任务中添加变量来计算文件数(基本上,每次循环执行都会增加 1),然后我在连接到邮件发送任务的箭头中添加了一个简单的条件,以首先检查变量值是否与预期值匹配(在 SSIS 中创建了一个变量并分配了最大预期文件计数), 所以它现在只会在文件夹中有 2 个文件可用时发送邮件。我添加了一个块只是为了重置变量,并且还附加了来自foreach循环的第二个箭头,如果条件不匹配,则运行。该工具现在仅发送年份的邮件,该邮件将同时存在或跳过该循环。我也能够安排它。

箭头条件 true:在发送邮件任务之前:enter image description here

箭头中的条件,脚本任务要重新发送变量 2:enter image description here

计数器:enter image description here

enter image description here