Выполнение пакета SSIS успешно, но не отправлено письмо

У меня есть проект SSIS, который делает следующее:

Поток управления: -

enter image description here

Поток данных: -

enter image description here

  • Сначала он удаляет данные на листе excel.
  • Создать новый лист excel
  • вставить данные из базы данных в файл excel
  • Отправить письмо этого файла excel

Когда я выполняю его, щелкнув правой кнопкой мыши на пакете и скажем, что он работает хорошо (почта отправлена). Но когда я планирую пакет в задаче агента сервера Sql для запуска, он показывает мне "Выполнение пакета успешно", но почта не отправляется. хотя он способен вставлять данные в лист excel.

Затем почему Mail не отправляется заданием агента SQL Server?

Задание SQL выполняется в учетной записи SQL Service, поэтому я дал разрешение "Полный доступ" к моему файлу excel для пользователя агента SQL Server Job.

Нет ошибки [с предупреждениями] В соответствии с заданием 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.

Email Script Код: -

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("[email protected]");
                //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;
            }
        }
    }
}

Ответ 1

Мне повезло, поэтому я опубликую без всяких подробностей.

Мои главные причины N, которые он не работает

  • Агентам SQL Server не разрешено разговаривать с Exchange. Domain\SqlServiceAccount не является пользователем Exchange и поэтому не может отправлять почту. Domain\SagarDumbre является пользователем в Exchange и может отправлять почту, поэтому он работает для вас.

  • сервер не имеет права разговаривать с Exchange. Администратор Exchange имеет возможность авторизации IP-адресов, и хотя учетная запись, которая запускает SQL Server, может разговаривать с Exchange, адрес 192.168.1.101 не разрешается разговаривать с почтовым сервером. Мы получили это во время обновления и обслуживания Exchange. Администраторы включили эту функцию, чтобы предотвратить отправку спама с несанкционированных адресов, а серверы не были в списке.

  • Брандмауэр и/или антивирус. Поскольку вы не указали, работает ли успешная отправка электронной почты с вашего компьютера или сервера, я также видел, что эти продукты блокируют доступ к почтовому серверу, поскольку запросы не поступали из Outlook.

  • Плохой код. Что-то в вашем почтовом отправлении сбой происходит или он получает сообщение об ошибке от MTA, говоря, что не может обработать ваш запрос, а код не прослушивает или кто знает что. Выключите некоторые информационные события, чтобы получить обратную связь от задачи Script.

Поговорите с администратором Exchange и посмотрите, есть ли у них детали в своем журнале о том, что происходит. Возможно, они захотят посмотреть их интерфейс, поскольку пакет запускает, чтобы захватить соответствующее событие.

Ответ 2

Исходя из этого:

Сэр, я выполнил свой пакет на сервере, он работает хорошо. почта отправляется, но когда я настраиваю пакет (.dtsx) в задаче сервера sql, тогда только отправленное сообщение отправляется с ошибкой, все остальные три шага успешны.

Я не могу комментировать в это время, потому что StackOverflow не позволяет мне, поэтому не принимайте это как ответ, так как проверка основана на вашем комментарии выше этого. Вы настроили значения при выборе пакета SSIS для соответствия тому, как вы работаете на вашем сервере? У меня возникают проблемы при переходе с сервера на агент заданий, если я не настрою его точно так же, как есть (особенно, когда я использую конфигурационный файл или устанавливаю строки подключения по-разному). Обратите внимание, что проблема здесь по-прежнему будет запускать пакет без ошибок, но не делать того, что он должен делать.

За пределами приведенного выше параграфа ваш код и шаги выглядят хорошо, и если бы это было плохо, ваш пакет ломался бы на самом сервере; так что устраняет некоторые из возможных проблем.

Ответ 3

Ваш script относится к пути для вложения, которое начинается с C:\Users\Administrator. Я подозреваю, что учетная запись, используемая для запуска службы агента SQL Server, не имеет доступа к этой папке.

Вы можете решить эту проблему, перемещая эти файлы в не-пользовательский каталог и гарантируя, что учетная запись, используемая для запуска службы агента SQL Server, имеет доступ к этому каталогу.

Вы также должны убедиться, что учетная запись, используемая для запуска службы агента SQL Server, разрешена для использования вашей службы SMTP.

Возможно, вы также захотите использовать SSIS Send Mail Task для этого - вы избежите большого количества кода.