使用C#调用Yandex SMTP发送邮件时出现SmtpException超时错误
解决C#使用Yandex SMTP发送邮件超时问题
以下是针对你遇到的SmtpException: The operation has timed out错误的具体排查和修复方案:
1. 确认Yandex SMTP核心配置要求
Yandex邮箱SMTP服务的硬性要求:
- 必须启用两步验证,并使用应用密码替代原账号密码(这是最常见的连接失败原因)
- 正确的端口与加密组合:
- 端口587 +
EnableSsl = true(推荐,使用STARTTLS协议,.NET兼容性更好) - 端口465 + 强制SSL(部分.NET版本的
SmtpClient对该端口的支持需要额外处理)
- 端口587 +
2. 代码调整建议
修复后的示例代码
public async Task SendEmailAsync(string email, string subject, string htmlMessage) { using (MailMessage mail = new MailMessage { From = new MailAddress("mymail@yandex.com", "Management", System.Text.Encoding.UTF8), Subject = subject, Body = htmlMessage, IsBodyHtml = true, }) { mail.To.Add(email); using (SmtpClient smtp = new SmtpClient { Host = "smtp.yandex.com", Port = 587, // 优先使用兼容性更好的587端口 EnableSsl = true, UseDefaultCredentials = false, Credentials = new NetworkCredential("mymail@yandex.com", "你的应用密码"), DeliveryMethod = SmtpDeliveryMethod.Network, Timeout = 10000 // 显式设置超时时间,避免默认值过短 }) { await smtp.SendMailAsync(mail); } } }
关键调整点
- 使用
async/await搭配SendMailAsync替代同步Send,既符合方法的异步签名,也避免阻塞导致的超时 - 替换为587端口(相比465,.NET的
SmtpClient对其支持更稳定) - 用
using语句确保MailMessage和SmtpClient被正确释放,避免资源泄漏 - 显式设置
Timeout参数,防止默认超时时间过短引发错误
3. 额外排查项
- 网络与防火墙:检查服务器/本地机器是否允许出站连接到
smtp.yandex.com的587或465端口,部分企业网络会屏蔽SMTP端口 - Yandex账号设置:登录Yandex邮箱,确认已在「邮件客户端」设置中开启
POP3/SMTP服务 - 应用密码验证:若开启了两步验证,必须在Yandex账号「安全设置」中生成专用应用密码,不能使用原账号密码
内容的提问来源于stack exchange,提问作者Mustafa Şan
相关产品推荐
相关产品推荐

