【问题标题】:SSIS Package execution succeed but no mail sentSSIS 包执行成功但未发送邮件
【发布时间】:2012-12-18 13:12:18
【问题描述】:

我已经创建了 SSIS 项目,它执行以下操作

控制流程:-

数据流:-

  • 先删除excel表格中的数据
  • 新建 Excel 工作表
  • 将数据从数据库插入到 Excel 文件中
  • 发送该excel文件的邮件

当我通过右键单击包执行它并说执行它运行良好(已发送邮件)。但是当我在 Sql Server 代理作业中安排包运行时,它显示“包执行成功”但没有发送邮件。虽然它能够将数据插入到 Excel 工作表中。

那为什么 SQL Server 代理作业没有发送邮件?

SQL 作业在 SQL 服务帐户中运行,因此我为 SQL Server 作业代理用户授予了对我的 excel 文件的“完全访问”权限。

没有错误[有警告] 根据 SQL 代理作业但没有发送邮件

The package execution returned DTSER_SUCCESS (0) but had warnings, with warnings being treated as errors.  Started:  4:16:51 PM  Finished: 4:17:04 PM  Elapsed:  13.119 seconds.  The command line parameters are invalid.  The step failed.

电子邮件脚本代码:-

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Net.Mail;
using System.Text.RegularExpressions;

namespace ST_cb3e2bf527bb45c58359315bb058656e.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion    

        public void Main()
        {
            string sSubject = "Monitum : ICICI Cash Balance : "+DateTime.Now.ToShortDateString()+" : "+DateTime.Now.ToShortTimeString();
            string sBody = "";
            int iPriority = 2;

            if (SendMail(sSubject, sBody, iPriority))
            {
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            else
            {
                //Fails the Task
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }

        public bool SendMail(string sSubject, string sMessage, int iPriority)
        {
            try
            {
                string sEmailServer = Dts.Variables["User::sEmailServer"].Value.ToString();                
                string sEmailPort = Dts.Variables["User::sEmailPort"].Value.ToString();                
                string sEmailUser = Dts.Variables["User::sEmailUser"].Value.ToString();                
                string sEmailPassword = Dts.Variables["User::sEmailPassword"].Value.ToString();                
                string sEmailSendTo = Dts.Variables["User::sEmailSendTo"].Value.ToString();                
                string sEmailSendFrom = Dts.Variables["User::sEmailSendFrom"].Value.ToString();                
                string sEmailSendFromName = Dts.Variables["User::sEmailSendFromName"].Value.ToString();                

                SmtpClient smtpClient = new SmtpClient();
                MailMessage message = new MailMessage();
                Attachment attach = new Attachment("C:\\Users\\Administrator\\Documents\\ICICI Cash Balance.xls");
                attach.Name = "ICICI_Cash_Balance_"+DateTime.Now.ToLongDateString()+"_"+DateTime.Now.ToLongTimeString()+".xls";
                message.Attachments.Add(attach);
                MailAddress fromAddress = new MailAddress(sEmailSendFrom, sEmailSendFromName);
                message.Bcc.Add("sagar.dumbre@agsindia.com");
                //You can have multiple emails separated by ;
                string[] sEmailTo = Regex.Split(sEmailSendTo, ";");
                //string[] sEmailCC = Regex.Split(sEmailSendCC, ";");
                int sEmailServerSMTP = int.Parse(sEmailPort);

                smtpClient.Host = sEmailServer;
                smtpClient.Port = sEmailServerSMTP;

                System.Net.NetworkCredential myCredentials =
                   new System.Net.NetworkCredential(sEmailUser, sEmailPassword);
                smtpClient.Credentials = myCredentials;

                message.From = fromAddress;

                if (sEmailTo != null)
                {
                    for (int i = 0; i < sEmailTo.Length; ++i)
                    {
                        if (sEmailTo[i] != null && sEmailTo[i] != "")
                        {
                            message.To.Add(sEmailTo[i]);
                        }
                    }
                }
                switch (iPriority)
                {
                    case 1:
                        message.Priority = MailPriority.High;
                        break;
                    case 3:
                        message.Priority = MailPriority.Low;
                        break;
                    default:
                        message.Priority = MailPriority.Normal;
                        break;
                }

                message.Subject = sSubject;
                message.IsBodyHtml = true;
                message.Body = sMessage;

                smtpClient.Send(message);
                return true;
            }
            catch (Exception ex)
            {
                Dts.Events.FireError(0, "Script Task Example", ex.Message + "\r" + ex.StackTrace, String.Empty, 0);
                return false;
            }
        }
    }
}

【问题讨论】:

  • 什么是发送邮件?脚本任务?如果是这样,请发布代码。
  • 我认为您必须添加一个自定义处理程序来捕获电子邮件错误。请参阅msdn.microsoft.com/en-us/library/… 底部的示例,了解 MS 如何建议捕获 smtpClient 错误。此外,在脚本任务错误捕获中使用 Log Provider 和 Dts.Events.FireError 方法。在代理中自动化工作后,messagebox.show 不会留下太多研究。
  • 脚本任务中“日志提供程序和 Dts.Events.FireError 方法”的插入位置?
  • @brian 我已经修改了我的 Catch 块,但没有发现任何错误。不过在哪里检查呢?

