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

