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
相关产品推荐
相关产品推荐

