Как заставить ссылку подтверждения активировать учетные записи в MVC4?

Я создаю приложение 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 Action

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");
    }      

Может ли кто-нибудь показать мне, как сделать эту работу, или, возможно, предложить другой способ сделать эту работу?

3 ответа

Решение

Я рекомендую вам использовать Postal, простой в использовании пакет для создания электронной почты. Он доступен в виде nuget-пакета.

Также взгляните на пост в блоге Кевина Джангханса на эту тему! Подтверждение электонной почты

Я сделал следующее, и это работает:

Создайте токен в реестре как:

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");
        }

Сообщение об ошибке при редактировании звучит так, будто ваш локальный компьютер не прослушивает ни один порт 25 ни 587, Я думаю, что вы должны проверить, настроен ли SMTP-сервер и работает, прежде чем делать что-либо с вашим кодом.

Вы можете просто создать 2 учетные записи на этом локальном сервере и настроить их в любом почтовом клиенте и проверить, можете ли вы отправлять электронные письма между ними. Второй вариант - проверка соединения с использованием telnet, но я не пробовал - http://www.petri.co.il/test_smtp_service.htm

Если использование почтового сервера за пределами вашего приложения прошло успешно и у вас все еще есть ошибки, убедитесь, что WebMail.UserName а также WebMail.Password верны. Если да, попробуйте установить WebMail.From на один из локальных тестовых адресов электронной почты, которые вы используете в WebMail конфигурация, как test@localhost или же test@127.0.0.1 (Я должен был использовать IP, чтобы пройти проверку электронной почты иногда).

Другие вопросы по тегам