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

C# Windows Forms忘记密码功能邮件发送代码问题排查求助

密码重置邮件发送故障排查

我正在开发基于MongoDB的C# WinForms应用的忘记密码功能,已完成EmailService.cs、相关窗体及业务逻辑代码,但点击「获取令牌」按钮后始终显示“Something went wrong”,无法发送邮件。出于安全考虑,代码中留空了邮箱地址和密码,GPT判定代码逻辑正确,但问题依旧。

相关代码

EmailService.cs

using System.Net.Mail;
using System.Net;
using System;

namespace Logic
{
    public class EmailService
    {
        public void SendEmail(string recipient, string subject, string body)
        {
            var fromAddress = new MailAddress("", "The Garden Group");
            var toAddress = new MailAddress(recipient);
            // This password should be retrieved securely from a configuration file or environment variable
            const string fromPassword = "";

            var smtp = new SmtpClient
            {
                Host = "smtp.gmail.com",
                Port = 587,
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
            };

            using (var message = new MailMessage(fromAddress, toAddress)
            {
                Subject = subject,
                Body = body
            })
            {
                try
                {
                    smtp.Send(message);
                }
                catch (Exception ex)
                {
                    // Log or handle the exception here
                    // For example, you could log to console or to a file
                    Console.WriteLine("Error sending email: " + ex.Message);
                    throw; // Re-throwing the exception is optional depending on how you want to handle it.
                }
            }
        }
    }
}

窗体按钮点击事件

private void getTokenButton_Click_1(object sender, EventArgs e)
{
    string email = emailTextBox.Text;
    // Call the correct method to request a password reset
    bool requestSent = userService.RequestPasswordReset(email);
    if (requestSent)
    {
        tokenErrorLabel.Text = "If the email is registered, we will send a reset token to it.";
    }
    else
    {
        tokenErrorLabel.Text = "Something went wrong.";
    }
}

RequestPasswordReset函数

public bool RequestPasswordReset(string email)
{
    if (!EmailExists(email))
    {
        return false;
    }

    // Generate the reset token
    string token = GenerateResetToken();

    // Save the reset token in the database for later verification
    dao.SetResetToken(email, token);

    try
    {
        // Initialize your EmailService with the actual credentials and host information
        EmailService emailService = new EmailService();

        // Craft the body of the email
        string emailBody = $"Your password reset token is: {token}";

        // Send the email with the token
        emailService.SendEmail(email, "Password Reset Request", emailBody);

        // If SendEmail does not throw an exception, return true to indicate the email was sent
        return true;
    }
    catch (Exception ex)
    {
        // Log the exception as needed
        Console.WriteLine("Error sending email: " + ex.Message);

        // Return false if there was a problem sending the email
        return false;
    }
}

排查步骤

  • 填充有效邮箱凭据:当前代码中fromAddress和fromPassword为空,必须填入真实的发件邮箱地址和对应授权码(Gmail用户需使用应用专用密码,而非原账户密码,尤其是开启2FA的情况)。
  • 检查Gmail账户配置:
    • 前往Gmail设置-「转发和POP/IMAP」,确认IMAP服务已启用;
    • 若账户开启了两步验证,必须生成并使用应用专用密码;
    • 无需开启“不太安全的应用访问”(该功能已被Google淘汰)。
  • 捕获完整异常信息:修改异常处理代码,将Console.WriteLine("Error sending email: " + ex.Message);改为Console.WriteLine("Error sending email: " + ex.ToString());,获取包含堆栈跟踪、内部异常的完整错误详情,精准定位故障原因(如SMTP认证失败、端口被拦截、网络不通等)。
  • 验证SMTP参数顺序:确保UseDefaultCredentials = false在设置Credentials之前配置,否则Credentials会被覆盖。
  • 校验EmailExists逻辑:添加日志输出验证EmailExists(email)是否正确识别已注册邮箱,若该方法返回false,会直接触发错误提示。
  • 测试网络连通性:检查应用所在设备能否访问smtp.gmail.com的587端口,排查防火墙、代理是否拦截了SMTP请求。

内容的提问来源于stack exchange,提问作者HelloThere34

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:54:55