当前位置: 首页 > 知识库问答 >
问题:

ASP. NET Core Mvc中的邮件确认问题

景正文
2023-03-14

我正在处理一个ASP. NET Core中的项目。

在这个项目中,用户必须在使用他们的面板之前确认他们的邮件。我已经编写了这部分代码,但有一个问题。

当我调试项目并获得确认链接,将其复制并粘贴到浏览器时,邮件确认就会成功

但是

当我通过电子邮件将确认Url发送到用户的邮件并且用户单击它以重定向到我的网站时,确认失败。

我不理解这个问题,因为它很奇怪。我已经硬编码了一些部分来测试它,但没有任何变化。

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (model.ReferralCode != null)
                    {
                        var tmpUser = userManager.Users.FirstOrDefault(f => f.IntroductionCode == model.ReferralCode);
                        if(tmpUser == null)
                        {
                            return Json(new { result = "error", target = "register", message = $"No user found with this({model.ReferralCode}) referral code" });
                        }
                    }
                    var user = new ApplicationUser
                    {
                        Id = Guid.NewGuid().ToString(),
                        FullName = model.FullName,
                        Email = model.Email,
                        UserName = model.Email,
                        Balance = 0,
                        ReferralCode = model.ReferralCode,
                        IntroductionCode = new Random().RandomString(16),                        
                        IsVerified = false
                    };
                    var signUpResut = await userManager.CreateAsync(user, model.Password);
                    if (signUpResut == IdentityResult.Success)
                    {
                        var token = await userManager.GenerateEmailConfirmationTokenAsync(user);
                        var emailActivationUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, verifyToken = token });
                        new MailHelper(_logger).SendConfirmationEmail(user.FullName,user.Id, user.Email, token);
                        _logger.Log(LogLevel.Information, $"User {model.Email} Registered Successfully.");
                        return Json(new { result = "success", target = "register", message = "You have successfully registered. Check your mail to activate account." });
                    }                    
                    return Json(new { result = "error", target = "register", message = "Something went wrong in server side." });
                }
                return Json(new { result = "error", target = "register", message = "Something went wrong in server side." });
            }
            catch (Exception exc)
            {
                _logger.Log(LogLevel.Critical, $"Failed Registeration : {exc.Message}");
                return Json(new { result = "error", target = "register", message = "Something went wrong in server side." });
            }
        }

这是邮件发件人代码

public bool SendConfirmationEmail(string name, string id, string email, string confirmationToken)
        {
            try
            {
                var mailMessage = new MimeMessage();
                mailMessage.From.Add(new MailboxAddress("***", "***"));
                mailMessage.To.Add(new MailboxAddress(name, email));
                mailMessage.Subject = "subject";
                var configurationUrl = $"https://localhost:44323/Account/ConfirmEmail?userId={id}&verifyToken={confirmationToken}";
                mailMessage.Body = MailBodyMaker($"<a href=\"{configurationUrl}\">Click here</a>", "Click here");

                using (var smtpClient = new SmtpClient())
                {
                    smtpClient.Connect("smtp.gmail.com", 465, true);
                    smtpClient.Authenticate("***", "****");
                    smtpClient.Send(mailMessage);
                    smtpClient.Disconnect(true);
                }
                return true;
            }
            catch(Exception exc)
            {
                _logger.Log(LogLevel.Critical, $"Email sending finished with exception ${exc.Message}");
                return false;
            }
        }

在调试模式下,确认链接如下所示

https://localhost:44323/Account/ConfirmEmail?userId=9bb1a751-813b-48d2-a44c-74fd32a2db9a

它在电子邮件正文中如下所示

https://localhost:44323/Account/ConfirmEmail?userId=9bb1a751-813b-48d2-a44c-74fd32a2db9a

共有1个答案

哈朗
2023-03-14

某些字符必须在url中转义,并且您的验证令牌包含此类字符,但是您可以将其按原样放入您的url中:

var configurationUrl = $"https://localhost:44323/Account/ConfirmEmail?userId={id}&verifyToken={confirmationToken}";

要转义它们-使用Uri。Escape eDataString

var configurationUrl = $"https://localhost:44323/Account/ConfirmEmail?userId={Uri.EscapeDataString(id)}&verifyToken={Uri.EscapeDataString(confirmationToken)}";
 类似资料:
  • 我使用的是firebase javascript API。 也不起作用

  • 问题内容: 启动电子邮件意图后,如何获得确认已发送电子邮件或发生错误的回叫活动? 也许开始activityForResult?但是我应该期待什么结果呢? 问题答案: 这确实取决于您的所启动的应用程序。它可以是Gmail应用程序,可以是电子邮件应用程序,也可以是任何第三方应用程序。因此,没有100%可靠的方法来确定用户是否实际按下了。 您唯一可以做的就是检查Gmail和电子邮件应用程序在通过调用时是

  • 此API适用于移动应用程序。目标是让用户在注册时确认电子邮件。当用户注册时,会生成一个确认链接并通过电子邮件发送。我在MVC项目中也采用了同样的方法,效果很好,但在Web API项目中,它似乎无法实现。现在,当用户单击该链接时,应该点击相应的动作方法并完成任务。 唯一的问题是,ConfirmEmail操作方法在单击确认链接时没有被触发,尽管它看起来很好。 以下是可能有帮助的主要配置 MVC服务配置

  • 问题内容: 我试图为用户建立确认电子邮件地址,以验证他们的电子邮件是真实的。我应该使用哪个软件包来确认用户的电子邮件地址。到目前为止,我使用猫鼬和快递 代码示例 在app.post代码中,如何确认用户的电子邮件地址? 问题答案: 您要找的是“帐户验证”或“电子邮件验证”。有很多Node模块可以执行此操作,但是原理如下: 您的用户模型应具有默认情况下的属性 当用户提交有效的注册表单时,创建一个新用户

  • 我想为新用户设置一封确认电子邮件。 所以当调试时,单击链接时,userId是可以的,但“code”输入参数为空,所以 是真的,然后执行 发送给注册用户的电子邮件如下所示: 请单击此链接确认您的帐户:https://localhost:44314/Account/ConfirmEmail?userId=3ec7ac6a-3329-4821-a09b-aa4843598eaa 编辑:链接包含 实际上,