10

次のことを行うSSISプロジェクトを作成しました

制御フロー:-

ここに画像の説明を入力

データフロー:-

ここに画像の説明を入力

  • 最初にExcelシートのデータを削除します
  • 新しい Excel シートを作成する
  • データベースから Excel ファイルにデータを挿入する
  • そのエクセルファイルをメールで送信

パッケージを右クリックして実行すると、うまく機能します(メールが送信されました)。しかし、Sql Server Agent ジョブでパッケージの実行をスケジュールすると、「パッケージの実行に成功しました」と表示されますが、メールは送信されません。Excelシートにデータを挿入することはできますが。

次に、SQL Server Agent Job によってメールが送信されないのはなぜですか?

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;
            }
        }
    }
}
4

3 に答える 3

9

運が良かったので詳細は省略します。

うまくいかない理由トップ N

  1. SQL Server エージェントアカウントは、Exchange と通信できません。Domain\SqlServiceAccount は Exchange のユーザーではないため、メールを送信できません。Domain\SagarDumbreExchange のユーザーであり、メールを送信できるため、これが機能します。

  2. サーバーは、Exchange と通信する権限がありません。Exchange 管理者には IP アドレスを承認する権限があり、SQL Server を実行するアカウントは Exchange と通信できますが、アドレス 192.168.1.101 はメール サーバーと通信できません。これは、Exchange のアップグレード/メンテナンス中に発生しました。管理者は、承認されていないアドレスからスパムが送信されるのを防ぐために機能を有効にし、サーバーはリストにありませんでした.

  3. ファイアウォールおよび/またはウイルス スキャナー。電子メールの正常な送信がマシンまたは問題のサーバーのどちらから機能するかを指定しなかったため、要求が Outlook からのものではないため、これらの製品がメール サーバーへのアクセスをブロックすることも確認しました。

  4. 悪いコード。メール送信コードの何かが失敗しているか、MTA から、要求を処理できず、コードがリッスンしていない、または何が原因であるかを示すエラー メッセージを受信して​​います。スクリプト タスクからフィードバックを取得できるように、いくつかの情報イベントを発生させます。

Exchange 管理者に連絡して、ログに何が起こっているかの詳細があるかどうかを確認してください。パッケージが起動して適切なイベントをキャプチャするときに、インターフェイスを監視する必要がある場合があります。

于 2012-12-18T18:07:14.973 に答える
3

スクリプトは、C:\Users\Administrator で始まる添付ファイルのパスを参照しています。SQL Server エージェント サービスを実行するために使用されるアカウントには、そのフォルダーへのアクセス権がないと思われます。

これらのファイルを非ユーザー ディレクトリに移動し、SQL Server エージェント サービスの実行に使用するアカウントがそのディレクトリにアクセスできるようにすることで、これを解決できます。

また、SQL Server エージェント サービスの実行に使用するアカウントが SMTP サービスの使用を許可されていることを確認する必要があります。

これには、SSIS Send Mail Task の使用を検討することもできます。これにより、多くのコードを回避できます。

于 2012-12-20T23:16:07.170 に答える
3

これに基づいて:

サーバー自体でパッケージを実行しましたが、うまくいきました。メールは送信されていますが、SQL サーバー ジョブでパッケージ (.dtsx) を構成すると、送信されたメールのみが失敗し、残りの 3 つの手順はすべて成功します。

StackOverflowで許可されていないため、現時点ではコメントできません。これを回答と見なさないでください。これは、上記のコメントに基づく検証と同じです。SSIS パッケージを選択するときに、サーバーでの実行方法と一致するように値を構成しましたか? サーバーからジョブ エージェントに移動するときに、ジョブ エージェントをそのまま正確に構成しないと、問題が発生します (特に、構成ファイルを使用するか、接続文字列を別の方法で設定する場合)。ここでの問題は、パッケージをエラーなしで実行することに注意してください

上記の段落以外では、コードと手順は適切に見えますが、それが悪い場合は、サーバー自体でパッケージが破損する可能性があります。これにより、考えられる問題の一部が排除されます。

于 2012-12-20T22:56:44.890 に答える