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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:05:58