Email confirmation in ASP.NET mvc5 without sendgrid

后端 未结 1 1545
野趣味
野趣味 2021-02-02 04:06

The title pretty much says it. Is there a way of adding Email Confirmation to my application without using the send grid ? my Azure account won\'t let me use it, says it isnt av

1条回答
  •  隐瞒了意图╮
    2021-02-02 04:48

    I didn't use sendgrid neither in my website for the Email confirmation service. I See no point having it in small websites with low traffic.

    I use gmail SMTP service instead and it's works perfectly:

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Net.Mail;
    using System.Web;
    
    namespace MyProject.MyClasses
    {
    public class GmailEmailService : SmtpClient
    {
        // Gmail user-name
        public string UserName { get; set; }
    
        public GmailEmailService():
            base( ConfigurationManager.AppSettings["GmailHost"], Int32.Parse(ConfigurationManager.AppSettings["GmailPort"]) )
        {
            //Get values from web.config file:
            this.UserName = ConfigurationManager.AppSettings["GmailUserName"];
            this.EnableSsl = Boolean.Parse( ConfigurationManager.AppSettings["GmailSsl"] );
            this.UseDefaultCredentials = false;
            this.Credentials = new System.Net.NetworkCredential(this.UserName, ConfigurationManager.AppSettings["GmailPassword"]);
        }
    
    
    }
    

    }

    in the Web.Config file add the following:

      
    
          
    
            
            
            
            
            
            
    
          
    
      
    

    In App_Start\IdentityConfig.cs file change the SendAsync method to this code:

    public class EmailService : IIdentityMessageService
    {
    public async Task SendAsync(IdentityMessage message)
    {
    
            MailMessage email = new MailMessage(new MailAddress("noreply@myproject.com", "(do not reply)"), 
                new MailAddress(message.Destination));
    
            email.Subject = message.Subject;
            email.Body = message.Body;
    
            email.IsBodyHtml = true;
    
        using( var mailClient = new MyProject.MyClasses.GmailEmailService() )
        {
            //In order to use the original from email address, uncomment this line:
            //email.From = new MailAddress(mailClient.UserName, "(do not reply)");
    
            await mailClient.SendMailAsync(email);
        }
    
    }
    }
    

    note: you will also have to add this using to the IdentityConfig.cs file:

    using System.Net.Mail;
    

    The last thing is to update the following in your AccountController file to something like that:

    //
    // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                //Comment the following line to prevent log in until the user is confirmed:
                //await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
    
                string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Account confirmation");
    
                // Uncomment to debug locally 
                // TempData["ViewBagLink"] = callbackUrl;
    
                ViewBag.errorMessage = "Please confirm the email was sent to you.";
                return View("ShowMsg");
            }
            AddErrors(result);
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
    
    //
    // GET: /Account/ConfirmEmail
    [AllowAnonymous]
    public async Task ConfirmEmail(string userId, string code)
    {
        if (userId == null || code == null)
        {
            return View("Error");
        }
        var result = await UserManager.ConfirmEmailAsync(userId, code);
        return View(result.Succeeded ? "ConfirmEmail" : "Error");
    }
    
    
    private async Task SendEmailConfirmationTokenAsync(string userID, string subject)
    {
        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
        // Send an email with this link:
        string code = await UserManager.GenerateEmailConfirmationTokenAsync(userID);
        var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userID, code = code }, protocol: Request.Url.Scheme);
        await UserManager.SendEmailAsync(userID, subject, "Please confirm your account by clicking here");
    
    
        return callbackUrl;
    }        
    

    and a possible view ShowMsg.cs file can be:

    @{
        ViewBag.Title = "Message";
    }
    
    

    @ViewBag.Title

    @{ if (String.IsNullOrEmpty(ViewBag.errorMessage)) {

    An error occurred while processing your request.

    } else {

    @ViewBag.errorMessage

    } }

    That's it!, It works for me.

    p.s: you will have to allow the "less-secure-apps" option in your gmail account. follow that gmail link

    I used the following articles to write that solution:

    Create a secure ASP.NET MVC 5 web app with..

    ASP-NET-MVC-Confirm-Registration-Email

    stackoverflow-email-using-gmail-smtp-in-asp-net-mvc-application

    adding-two-factor-authentication..

    how-to-send-an Anonymous Email using Gmail in ASP.Net

    how-to-send-email-using-gmail-smtp-...

    0 讨论(0)
提交回复
热议问题