C#控制台程序发送邮件遇SmtpException异常求助
问题排查与解决方案
一、常见问题排查点
1. 网络连通性问题
- 测试本地是否能访问Gmail的SMTP服务器:
- 打开命令提示符,执行
telnet smtp.gmail.com 587,能连通会进入空白界面;若提示无法连接,说明网络被防火墙/代理拦截,需联系管理员开放587端口的出站流量 - 或用PowerShell命令
Test-NetConnection smtp.gmail.com -Port 587检查端口连通性
- 打开命令提示符,执行
2. Gmail账户权限配置
- 必须启用两步验证:登录Google账户,在"安全"选项中开启两步验证
- 创建应用专用密码:两步验证开启后,在安全设置里找到"应用专用密码",生成用于SMTP验证的密码,代码中的
fromPassword需使用该生成密码,不能用原账户密码 - 注:Google已逐步移除"低安全性应用访问"选项,优先使用应用专用密码
3. SmtpClient配置顺序错误
- 必须先设置
UseDefaultCredentials = false,再设置Credentials,否则默认凭据会覆盖自定义账户信息,导致认证失败
二、修正后的完整实现代码
using System; using System.Net; using System.Net.Mail; class Program { static void Main(string[] args) { var fromAddress = new MailAddress("your-gmail-address@gmail.com", "发送者名称"); var toAddress = new MailAddress("recipient@example.com", "接收者名称"); const string fromPassword = "你的应用专用密码"; // 此处替换为生成的应用专用密码 const string subject = "测试报告邮件"; const string body = "这是控制台程序发送的测试报告内容"; using (var smtp = new SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, // 先禁用默认凭据 Credentials = new NetworkCredential(fromAddress.Address, fromPassword), Timeout = 10000 // 设置超时时间,避免无限等待 }) using (var message = new MailMessage(fromAddress, toAddress) { Subject = subject, Body = body }) { try { smtp.Send(message); Console.WriteLine("邮件发送成功"); } catch (Exception ex) { Console.WriteLine($"发送失败:{ex.Message}"); if (ex.InnerException != null) { Console.WriteLine($"内部异常:{ex.InnerException.Message}"); } } } } }
额外注意事项
- 公司内网环境下可能需要配置代理服务器,可在SmtpClient中设置
Proxy属性 - 确保邮件内容符合Gmail反垃圾邮件规则,避免被直接拦截
- 可将同步的
Send调用改为异步SendMailAsync,避免阻塞主线程
内容的提问来源于stack exchange,提问作者merlin savarimuthu
相关产品推荐
相关产品推荐

