.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
相关产品推荐
相关产品推荐

