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

