SSIS包执行成功但没有发送邮件

时间:2012-12-18 13:12:19

标签: sql-server ssis

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

控制流程: -

enter image description here

数据流: -

enter image description here

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

当我通过右键单击包执行它并说执行它运行良好(邮件发送)。但是,当我在Sql Server Agent作业中安排程序包运行时,它显示“程序包执行成功”,但没有发送邮件。虽然它能够将数据插入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;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:9)

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

我的前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的错误消息,说它无法处理您的请求,代码没有正在侦听或者谁知道什么。触发一些信息事件,以便您可以从脚本任务中获得反馈。

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

答案 1 :(得分:3)

基于此:

  

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

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

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

答案 2 :(得分:3)

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

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

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

您可能还考虑使用SSIS发送邮件任务 - 您将避免大量代码。