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

.NET 6 MailKit发送确认邮件遇Socket连接超时错误求助

MailKit发送Gmail邮件连接超时问题排查与解决

错误信息

连接尝试失败,因为连接方在一段时间后未正确响应,异常调用堆栈如下:

该异常最初在以下调用堆栈中抛出:
System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(System.Net.Sockets.SocketError, System.Threading.CancellationToken)
System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(short)
System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask..cctor.AnonymousMethod__4_0(object)

代码与配置

邮件发送方法

private void Send(MimeMessage mailMessage)
{
    using (var client = new SmtpClient())
    {
        try
        {
            client.Connect(_emailConfig.SmtpServer, _emailConfig.Port, SecureSocketOptions.StartTls);
            client.AuthenticationMechanisms.Remove("XOAUTH2");
            client.Authenticate(_emailConfig.UserName, _emailConfig.Password);
            client.Send(mailMessage);
        }
        catch
        {
            //log an error message or throw an exception or both.
            throw;
        }
        finally
        {
            client.Disconnect(true);
            client.Dispose();
        }
    }
}

邮箱配置

"EmailConfiguration": {
    "From": "online.tapthat@gmail.com",
    "SmtpServer": "smtp.gmail.com",
    "Port": 587,
    "Username": "online.tapthat@gmail.com",
    "Password": "********!"
}

解决步骤

  • 调整Gmail账户验证方式:
    • 若未开启两步验证,需在Gmail账户设置中启用低安全性应用访问(注:该方式已逐步被Google弃用,更推荐两步验证)
    • 开启两步验证后,生成应用专用密码,替换配置文件中的普通密码,这是当前Gmail支持第三方客户端登录的标准方式
  • 测试网络连通性:
    • 确认服务器能正常访问smtp.gmail.com的587端口,可通过telnet smtp.gmail.com 587命令测试
    • 检查服务器防火墙、网络代理是否拦截了SMTP请求
  • 优化MailKit连接设置:
    • 添加超时参数避免无限等待:
      client.Timeout = 10000; // 设置10秒超时
      client.Connect(_emailConfig.SmtpServer, _emailConfig.Port, SecureSocketOptions.StartTls);
      
    • 改用异步方法发送邮件,避免同步阻塞导致的超时:
      private async Task SendAsync(MimeMessage mailMessage, CancellationToken token = default)
      {
          using var client = new SmtpClient();
          try
          {
              await client.ConnectAsync(_emailConfig.SmtpServer, _emailConfig.Port, SecureSocketOptions.StartTls, token);
              client.AuthenticationMechanisms.Remove("XOAUTH2");
              await client.AuthenticateAsync(_emailConfig.UserName, _emailConfig.Password, token);
              await client.SendAsync(mailMessage, token);
          }
          finally
          {
              await client.DisconnectAsync(true, token);
          }
      }
      
  • 确认配置正确性:
    • 当前配置的smtp.gmail.com服务器和587端口是正确的,无需修改

内容的提问来源于stack exchange,提问作者nado1122

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:13:22