You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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安全规则

分步修复方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:06:21