Как заставить ссылку подтверждения активировать учетные записи в 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, чтобы пройти проверку электронной почты иногда).