【问题标题】:SSIS package when executed through job executes successfully but it does not send email通过作业执行时的SSIS包成功执行但不发送电子邮件
【发布时间】:2021-11-23 20:20:45
【问题描述】:

我有一个 SSIS 包,它有一个发送电子邮件的脚本任务。从 Visual Studio 本地执行包时,电子邮件已成功发送。但是,当我通过 SSIS 目录部署包、创建并执行作业时,作业成功运行但我没有收到任何邮件。 此外,从集成服务目录下执行包时,它执行没有任何问题,仍然没有发送电子邮件。 我创建了一个使用凭据的代理帐户,我猜这些步骤中的某处可能存在缺少链接或设置错误。 有谁知道应该如何设置代理帐户主体?或者可能与此有关? 我已经尝试过这些:

我创建了一个 c# 控制台应用程序,仅用于电子邮件发送部分,当在同一台服务器上执行该应用程序时,它可以毫无问题地发送电子邮件。


我的问题的其他信息:

  • 所以最初我也遇到了任务版本问题 (SSIS: script task (vs15) not work when deploy on sql server 2014),但是在使用正确的 ISDeploymentWizard.exe 重新部署它之后,这个问题就解决了。
  • 我也在使用Office365,但是2FA被关闭了,并且在从Visual Studio执行脚本任务时发送电子邮件没有任何问题(所以当包执行失败时,它正确地转到事件处理程序,执行脚本任务,并且邮件已发送)。
  • 我已配置代理帐户来执行 SSIS 包,它适用于其他包/步骤。
  • 我在脚本任务后面有以下脚本:
String SendMailFrom = Dts.Variables["$Project::Sender"].Value.ToString();
String SendMailFromPassword = Dts.Variables["$Project::SenderPassword"].GetSensitiveValue().ToString();
String SendMailTo = Dts.Variables["$Project::ToMail"].Value.ToString();
String SMTPServerName = Dts.Variables["$Project::SMTPServerName"].Value.ToString();
int SMTPServerPort = int.Parse(Dts.Variables["$Project::Port"].Value.ToString());
String PackageName = Dts.Variables["System::PackageName"].Value.ToString();
String ErrorDescription = Dts.Variables["System::ErrorDescription"].Value.ToString();
String ErrorCode = Dts.Variables["System::ErrorCode"].Value.ToString();
String SourceName = Dts.Variables["System::SourceName"].Value.ToString();

String Subject = PackageName + " Package Failed On " + DateTime.Now.ToString();
String Message = PackageName + " Package Failed On " + DateTime.Now.ToString();

try

    MailMessage email = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient(SMTPServerName);
    // START
    email.From = new MailAddress(SendMailFrom);
    email.To.Add(SendMailTo);
    email.Subject = Subject;
    email.Body = Message;
    //END

    SmtpServer.Port = SMTPServerPort;
    SmtpServer.UseDefaultCredentials = false;
    SmtpServer.Credentials = new System.Net.NetworkCredential(SendMailFrom, SendMailFromPassword);
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(email);
}
catch (Exception ex)
{
}

Dts.TaskResult = (int)ScriptResults.Success; 

【问题讨论】:

  • 请出示您的脚本任务代码minimal reproducible example
  • this。另外,数据库邮件设置是否正确。另请参阅this post
  • 感谢您的反馈,我已在说明中添加了其他信息
  • 你正在用那个空的catch 吞下所有异常——要么重新抛出异常,要么将它们记录为 SSIS 进程错误,或者完全删除 try-catch。您需要找出到底出了什么问题,而空的 catch 目前将其隐藏起来。

标签: sql-server ssis ssms jobs


【解决方案1】:

我为此写了an article

如果您使用的是 Gmail、Outlook365 或任何其他需要 2FA 的 SMTP 服务器,那么您必须关闭该电子邮件地址的 2FA。

在同一篇文章的底部,您可以找到可用于设置新电子邮件地址的查询。

编辑:

然后使用您成功创建的 SQL Server 帐户使用 SSIS 发送电子邮件:

https://www.sqlshack.com/ssis-execute-t-sql-statement-task-vs-execute-sql-task/

EXEC msdb.dbo.sp_send_dbmail
     @profile_name = 'Your_Profile_Name',
     @recipients = 'Use a valid e-mail address',
     @body = 'The database mail configuration was completed successfully.',
     @subject = 'Automated Success Message';
GO

编辑 2:

显然有多种方法可以在 T-SQL 语句任务中添加变量:

【讨论】:

  • 感谢您的反馈,我已在说明中添加了其他信息
  • 您是否尝试过使用查询手动创建电子邮件然后测试电子邮件?下一步是测试 SSIS 包,但首先您必须测试 SQL Server 是否真的可以从该电子邮件帐户发送电子邮件
  • 我已经用同一个账号配置了数据库邮件,可以发邮件了。
  • 好吧,现在如果电子邮件帐户在 SQL Server 上工作正常,则无需使用 SSIS 输入新的电子邮件帐户。只需触发您已经设置和工作的那个
  • 你能举个例子吗?还需要使用脚本任务吗?
【解决方案2】:

感谢 Francesco,最后我选择了配置了数据库邮件的参数化“执行 SQL 任务”方法,并使用了建议的脚本:

EXEC msdb.dbo.sp_send_dbmail
     @profile_name = 'Your_Profile_Name',
     @recipients = 'Use a valid e-mail address',
     @body = 'The database mail configuration was completed successfully.',
     @subject = 'Automated Success Message';
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2020-09-21
    • 2018-09-06
    • 2019-07-14
    • 2012-03-11
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多