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

如何使用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登录,必须做以下操作之一:

  • 启用应用密码(推荐,安全):
    1. 确保你的谷歌账号开启了两步验证
    2. 进入谷歌账号安全设置,找到「应用密码」选项
    3. 生成一个专门用于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:13:14