引用类发送邮件时出现System.Net.Security程序集错误的解决咨询
我来帮你分析这个邮件发送时遇到的System.Net.Security, Version=4.0.0.0错误问题,结合你的开发环境(VS2017 15.6.6 + .NET 4.7.02556 + MailKit 2.0.3),具体原因和解决办法如下:
错误原因分析
- 程序集版本冲突:MailKit 2.x版本对.NET框架的依赖和你项目中实际引用的
System.Net.Security版本不匹配,可能是项目里残留了旧版本引用,或者全局程序集缓存(GAC)里的版本干扰了加载。 - NuGet依赖解析异常:VS2017 15.6.6的NuGet管理器可能没有正确处理MailKit的依赖链,导致
System.Net.Security程序集缺失或引用错误。 - SSL/TLS兼容性问题:你测试的SMTP服务器大多要求TLS 1.2及以上版本,但.NET 4.7默认的安全协议设置可能没有启用高版本TLS,间接触发了安全层的程序集调用错误。
具体解决办法
1. 修复NuGet依赖并添加程序集绑定重定向
- 先卸载项目中的MailKit和MimeKit,再重新安装兼容版本:如果2.0.3还是有问题,可以尝试降级到MailKit 1.18.x版本,它对旧版VS和.NET 4.7的兼容性更稳定。
- 在项目的
App.config或Web.config中添加绑定重定向,强制指定System.Net.Security的版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Net.Security" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
(如果你的.NET 4.7对应的System.Net.Security是更高版本,可在项目引用里查看实际版本号并修改newVersion)
2. 强制启用高版本TLS
在发送邮件的代码开头添加以下代码,确保使用兼容SMTP服务器的安全协议:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls;
3. 清理项目并验证框架设置
- 右键项目→属性→应用程序,确认目标框架是
.NET Framework 4.7(不要选客户端配置文件)。 - 执行清理解决方案,删除项目目录下的
bin和obj文件夹,再重新生成项目,清除旧的程序集缓存。
4. 优化SMTP服务器配置
针对你测试的服务器,确保代码里的配置正确:
- Office 365/smtp.office365.com:端口用
587,加密方式选SecureSocketOptions.StartTls; - Gmail:开启App密码(若启用两步验证)或低安全性应用访问,端口用
587或465; - 示例代码片段:
using (var client = new SmtpClient()) { client.Connect("smtp.office365.com", 587, MailKit.Security.SecureSocketOptions.StartTls); client.Authenticate("你的邮箱地址", "你的密码/App密码"); client.Send(message); client.Disconnect(true); }
内容的提问来源于stack exchange,提问作者Bonus9500
相关产品推荐
相关产品推荐

