ASP.NET Core 5.0 Razor发送邮件报套接字权限错误如何解决
ASP.NET Core 5.0 Razor 邮件发送失败问题修复
运行代码时抛出如下异常:
处理请求时发生未处理异常。
ExtendedSocketException: 尝试以访问权限禁止的方式访问套接字。[::ffff:142.250.145.108]:587
System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
SmtpException: 邮件发送失败。
System.Net.Mail.SmtpClient.Send(MailMessage message)
报错根因
触发套接字访问禁止错误的直接原因是网络出站限制,同时现有代码存在多个隐性逻辑问题,两类问题共同导致发信失败:
- 网络层面:应用无法和Gmail SMTP服务器(142.250.145.108:587)建立TCP连接,通常是本地防火墙/杀毒软件拦截、云服务器安全组封禁SMTP端口、公司内网出口策略限制外发SMTP请求导致。
- 代码层面:
- .NET 5自带的
SmtpClient已被官方标记为过时,存在TLS协议兼容、资源未释放的已知问题 - 收件人地址硬编码为
test@mymail.com,完全没有读取前端表单传入的收件人、邮件正文参数,用户在页面填写的内容不会被带入邮件 - 未配置邮件正文属性,即使连接成功也只会发送空邮件
- Gmail SMTP不支持直接使用账号密码登录,需要专用应用密码,现有凭据配置不符合Gmail安全规则
- .NET 5自带的
分步修复方案
1. 先排查网络连通性
在部署应用的机器上执行PowerShell命令验证端口连通性:
Test-NetConnection smtp.gmail.com -Port 587
如果返回结果中TcpTestSucceeded为False,按场景处理:
- 本地开发环境:临时关闭第三方杀毒软件的邮件防护功能,在系统防火墙中放行dotnet进程的出站连接
- 云服务器环境:先在安全组规则中放行587、465端口的出站访问,若仍无法连通需提交工单申请云厂商解封默认封禁的SMTP端口
- 企业内网环境:联系网络管理员开通SMTP端口的出站权限,或直接使用企业内部提供的SMTP服务
2. 配置Gmail发信凭据
不要直接使用谷歌账号的登录密码作为SMTP密码:先在谷歌账号中开启两步验证,再生成16位的应用专用密码,用这个密码作为SMTP登录凭据。
3. 修正后端代码逻辑
用using语句包裹SmtpClient确保资源释放,正确读取表单绑定的邮件参数,修复后的代码如下:
using System.Net; using System.Net.Mail; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; public ActionResult OnPostAsync() { // 模型校验失败直接返回表单页,展示校验错误 if (!ModelState.IsValid) { return Page(); } MailMessage msg = new MailMessage(); // 发件人地址必须和SMTP登录账号一致 msg.From = new MailAddress("admin@mymail.com"); // 读取前端传入的收件人地址,替换硬编码值 msg.To.Add(new MailAddress(SendEmail.ClientsEmail)); msg.Subject = SendEmail.Subject; // 读取前端传入的邮件正文 msg.Body = SendEmail.BodyText; // 若正文是HTML格式,将下面属性设为true msg.IsBodyHtml = false; using (SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 587)) { smtpClient.Credentials = new NetworkCredential("admin@mymail.com", "你生成的Gmail应用专用密码"); smtpClient.EnableSsl = true; // 仅本地测试时可开启下面配置跳过证书校验,生产环境禁止使用 // ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, sslPolicyErrors) => true; smtpClient.Send(msg); } return RedirectToPage("./Index"); }
额外注意事项
- 现有前端表单结构无需大改,后续如果需要支持附件上传,给form标签添加
enctype="multipart/form-data"属性即可 - 生产环境不要把SMTP账号、密码硬编码在代码中,要将敏感配置存到appsettings.json或环境变量中,避免凭据泄露
- 自带
SmtpClient仅支持587端口的STARTTLS显式加密,不支持465端口的隐式SSL加密,如果需要用465端口或需要更稳定的发信能力,建议使用MailKit库实现邮件发送,这是.NET官方推荐的邮件处理组件 - 如果Gmail SMTP连通性始终无法解决,可以换用国内企业邮箱或第三方邮件推送服务的SMTP,端口封禁概率更低
内容的提问来源于stack exchange,提问作者Fillo
相关产品推荐
相关产品推荐

