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

C#自动发送邮件脚本报错:指定字符串不符合邮箱格式

解决SSIS C#脚本发送邮件的邮箱格式错误问题

Hey,我仔细看了你给出的代码和错误信息,核心问题是邮箱地址格式不符合要求——虽然你说已经检查过变量格式,但咱们可以从几个容易忽略的细节入手解决:

1. 多收件人/抄送人格式的坑

你把AlertEmail_SendCc(抄送变量)直接作为收件人传给MailMessage构造函数,如果这个变量里是多个邮箱,必须确保:

  • 用纯逗号或分号分隔,不能混着用
  • 邮箱前后不能有多余空格(比如"a@test.com , b@test.com"这种带空格的格式会直接触发错误)

举个正确的多邮箱示例:

"user1@example.com,user2@example.com"

2. 先给变量值“洗个澡”

SSIS变量有时候会暗藏不可见字符(比如换行、制表符),或者不小心混入空格,建议在获取变量值时先做清洗:

string htmlMessageTo = Dts.Variables["User::AlertEmail_SendCc"].Value.ToString()
    .Trim() // 去掉首尾空格
    .Replace(";", ",") // 统一用逗号分隔
    .Replace("\r\n", "") // 清除换行
    .Replace("\t", ""); // 清除制表符

3. 改用更稳妥的收件人添加方式

直接把多邮箱字符串传给MailMessage构造函数很容易踩坑,不如拆分后逐个添加,还能自动过滤无效邮箱:
修改你的SendMailMessage方法,用MailAddressCollection来管理收件人:

private void SendMailMessage(string from, string sendTo, string subject, bool isBodyHtml, string server)
{
    // 使用using语句自动释放资源,避免内存泄漏
    using (MailMessage htmlMessage = new MailMessage())
    using (SmtpClient mySmtpClient = new SmtpClient(server))
    {
        // 添加发件人
        htmlMessage.From = new MailAddress(from);
        
        // 拆分收件人,支持逗号/分号分隔,自动过滤空项
        foreach (string email in sendTo.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries))
        {
            var cleanedEmail = email.Trim();
            if (!string.IsNullOrWhiteSpace(cleanedEmail))
            {
                htmlMessage.To.Add(new MailAddress(cleanedEmail));
            }
        }
        
        htmlMessage.Subject = subject;
        htmlMessage.Body = " "; // 这里可以替换成你的实际邮件内容
        htmlMessage.IsBodyHtml = isBodyHtml;
        
        mySmtpClient.Send(htmlMessage);
    }
}

这种方式不仅能解决格式问题,还能自动跳过空的邮箱条目,容错性更强。

4. 加个日志排查变量实际值

有时候你以为变量格式对,但实际值可能有问题,建议在Main方法里加两行日志输出:

public void Main() 
{ 
    string htmlMessageFrom = Dts.Variables["User::AlertEmail_From"].Value.ToString(); 
    string htmlMessageTo = Dts.Variables["User::AlertEmail_SendCc"].Value.ToString(); 
    string htmlMessageSubject = Dts.Variables["User::AlertEmail_Subject"].Value.ToString(); 
    String SmtpServer = Dts.Connections["smtp_Server"].Properties["SmtpServer"].GetValue(Dts.Connections["smtp_Server"]).ToString(); 

    // 新增日志输出,查看变量实际值
    Console.WriteLine($"发件人邮箱: {htmlMessageFrom}");
    Console.WriteLine($"收件人/抄送人邮箱: {htmlMessageTo}");

    SendMailMessage(htmlMessageFrom, htmlMessageTo, htmlMessageSubject, true, SmtpServer); 
    Dts.TaskResult = (int)ScriptResults.Success; 
}

执行脚本后,在SSIS的执行日志里就能看到变量的真实内容,方便排查是否有隐性的格式问题。

最后再确认两个点

  • 确保AlertEmail_From是单个合法邮箱,不能传多个
  • 如果你的SMTP服务器需要认证,记得在SmtpClient里添加用户名密码(比如mySmtpClient.Credentials = new NetworkCredential("username", "password");),不过这次的错误不是认证问题,先重点解决格式问题就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:08:45