如何使用System.Net.Mail正确发送邮件?WinForms代码报错求助
问题分析与解决方案
你的Windows Forms程序发送验证码时抛出异常,核心是代码存在几个关键问题,逐个解决即可:
1. 先找回原始异常信息(定位问题的关键)
你当前的catch块直接抛出自定义异常,完全丢失了原始错误的细节——这会让你根本不知道是认证失败、网络问题还是其他原因。先修改catch逻辑,保留原始异常:
catch (Exception ex) { // 弹出窗口显示具体错误,方便排查 MessageBox.Show($"发送失败:{ex.Message}\n{内部错误:{ex.InnerException?.Message}"); // 不要直接抛自定义异常,保留原始异常栈 // throw; }
运行后就能看到真实错误,比如Gmail的认证报错、端口配置问题等。
2. Gmail SMTP认证问题(最可能的失败原因)
Gmail现在默认禁止用账号密码直接通过SMTP登录,必须做以下操作之一:
- 启用应用密码(推荐,安全):
- 确保你的谷歌账号开启了两步验证
- 进入谷歌账号安全设置,找到「应用密码」选项
- 生成一个专门用于SMTP的应用密码,替换代码里的密码字段
- 临时启用低安全应用访问(不推荐,有风险):
进入谷歌账号安全设置,开启「不太安全的应用访问权限」(注意:谷歌已逐步取消该选项)
3. 修复未定义的nums变量
代码里的nums[rnd.Next(0,10)]中的nums没有定义,这会直接编译报错。可以直接简化验证码生成逻辑:
// 替换原来的验证码生成代码 verificationCode = string.Empty; for (int i = 0; i < 4; i++) { // 直接生成0-9的字符,无需额外数组 verificationCode += rnd.Next(0, 10).ToString(); }
或者提前在类里定义数组:private char[] nums = "0123456789".ToCharArray();
4. 优化代码细节,避免UI阻塞
- 空判断改用更规范的写法:
if (!string.IsNullOrEmpty(textBox4.Text) && !string.IsNullOrEmpty(textBox2.Text)) - 用异步方法发送邮件,避免同步操作导致UI假死:
// 把方法改为async private async void SendVerificationCode(object sender, EventArgs e) { if (!string.IsNullOrEmpty(textBox4.Text) && !string.IsNullOrEmpty(textBox2.Text)) { string verificationCode = string.Empty; Random rnd = new Random(); for (int i = 0; i < 4; i++) { verificationCode += rnd.Next(0, 10).ToString(); } try { // 使用using语句自动释放资源 using (MailMessage mail = new MailMessage()) using (SmtpClient smtp = new SmtpClient()) { mail.From = new MailAddress("你的gmail账号@gmail.com"); mail.To.Add(textBox2.Text); mail.Subject = "Verification code"; mail.Body = verificationCode; smtp.Host = "smtp.gmail.com"; smtp.Port = 587; smtp.Credentials = new System.Net.NetworkCredential("你的gmail账号@gmail.com", "生成的应用密码"); smtp.EnableSsl = true; await smtp.SendMailAsync(mail); MessageBox.Show("验证码发送成功!"); } } catch (Exception ex) { MessageBox.Show($"发送失败:{ex.Message}\n内部错误:{ex.InnerException?.Message}"); } } }
5. 验证收件人邮箱
确认textBox2.Text中的********@wp.pl是有效邮箱地址,没有拼写错误。
按以上步骤修改后,即可解决发送失败的问题。
内容的提问来源于stack exchange,提问作者new csharp'er
相关产品推荐
相关产品推荐

