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

使用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对该端口的支持需要额外处理)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:10:29