ASP.NET C#使用Gmail发送邮件遇连接超时问题求助
问题:ASP.NET C# 使用Gmail发送邮件时连接超时错误
发送邮件出错:连接尝试失败,因为连接方在一段时间后未正确响应,或已建立的连接失败,因为连接的主机未能响应。64.233.166.109:465
邮件发送代码
using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Options; using MimeKit; using MimeKit.Text; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; public class LocalMessageServices { private readonly EmailConfig ec; public LocalMessageServices(EmailConfig emailConfig) { this.ec = emailConfig; } public async Task SendEmailAsync(String email, String subject, String message) { try { var emailMessage = new MimeMessage(); emailMessage.From.Add(new MailboxAddress(ec.FromName, ec.FromAddress)); emailMessage.To.Add(new MailboxAddress("", email)); emailMessage.Subject = subject; emailMessage.Body = new TextPart(TextFormat.Html) { Text = message }; using (var client = new SmtpClient()) { client.LocalDomain = ec.LocalDomain; await client.ConnectAsync(ec.MailServerAddress, Convert.ToInt32(ec.MailServerPort), SecureSocketOptions.Auto).ConfigureAwait(false); await client.AuthenticateAsync(new NetworkCredential(ec.UserId, ec.UserPassword)); await client.SendAsync(emailMessage).ConfigureAwait(false); await client.DisconnectAsync(true).ConfigureAwait(false); } } catch (Exception ex) { Console.WriteLine("error sending email: "+ex.Message); throw new Exception("error sending email: " + ex.Message); } } }
邮件配置
"Email": { "FromAddress": "***@gmail.com", "FromName": "My Name", "LocalDomain": "use-local", //HOST "MailServerAddress": "smtp.gmail.com", "MailServerPort": "465", "UserId": "*****@gmail.com", "UserPassword": "myAppPassword" },
排查与修正方案
1. 网络连通性问题
端口465可能被本地防火墙、企业内网或ISP封禁,导致无法连接Gmail服务器:
- 验证网络:用
telnet smtp.gmail.com 465或PowerShell命令Test-NetConnection smtp.gmail.com -Port 465检查是否能连通。 - 切换端口:改用Gmail的587端口(STARTTLS协议),配置中修改
MailServerPort为"587",同时将ConnectAsync的第三个参数改为SecureSocketOptions.StartTls(明确指定协议更可靠)。
2. SSL/TLS配置不匹配
端口465对应SSL直连,代码中SecureSocketOptions.Auto的自动协商可能失败:
- 修改
ConnectAsync调用:将第三个参数改为SecureSocketOptions.SslOnConnect,明确指定用SSL连接465端口。
3. Gmail账号权限验证
- 确认已开启两步验证,且配置中的
UserPassword是正确生成的应用专用密码(Gmail已取消"不安全应用访问",必须用两步验证+应用密码)。 - 登录Gmail账号查看安全提示,确认账号未因异常发送行为被限制。
4. 代码潜在优化
- 异常处理:保留原始异常堆栈,修改抛出语句为
throw new Exception("发送邮件失败", ex);,方便定位深层问题。 - 收件人格式:
MailboxAddress的第一个参数为空字符串,可改为new MailboxAddress(email)或填写收件人名称,规范格式。 - 添加超时:在
ConnectAsync前设置client.Timeout = 30000;(30秒),避免无限等待连接。
内容的提问来源于stack exchange,提问作者Ali Shan
相关产品推荐
相关产品推荐

