sql-server - 通过作业执行时的SSIS包成功执行但不发送电子邮件
问题描述
我有一个 SSIS 包,它有一个发送电子邮件的脚本任务。从 Visual Studio 本地执行包时,电子邮件已成功发送。但是,当我通过 SSIS 目录部署包,创建并执行作业时,作业成功运行,但我没有收到任何邮件。此外,从集成服务目录下执行包时,它执行没有任何问题,仍然没有发送电子邮件。我创建了一个使用凭据的代理帐户,我猜这些步骤中的某处可能缺少链接或设置错误。有谁知道应该如何设置代理帐户主体?或者可能与此有关?我已经尝试过这些:
我创建了 ac# Console 应用程序,仅用于电子邮件发送部分,当在同一台服务器上执行该应用程序时,它会毫无问题地发送电子邮件。
我的问题的附加信息:
- 所以最初我也遇到了任务版本问题(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;
解决方案
感谢 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
推荐阅读
- wpf - 应用程序找不到图像资源,使用 CommonControls
- git - Git 无法检出已删除的文件,返回 pathspec 错误
- java - 如何在 MQManager 中创建通道?
- react-native - TypeError:Font.isLoaded 不是函数。@expo/矢量图标
- node.js - 在 NodeJS 中获取非提示输入
- json - 如何从我的 AWS lambda 函数访问一些 JSON 文档?
- c# - 基于另一个属性的值条件的属性值
- visual-studio - 如何在 Visual Studio 2019 中调试经典 ASP 页面?
- opengl - 如何在 Qt 中诊断“无法打开文件”的原因
- javascript - 减少、展平和变换嵌套数组