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

Windows服务调用Gmail SMTP发送邮件超时故障排查求助

Windows服务中SMTP发送Gmail邮件超时问题

我开发了一个每日运行的Windows服务,用于检查验证条件并在满足时发送邮件。SMTP代码如下:

using (SmtpClient smtpClient = new SmtpClient())
{
    smtpClient.Host = ConfigurationManager.AppSettings["SmtpHost"];//smtp.gmail.com
    smtpClient.Port = int.Parse(ConfigurationManager.AppSettings["SmtpPort"]);//587
    smtpClient.EnableSsl = bool.Parse(ConfigurationManager.AppSettings["SmtpEnableSsl"]);//true
    smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = new NetworkCredential(
        ConfigurationManager.AppSettings["SmtpUsername"],
        ConfigurationManager.AppSettings["SmtpPassword"]
    );
    smtpClient.Timeout = 30000;

    string fromEmail = ConfigurationManager.AppSettings["EmailFromAddress"];

    MailMessage message = new MailMessage
    {
        From = new MailAddress(fromEmail),
        Subject = subject,
        Body = emailBody,
        IsBodyHtml = true,
        BodyEncoding = Encoding.UTF8,
        SubjectEncoding = Encoding.UTF8
    };

    message.To.Add(recipientEmail);
    smtpClient.Send(message);
}

控制台应用中运行这段代码完全正常,但部署为Windows服务后,执行smtpClient.Send(message)时持续报错:

GeneralFailure - The operation has timed out

已通过PowerShell命令验证服务器能连接smtp.gmail.com的587端口:

Test-NetConnection -ComputerName smtp.gmail.com -Port 587

(端口测试结果显示连接成功)

尝试过用Local System、Network Service账户运行服务,也手动用runas启动exe,问题依旧。


可能的解决办法

1. 检查Gmail账户安全配置

  • 若开启双重验证,必须使用应用专用密码替代原账户密码,普通密码无法通过SMTP验证
  • 未开启双重验证的账户,需确保已开启"不太安全的应用访问"(注:该选项已逐步淘汰,优先推荐应用专用密码)
  • 登录Gmail账户查看是否有异常登录提醒,服务器的SMTP请求可能被标记为可疑,需手动允许

2. 替换为MailKit库(替代过时的SmtpClient)

.NET原生SmtpClient已标记为过时,在服务环境中存在兼容性问题,改用更稳定的MailKit:

  • 先通过NuGet安装:Install-Package MailKit
  • 示例代码:
using MailKit.Net.Smtp;
using MimeKit;

var message = new MimeMessage();
message.From.Add(new MailboxAddress("发件人", ConfigurationManager.AppSettings["EmailFromAddress"]));
message.To.Add(new MailboxAddress("收件人", recipientEmail));
message.Subject = subject;
message.Body = new TextPart("html") { Text = emailBody };

using (var client = new SmtpClient())
{
    client.Connect(ConfigurationManager.AppSettings["SmtpHost"], int.Parse(ConfigurationManager.AppSettings["SmtpPort"]), true);
    client.Authenticate(ConfigurationManager.AppSettings["SmtpUsername"], ConfigurationManager.AppSettings["SmtpPassword"]);
    client.Send(message);
    client.Disconnect(true);
}

3. 排查服务器代理/防火墙限制

  • 检查服务器全局代理设置,服务账户可能未继承用户级代理配置,导致SMTP请求被拦截
  • 确认防火墙是否允许服务进程访问外部SMTP端口,部分防火墙会按进程或账户过滤流量,PowerShell能通不代表服务进程有权限

4. 调整超时并增加日志

  • 将Timeout从30秒延长至60秒(smtpClient.Timeout = 60000),服务环境网络延迟可能更高
  • 在代码中添加详细日志,记录连接、认证、发送各阶段状态,定位具体失败环节

5. 确认服务账户网络权限

  • 尝试用具有管理员权限的本地账户运行服务测试,排除Network Service/Local System的网络访问限制
  • 检查服务器本地安全策略,确保服务账户拥有网络访问权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 23:49:52