C#调用EWS发送邮件失败但VB.Net代码正常运行问题排查
故障原因
- TLS协议版本不匹配:C#项目默认启用的TLS版本过低(.NET Framework 4.5及以前版本默认仅支持TLS1.0,目前绝大多数Exchange服务器已经禁用TLS1.0/1.1,仅允许TLS1.2及以上版本连接),VB项目大概率因为目标.NET版本更高,默认启用了高版本TLS,因此可以正常连接。
- 次要语法/逻辑问题:你提供的C#代码中
mailMessage.SendAndSaveCopy())多写了一个右括号,若编译可正常通过则为粘贴失误可忽略;另外C#字符串为不可变类型,如果你实现的ReplaceWithBR方法没有用ref修饰入参、也没有返回修改后的字符串重新赋值,那么对slogyard等变量的换行替换不会生效,不过该问题不会引发底层连接关闭报错,属于附带逻辑缺陷。
解决方法
按优先级依次尝试:
- 强制指定高版本TLS协议:在
CreateConnection方法最开头添加指定TLS版本的代码:
// .NET 4.7及以上版本可同时兼容TLS1.2、TLS1.3,优先使用高版本 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; // 若.NET版本低于4.7,没有Tls13枚举,只保留Tls12即可 // ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
- 指定Exchange服务版本:初始化
ExchangeService的时候指定对应服务器的Exchange版本,避免默认低版本不兼容:
// 替换为你的Exchange服务器实际版本,可选值包括Exchange2013、Exchange2016、Exchange2019等 ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2016);
- 修复ReplaceWithBR逻辑缺陷:调整方法调用方式,确保字符串替换生效:
// 原无效写法:ReplaceWithBR(slogyard); // 修改为接收返回值重新赋值的写法 slogyard = ReplaceWithBR(slogyard); sScaling = ReplaceWithBR(sScaling); sLogMfct = ReplaceWithBR(sLogMfct); sOther = ReplaceWithBR(sOther);
对应ReplaceWithBR方法参考实现:
private string ReplaceWithBR(string input) { return string.IsNullOrEmpty(input) ? input : input.Replace("\n", "<br>"); }
内容的提问来源于stack exchange,提问作者CircleDot
相关产品推荐
相关产品推荐

