使用ExchangeServices.SendEmail时正文含无效字符的处理方案问询
解决Exchange发送含堆栈跟踪邮件的无效字符问题
核心方案:过滤非法控制字符
Exchange的邮件内容禁止大部分ASCII控制字符(0x00-0x1F区间内,仅允许\t、\n、\r这类常用格式字符),直接过滤所有不符合要求的字符即可,无需提前枚举所有非法字符。
实现代码示例
方法1:正则表达式替换
用正则匹配所有非打印/非法控制字符,替换为空字符串或空格:
// 过滤body中的非法字符:保留可打印ASCII字符+常用格式符(\t\n\r) string cleanedBody = Regex.Replace(body, @"[^\x09\x0A\x0D\x20-\x7E]", ""); // 调用发送邮件方法 ExchangeServices.SendEmail(creds, fromEmailAddr, toEmailAddr, subject, cleanedBody);
正则说明:[^\x09\x0A\x0D\x20-\x7E] 匹配所有不在允许范围内的字符,其中:
\x09:制表符\x0A:换行符\x0D:回车符\x20-\x7E:所有可打印ASCII字符(空格到波浪线)
方法2:遍历字符过滤
若不想使用正则,可逐个检查字符并保留合法项:
StringBuilder sb = new StringBuilder(); foreach (char c in body) { // 允许制表符、换行、回车,以及可打印ASCII字符 if (c == '\t' || c == '\n' || c == '\r' || (c >= ' ' && c <= '~')) { sb.Append(c); } // 可选:将非法字符替换为占位符,比如[INVALID_CHAR] // else sb.Append("[INVALID_CHAR]"); } string cleanedBody = sb.ToString(); ExchangeServices.SendEmail(creds, fromEmailAddr, toEmailAddr, subject, cleanedBody);
额外提示
- 邮件主题(subject)也可能出现类似问题,建议同步应用过滤逻辑
- 若需要保留Unicode字符,可调整过滤范围(Exchange对Unicode支持无问题,主要限制为ASCII控制字符)
内容的提问来源于stack exchange,提问作者dblwizard
相关产品推荐
相关产品推荐