标签: sql-server ssis


【解决方案1】:

我很幸运,所以我会在没有所有细节的情况下发布。

我的前 N ​​个原因它不起作用

  1. 不允许 SQL Server 代理 帐户 与 Exchange 对话。 Domain\SqlServiceAccount 不是 Exchange 中的用户,因此无法发送邮件。 Domain\SagarDumbre Exchange 中的用户,可以发送邮件,这就是它适合您的原因。

  2. 服务器 无权与 Exchange 通信。您的 Exchange 管理员可以授权 IP 地址,即使运行 SQL Server 的帐户可以与 Exchange 通信,地址 192.168.1.101 也不允许与邮件服务器通信。我们在 Exchange 升级/维护期间对此有所了解。管理员开启了该功能,以防止从非授权地址和服务器不在列表中发送垃圾邮件。

  3. 防火墙和/或病毒扫描程序。由于您没有指定是否可以从您的计算机或相关服务器成功发送电子邮件,因此我还看到这些产品阻止了对邮件服务器的访问,因为请求不是来自 Outlook。

    李>
  4. 错误代码。您的邮件发送代码中的某些内容失败,或者它从 MTA 接收到一条错误消息,说它无法处理您的请求并且代码没有在监听或谁知道是什么。触发一些信息事件,以便您从脚本任务中获得反馈。

与您的 Exchange 管理员交谈,看看他们的日志中是否有详细信息。他们可能希望在包触发时观察他们的界面以捕获适当的事件。

【讨论】:

  • 先生,我在服务器本身上执行了我的包,它运行良好。正在发送邮件,但是当我在 sql server 作业中配置包(.dtsx)时,只有邮件发送失败,其余三个步骤全部成功。
  • 杀毒软件时常给我们带来麻烦。
【解决方案2】:

基于此:

先生,我在服务器本身上执行了我的包,它运行良好。邮件是 正在发送,但是当我在 sql server 作业中配置包(.dtsx)时 只有邮件发送失败,其余三步都成功。

我目前无法发表评论,因为 StackOverflow 不允许我这样做,所以不要将此作为答案,而是根据您上面的评论进行验证。当您选择 SSIS 包以匹配您在服务器上的运行方式时,您是否配置了这些值?如果我没有完全按原样配置它(特别是当我使用配置文件或以不同方式设置连接字符串时),我从服务器移动到作业代理时会遇到麻烦。请注意,这里的问题仍然会运行包而没有错误,但不会做它应该做的事情

在上述段落之外,您的代码和步骤看起来不错,如果不好,您的包将在服务器本身上中断;这样就消除了一些可能的问题。

【讨论】:

  • 你的语句点击了我一件事..我们还必须在 SQL Job 中设置变量吗?因为我已经在 SSIS 包中配置了它。
  • 您不应该这样做,但话又说回来,这取决于 IS 和 SQLServer 的设置方式。您的环境可能与其他环境不同。完成工作时,请查看这些选项卡并进行试验:常规、配置、命令文件、数据源、执行选项、日志记录、设置值、验证、命令行。例如,有时尝试通过服务器与文件系统运行包会完全改变我需要选择的执行选项。如果包在服务器本身上运行良好,则断开连接似乎不在代码中。
  • 我在代码中硬编码了所有变量,但仍然没有发送邮件。我的问题是即使未发送邮件,包裹也会返回成功,因此不会产生错误,我无法调试它
【解决方案3】:

您的脚本引用了以 C:\Users\Administrator 开头的附件路径。我怀疑用于运行 SQL Server 代理服务的帐户无权访问该文件夹。

您可以通过将这些文件移动到非用户目录并确保用于运行 SQL Server 代理服务的帐户有权访问该目录来解决此问题。

您还应确保允许用于运行 SQL Server 代理服务的帐户使用您的 SMTP 服务。

您也可以考虑为此使用 SSIS 发送邮件任务 - 您将避免大量代码。

【讨论】:

  • 1.我的 SQL Server Agnet 作业在管理员帐户中运行,因此它可以访问 excel 文件。 2.我也尝试过发送邮件任务..同样的问题在代理作业中运行时无法发送邮件
  • 如果我能够使用 DTEXECUI 手动执行 SSIS 包,那么为什么不使用代理作业呢?两个帐户都在管理员帐户上运行
  • 使用运行 SQL Server 服务的服务帐户登录 SQL Server 服务器。在命令提示符下使用dtexec 命令来执行你的包。使用/REPORT V 开关启用详细输出。观看防病毒软件(如果已安装)。这可能会给你一些额外的见解。
  • 我已更改 SSIS 包的设置。现在发生警告时它将失败。我收到警告为“命令行参数无效”。步骤失败。检查问题编辑
猜你喜欢
  • 2021-11-23
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多