SSIS包执行成功,但没有发送邮件(SSIS Package execution succeed b

2019-07-05 16:08发布

我已经装箱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;
            }
        }
    }
}

Answer 1:

手气不错,所以我会后没有所有的细节。

我的前N个原因它不工作

  1. SQL Server代理帐户不允许说话交流。 域\ SqlServiceAccount不是在Exchange用户,因此无法发送邮件。 域\ SagarDumbre Exchange用户,可以发送邮件这就是为什么它为你工作。

  2. 服务器未授权谈论到Exchange。 您的Exchange管理员有权授权的IP地址和即使运行SQL Server可以谈交易账户,地址192.168.1.101不允许交谈的邮件服务器的能力。 我们和Exchange升级/维护过程中通过了该位。 开启该功能,以防止垃圾邮件来自非授权地址和服务器发送的管理员并没有在名单上。

  3. 防火墙和/或病毒扫描程序。 既然你没有指定电子邮件的发送成功是否从您的计算机或有问题的服务器的工作,我也看到了这些产品阻止访问邮件服务器,因为该请求没有从展望未来。

  4. 糟糕的代码。 东西在你的邮件发送代码失败,或者从MTA称它无法处理您的请求收到错误消息和代码是不听或谁知道是什么。 火了一些信息事件,这样你就可以从脚本任务得到反馈。

谈谈您的Exchange管理员,看他们是否有在他们的日志中所发生的事情的细节。 他们可能想看着自己的接口封装火灾捕捉到相应的事件。



Answer 2:

在此基础上:

主席先生,我执行我的包服务器本身它工作得很好。 邮件被发送,但是当我配置包(.dtsx程序)在SQL Server的工作则仅发送邮件失败,所有剩余的三个步骤成功。

我不能在这个时候发表评论,因为StackOverflow上不允许我,所以不要把这个作为一个答案,这么多的基于上面你对此有何评论验证。 当您选择SSIS包来匹配你如何在服务器上运行您配置的值? 我遇到麻烦时,我从服务器到作业代理移动,如果我不将其配置完全一样的(特别是,当我使用一个配置文件或设置不同的连接字符串)。 请注意,这里的麻烦仍然会运行该程序包,并没有错误,但没有做它应该做的

前款之外,你的代码和步骤看起来很好,如果它是坏的,你的包将在服务器上进行突破; 这样省去了一些可能出现的问题。



Answer 3:

您的脚本是指为附件启动下的路径:\用户\管理员。 我怀疑用来运行SQL Server代理服务不具有访问该文件夹的帐户。

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

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

你也可以考虑使用SSIS发送邮件任务对于这一点 - 你会避免很多的代码。



文章来源: SSIS Package execution succeed but no mail sent