You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS中C#脚本任务发送邮件偶发“认证数据错误”问题求助

解决SSIS脚本任务邮件发送偶尔认证失败的问题

核心问题分析

你遇到的“Syntax error, Command unrecognized. The server response was: Incorrect authentication data”错误,大概率是SMTP客户端凭据设置顺序、变量值异常、服务器临时波动或错误处理逻辑缺陷导致的,以下是针对性的修复方案:


修复方案

1. 修正SmtpClient凭据设置顺序

对象初始化器的属性赋值顺序不固定,可能导致Credentials被UseDefaultCredentials=false意外重置。把客户端初始化改为分步赋值:

// 替换原有的SmtpClient初始化代码
var client = new SmtpClient(Dts.Variables["$Package::strMailHost"].Value.ToString(), 587);
// 先禁用默认凭据,再设置自定义凭据
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(username, password);
client.EnableSsl = true;
client.Send(mail);

2. 验证包变量的正确性

检查$Package::strMailUserName和$Package::strMailPassWord两个包级变量:

  • 确认变量类型为字符串,避免ToString()转换时出现异常值
  • 排查是否存在包配置、参数传递导致变量值在部分执行场景下被篡改
  • 可临时添加日志输出(仅输出用户名,不要输出密码),确认每次执行的凭据是否正确:
// 在SendEmail方法开头添加
bool fireAgain = true;
Dts.Events.FireInformation(0, "SendEmail", $"当前认证用户:{username}", string.Empty, 0, ref fireAgain);

3. 添加重试机制处理服务器波动

SMTP服务器偶尔会出现临时认证失败,添加重试逻辑可以解决这类偶发问题:

public void SendEmail(string username, string password, string EmailTo, string MailSub, string MailBod, string EmCC)
{
    int retryTimes = 2;
    int currentAttempt = 0;
    bool sendSuccess = false;
    bool fireAgain = true;

    while (currentAttempt < retryTimes && !sendSuccess)
    {
        try
        {
            MailMessage mail = new MailMessage();
            // ... 原有的邮件内容构建代码 ...

            var client = new SmtpClient(Dts.Variables["$Package::strMailHost"].Value.ToString(), 587);
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential(username, password);
            client.EnableSsl = true;
            client.Send(mail);
            sendSuccess = true;
        }
        catch (Exception ex)
        {
            currentAttempt++;
            Dts.Events.FireWarning(0, "SendEmail", $"第{currentAttempt}次发送失败:{ex.Message}", string.Empty, 0);
            if (currentAttempt >= retryTimes)
            {
                Dts.Events.FireError(0, "SendEmail", $"邮件发送失败,已重试{retryTimes}次:{ex.Message}", string.Empty, 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
                return;
            }
            System.Threading.Thread.Sleep(2000); // 间隔2秒重试
        }
    }
}

4. 修复错误处理逻辑缺陷

原代码中无论邮件发送成功与否,Main方法都直接返回Success,导致SSIS无法感知失败。必须在发送失败时设置任务结果为Failure,并终止任务流程。

5. 确认发件人地址与认证账号一致

部分SMTP服务器要求发件人地址必须和认证账号匹配,检查代码中mail.From的设置:

// 原代码用username作为发件人,改为使用varSendMailFrom变量的值
string mailFrom = Dts.Variables["User::varSendMailFrom"].Value.ToString();
mail.From = new MailAddress(mailFrom);

需要确保varSendMailFrom的值和strMailUserName的认证账号一致(或符合SMTP服务器的要求)。


内容的提问来源于stack exchange,提问作者Rajendra Gowd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 18:24:57