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

C#使用SmtpClient发送Gmail邮件超时问题求助

问题

我正在开发“忘记密码”功能,需要向用户输入的邮箱发送邮件。目前已经实现了收集邮箱的表单,点击提交按钮时会执行以下发送邮件的代码:

try
{
    EmailAddr = rvalue;  // 这是用户输入的邮箱地址

    SmtpClient smtp = new SmtpClient("smtp.gmail.com", 465);
    smtp.EnableSsl = true;
    smtp.UseDefaultCredentials = false;
    
    System.Net.NetworkCredential basicAuth = new System.Net.NetworkCredential("MyEmailAddr@gmail.com", "oqjuxuwavdwoltml");
    smtp.Credentials = basicAuth;

    MailAddress from = new MailAddress("FromEmailAddr@gmail.com", "My Name");
    MailAddress to = new MailAddress(EmailAddr, "Tommy");
    MailMessage msg = new System.Net.Mail.MailMessage(from, to);

    msg.Subject = "Lock & Key Password change request";
    msg.SubjectEncoding = System.Text.Encoding.UTF8;

    msg.Body = "Just a test";
    msg.BodyEncoding = System.Text.Encoding.UTF8;
    msg.IsBodyHtml = false;

    smtp.Send(msg);
}
catch(Exception ex)
{
    await Shell.Current.DisplayAlert("Mailing Error", ex.Message, "OK");
}

我的Gmail账号已开启两步验证,且已升级到.NET 9.0框架,但每次运行程序都会抛出异常:“The operation has timed out”,请问哪里操作有误?

解决方案

1. 替换过时的SmtpClient组件

.NET 9中System.Net.Mail.SmtpClient已被标记为过时,官方推荐使用MailKit库(更稳定的邮件处理组件),原生SmtpClient在新版本框架中对现代SSL/TLS协议的支持存在兼容性问题,是导致超时的常见原因。

2. 确认应用专用密码的正确性

由于你的Gmail账号开启了两步验证,必须使用应用专用密码(而非账号原密码)进行认证:

  • 登录Google账号的安全设置页面
  • 找到「应用专用密码」选项(需先开启两步验证)
  • 为你的应用生成专属密码,替换代码中的oqjuxuwavdwoltml

3. 调整SMTP端口与协议

Gmail SMTP支持两种端口配置,你可以尝试切换:

  • 465端口:需使用SSL加密,确保EnableSsl = true
  • 587端口:使用STARTTLS协议,同样需要EnableSsl = true,部分网络环境下587端口的连通性更好

4. 使用异步发送避免UI线程阻塞

同步的smtp.Send(msg)会在UI线程中执行网络操作,极易导致超时。应改用异步方法await smtp.SendMailAsync(msg),同时确保方法标记为async。

5. 排查网络环境限制

部分网络(如公司内网、校园网)会屏蔽SMTP端口,导致无法连接服务器。可以通过命令行测试连通性:

telnet smtp.gmail.com 465
# 或测试587端口
telnet smtp.gmail.com 587

修正后的代码示例(使用MailKit)

先通过NuGet安装MailKit包,再使用以下代码:

using MailKit.Net.Smtp;
using MimeKit;

try
{
    var emailAddr = rvalue; // 用户输入的邮箱地址

    var message = new MimeMessage();
    message.From.Add(new MailboxAddress("My Name", "FromEmailAddr@gmail.com"));
    message.To.Add(new MailboxAddress("Tommy", emailAddr));
    message.Subject = "Lock & Key Password change request";

    message.Body = new TextPart("plain")
    {
        Text = "Just a test"
    };

    using (var client = new SmtpClient())
    {
        // 连接Gmail SMTP服务器,使用587端口+STARTTLS协议
        await client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls);
        
        // 使用应用专用密码认证
        await client.AuthenticateAsync("MyEmailAddr@gmail.com", "你的应用专用密码");
        
        await client.SendAsync(message);
        await client.DisconnectAsync(true);
    }
}
catch (Exception ex)
{
    await Shell.Current.DisplayAlert("Mailing Error", ex.Message, "OK");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:30:57