4

我正在构建一个从默认 Internet 应用程序开始的 MVC 4 应用程序。我的目标是在用户注册网站时向他们发送一封确认电子邮件,我已经成功发送了确认电子邮件,但是当我点击它时,帐户没有得到确认。

注意:我知道注册操作很拥挤,当我让它工作时,我会将其分成不同的文件。

*这就是我所做的: *

注册动作

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            try //CreateUserAndAccount
            {
                var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
                if (token != null)
                {
                    var hosturl =
                        System.Web.HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) +
                        "/Account/ConfirmAccount?token=" + token;

                    var confirmationLink = string.Format("<a href=\"{0}\">Clink to confirm your registration</a>",
                                                         hosturl);




                    var message = new MailMessage("komengem@gmail.com", model.UserName)
                    {
                        Subject = "Please confirm your email",
                        Body = confirmationLink
                    };

                    var client = new SmtpClient();
                    client.EnableSsl = true;
                    client.Send(message);
                }

                TempData["message"] = string.Format(
                    "Thank you for registering. An email has been sent to {0}. " +
                    "Please check your email and use the enclosed link to finish registration.", model.UserName);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

ConfirmAcount 操作

public ActionResult ConfirmAccount(string ID)
    {
        //return View("ConfirmAccount");
        var confirmationToken = Request["token"];
        if (!String.IsNullOrEmpty(confirmationToken))
        {
            var user = WebSecurity.CurrentUserName;
            WebSecurity.ConfirmAccount(confirmationToken);
            WebSecurity.Login(user, null);
            return View("Welcome");
        }

        TempData["message"] = string.Format(
                    "Your account was not confirmed, please try again or contact the website adminstrator.");
        return RedirectToAction("Index", "Home");            
    }

也试过

public ActionResult ConfirmAccount(string ID)
    {
        if (string.IsNullOrEmpty(ID) || (!Regex.IsMatch(ID,
                        @"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}")))
        {
            TempData["tempMessage"] =
                "The user account is not valid. Please try clicking the link in your email again.";
            return View();
        }
        MembershipUser user = Membership.GetUser(new Guid(ID));

        if (!user.IsApproved)
        {
            user.IsApproved = true;
            Membership.UpdateUser(user);
            FormsAuthentication.SetAuthCookie(user.UserName, false);
            return RedirectToAction("Login");
        }
        WebSecurity.Logout();
        TempData["tempMessage"] = "You have already confirmed your email address... please log in.";
        return RedirectToAction("Login");
    }      

谁能告诉我如何使这项工作,或者也许建议一种不同的方式来使这项工作?

4

3 回答 3

7

我鼓励您使用 Postal,这是一个简单易用的电子邮件创建包。它以 nuget 包的形式提供。

还可以看看 Kevin Junghans 关于这个主题的博文!邮件确认

于 2013-02-07T08:13:20.880 回答
1

我已经完成了以下操作并且正在运行:

在寄存器中创建令牌:

string confirmationToken =
                        WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email }, true);

然后在确认中使用了以下内容:

public ActionResult RegisterConfirmation(string Id)
        {
            if (WebSecurity.ConfirmAccount(Id))
            {
                return RedirectToAction("ConfirmationSuccess");
            }
            return RedirectToAction("ConfirmationFailure");
        }
于 2013-05-13T13:07:18.247 回答
0

来自您的编辑的错误消息听起来像您的本地计算机既没有在端口上25也没有在587. 我认为您应该在对代码执行任何操作之前检查 SMTP 服务器是否已配置并运行。

您只需在此本地服务器上创建 2 个帐户并在任何电子邮件客户端中设置它们,然后检查您是否能够在它们之间发送电子邮件。第二种选择是使用 telnet 检查连接,但我没有尝试过 - http://www.petri.co.il/test_smtp_service.htm

如果在您的应用程序之外使用邮件服务器成功并且您仍然有错误,请确保您的WebMail.UserNameWebMail.Password是正确的。如果是,请尝试设置WebMail.From为您在WebMail配置中使用的本地测试电子邮件地址之一,例如test@localhosttest@127.0.0.1(有时我不得不使用 IP 来通过电子邮件验证)。

于 2013-02-01T00:20:15.400 回答