C#使用SmtpClient发送Gmail邮件超时问题求助
问题
我正在开发“忘记密码”功能,需要向用户输入的邮箱发送邮件。目前已经实现了收集邮箱的表单,点击提交按钮时会执行以下发送邮件的代码:
try { EmailAddr = rvalue; // 这是用户输入的邮箱地址 SmtpClient smtp = new SmtpClient("smtp.gmail.com", 465); smtp.EnableSsl = true; smtp.UseDefaultCredentials = false; System.Net.NetworkCredential basicAuth = new System.Net.NetworkCredential("MyEmailAddr@gmail.com", "oqjuxuwavdwoltml"); smtp.Credentials = basicAuth; MailAddress from = new MailAddress("FromEmailAddr@gmail.com", "My Name"); MailAddress to = new MailAddress(EmailAddr, "Tommy"); MailMessage msg = new System.Net.Mail.MailMessage(from, to); msg.Subject = "Lock & Key Password change request"; msg.SubjectEncoding = System.Text.Encoding.UTF8; msg.Body = "Just a test"; msg.BodyEncoding = System.Text.Encoding.UTF8; msg.IsBodyHtml = false; smtp.Send(msg); } catch(Exception ex) { await Shell.Current.DisplayAlert("Mailing Error", ex.Message, "OK"); }
我的Gmail账号已开启两步验证,且已升级到.NET 9.0框架,但每次运行程序都会抛出异常:“The operation has timed out”,请问哪里操作有误?
解决方案
1. 替换过时的SmtpClient组件
.NET 9中System.Net.Mail.SmtpClient已被标记为过时,官方推荐使用MailKit库(更稳定的邮件处理组件),原生SmtpClient在新版本框架中对现代SSL/TLS协议的支持存在兼容性问题,是导致超时的常见原因。
2. 确认应用专用密码的正确性
由于你的Gmail账号开启了两步验证,必须使用应用专用密码(而非账号原密码)进行认证:
- 登录Google账号的安全设置页面
- 找到「应用专用密码」选项(需先开启两步验证)
- 为你的应用生成专属密码,替换代码中的
oqjuxuwavdwoltml
3. 调整SMTP端口与协议
Gmail SMTP支持两种端口配置,你可以尝试切换:
- 465端口:需使用SSL加密,确保
EnableSsl = true - 587端口:使用STARTTLS协议,同样需要
EnableSsl = true,部分网络环境下587端口的连通性更好
4. 使用异步发送避免UI线程阻塞
同步的smtp.Send(msg)会在UI线程中执行网络操作,极易导致超时。应改用异步方法await smtp.SendMailAsync(msg),同时确保方法标记为async。
5. 排查网络环境限制
部分网络(如公司内网、校园网)会屏蔽SMTP端口,导致无法连接服务器。可以通过命令行测试连通性:
telnet smtp.gmail.com 465 # 或测试587端口 telnet smtp.gmail.com 587
修正后的代码示例(使用MailKit)
先通过NuGet安装MailKit包,再使用以下代码:
using MailKit.Net.Smtp; using MimeKit; try { var emailAddr = rvalue; // 用户输入的邮箱地址 var message = new MimeMessage(); message.From.Add(new MailboxAddress("My Name", "FromEmailAddr@gmail.com")); message.To.Add(new MailboxAddress("Tommy", emailAddr)); message.Subject = "Lock & Key Password change request"; message.Body = new TextPart("plain") { Text = "Just a test" }; using (var client = new SmtpClient()) { // 连接Gmail SMTP服务器,使用587端口+STARTTLS协议 await client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls); // 使用应用专用密码认证 await client.AuthenticateAsync("MyEmailAddr@gmail.com", "你的应用专用密码"); await client.SendAsync(message); await client.DisconnectAsync(true); } } catch (Exception ex) { await Shell.Current.DisplayAlert("Mailing Error", ex.Message, "OK"); }
内容的提问来源于stack exchange,提问作者Bob Gatto
相关产品推荐
相关产品推荐

