C#调用SmtpClient发Gmail邮件提示服务器不支持安全连接求助
解决方案
- 显式指定TLS协议版本
Gmail目前仅支持TLS 1.2及以上版本的安全连接,不同目标框架的.NET项目默认启用的TLS版本存在差异:.NET Framework 4.5及以下版本默认未启用TLS 1.2,.NET Core/.NET 5+部分版本的默认协议配置也会受系统环境影响,这是同代码不同项目运行结果不一致的最常见原因。
在sendEmail方法开头添加以下代码即可:
// 强制指定使用TLS 1.2发起连接,兼容所有支持Gmail的运行环境 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
完整修改后的代码示例:
private static void sendEmail() { // 新增这一行即可解决绝大多数框架版本差异导致的连接异常 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; var client = new SmtpClient("smtp.gmail.com", 587) { Credentials = new NetworkCredential("sender@gmail.com", "myPassword"), EnableSsl = true }; client.Send("sender@gmail.com", "receiver@gmail.com", "Email Subject", "Some body message"); }
检查项目配置文件的覆盖项
打开当前报错项目的App.config(控制台应用)配置文件,查找是否存在<system.net>节点下的<mailSettings>配置,该配置的优先级高于代码硬编码的SMTP参数,如果存在错误的SSL、端口、服务器配置,直接删除整段<mailSettings>节点即可。对齐两个项目的编译配置
对比正常运行的老项目和当前报错项目的编译配置:- 确认目标框架版本完全一致
- 确认编译平台(x86/x64/Any CPU)完全一致
- 确认项目的输出类型、权限配置完全一致
替换为官方推荐的MailKit实现
微软官方已标记SmtptClient为过时类,不再推荐用于新开发,若以上方案均无效,可以替换为MailKit库实现邮件发送,原生兼容最新的TLS协议和Gmail的安全规则,避免底层实现差异导致的异常。
内容的提问来源于stack exchange,提问作者Muhammad Sagnia
相关产品推荐
相关产品推荐

