基于.Net Core Web MVC的图书查询系统——第二章,.Net Core Web MVC配置邮件发送服务。使用腾讯企业邮箱实现账户确认和密码恢复功能。使用腾讯企业邮箱发送电子邮件心路历程。

基于.Net Core Web MVC的图书查询系统



前言

在跟随微软官网文档学习搭建mvc网站时教程上只教了SendGrid,还需要注册账号,由于不想注册这个,而网上的教程几乎都是asp.net的,而且都是一个函数下来的,没有详细的配置说明。因此作者写了这篇文章来记录 .Net Core MVC配置邮件发送服务的过程。


一、创建带身份验证的 .Net Core Web MVC 项目

在这里插入图片描述
这里就直接使用项目自带的身份验证功能了,下面是邮件发送服务配置

二、创建发送者信息类

public class AuthMessageSenderOptions
    {
        public const string JsonKey = "EmailSender";//由于信我把信息存放在appsettings.json文件中,所以这个属性标记节点键名
        public string SmtpHost { get; set; }//SMTP服务器地址
        public int SmtpPort { get; set; }//SMTP服务器端口
        public bool EnableSsl { get; set; }//是否启用SSL,注意这里有坑,可能是不同的ssl协议
        public string SendUser { get; set; }//发送方账号
        public string SendKey { get; set; }//发送方秘钥
    }

该类只是为了方便配置,我个人是直接把信息存放在appsettings.json文件中的,如果不放心怕不安全可以参考ASP.NET Core 中的开发中安全存储应用机密

三、配置邮件发送方信息

不使用上面的方式存储发送方信息的话可以直接跳过这一步哦
appsettings.json文件添加以下内容

“EmailSender”: {
“SmtpHost”: “smtp.exmail.qq.com”,//我这里用的是腾讯企业邮箱的发件服务器
“SmtpPort”: 25,//由于使用System.Net.Mail下的SmtpClient来发送邮件,而System.Net.Mail only仅支持Explicit SSL,所以这里使用普通端口,不使用ssl端口
“EnableSsl”: false,
“SendUser”: “jiumu@jumul.cn”,//这里配置你自己的邮箱
“SendKey”: “**********”//这里配置你的密码
},

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=MySqLite.db",
    "UserContextConnection": "Data Source=Demo.db"
  },
  "EmailSender": {
    "SmtpHost": "smtp.exmail.qq.com",//我这里用的是腾讯企业邮箱的发件服务器
    "SmtpPort": 25,//由于使用System.Net.Mail下的SmtpClient来发送邮件,而System.Net.Mail only仅支持Explicit SSL,所以这里使用普通端口,不使用ssl端口
    "EnableSsl": false,
    "SendUser": "jiumu@jumul.cn",//这里配置你自己的邮箱
    "SendKey": "**********"//这里配置你的密码
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

附上smtp服务配置指南

腾讯企业邮箱配置smtp指南:
如何设置IMAP、POP3/SMTP及其SSL加密方式?
QQ邮箱配置smtp:
如何使用IMAP服务?QQ邮箱帮助中心
QQ邮箱使用第三方客户端收发邮件

四、添加邮件发送类

添加IEmailSender.cs文件

using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.Extensions.Options;
using System.Net;
using System.Net.Mail;
using System.Threading.Tasks;

namespace Demo.Service
{
    public class EmailSender : IEmailSender
    {
        public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public AuthMessageSenderOptions Options { get; } //set only via Secret Manager

        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Execute(Options, subject, message, email);
        }

        public Task Execute(AuthMessageSenderOptions Options, string subject, string message, string email)
        {
            SmtpClient smtpClient = new SmtpClient(Options.SmtpHost, Options.SmtpPort);
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//通过远程smtp服务器发送
            smtpClient.EnableSsl = Options.EnableSsl;//使用SSl加密
            smtpClient.Timeout = 7000;//超时时间
            smtpClient.UseDefaultCredentials = false;//使用本地账户
            smtpClient.Credentials = new NetworkCredential(Options.SendUser, Options.SendKey);//smtp服务器账号和密码
            MailMessage mailMsg = new MailMessage();//实例化对象
            mailMsg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;//如果发送失败请通知
            mailMsg.IsBodyHtml = true;//是html邮件
            mailMsg.From = new MailAddress(Options.SendUser, "Gayhub网");//源邮件地址和发件人
            mailMsg.To.Add(new MailAddress(email));//收件人地址
            mailMsg.Subject = subject;//发送邮件的标题
            mailMsg.Body = message;//发送邮件的内容
            return smtpClient.SendMailAsync(mailMsg);
        }
    }
}

五、配置启动以支持电子邮件

将以下代码添加到Startup.cs 文件中的ConfigureServices方法
services.AddTransient<IEmailSender, EmailSender>();//邮件服务
services.Configure(Configuration.GetSection(AuthMessageSenderOptions.JsonKey));

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDatabaseDeveloperPageExceptionFilter();

            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddTransient<IEmailSender, EmailSender>();//邮件服务
            services.Configure<AuthMessageSenderOptions>(Configuration.GetSection(AuthMessageSenderOptions.JsonKey));

            services.AddControllersWithViews();
        }

如果不识别就将鼠标指向错误->显示可能的修补程序->添加相应的引用
在这里插入图片描述
到这里为止就已经可以正常发送邮件了,只不过还没有配置邮件服务提供者,这里继续跟随MSDN文档走。

六、添加自定义电子邮件服务提供者

添加自定义DataProtectorTokenProvider <TUser> 和 DataProtectionTokenProviderOptions :

    public class CustomEmailConfirmationTokenProvider<TUser>
                                       : DataProtectorTokenProvider<TUser> where TUser : class
    {
        public CustomEmailConfirmationTokenProvider(IDataProtectionProvider dataProtectionProvider,
            IOptions<EmailConfirmationTokenProviderOptions> options,
            ILogger<DataProtectorTokenProvider<TUser>> logger)
                                              : base(dataProtectionProvider, options, logger)
        {

        }
    }
    public class EmailConfirmationTokenProviderOptions : DataProtectionTokenProviderOptions
    {
        public EmailConfirmationTokenProviderOptions()
        {
            Name = "EmailDataProtectorTokenProvider";
            TokenLifespan = TimeSpan.FromHours(4);
        }
    }

这里我直接放在了邮件发送类的下方
在这里插入图片描述

七、然后将自定义提供程序添加到服务容器

还是Startup.cs 文件中的ConfigureServices方法
services.AddDefaultIdentity(config =>
{
config.SignIn.RequireConfirmedEmail = true;
config.Tokens.ProviderMap.Add(“CustomEmailConfirmation”,
new TokenProviderDescriptor(
typeof(CustomEmailConfirmationTokenProvider)));
config.Tokens.EmailConfirmationTokenProvider = “CustomEmailConfirmation”;
}).AddEntityFrameworkStores();
services.AddTransient<CustomEmailConfirmationTokenProvider>();

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDatabaseDeveloperPageExceptionFilter();

            services.AddDefaultIdentity<IdentityUser>(options =>
           {
               options.SignIn.RequireConfirmedAccount = true;
               options.Tokens.ProviderMap.Add("CustomEmailConfirmation",
                   new TokenProviderDescriptor(
                       typeof(CustomEmailConfirmationTokenProvider<IdentityUser>)));
               options.Tokens.EmailConfirmationTokenProvider = "CustomEmailConfirmation";
           }).AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddTransient<CustomEmailConfirmationTokenProvider<IdentityUser>>();

            services.AddTransient<IEmailSender, EmailSender>();//邮件服务
            services.Configure<AuthMessageSenderOptions>(Configuration.GetSection(AuthMessageSenderOptions.JsonKey));

            services.AddControllersWithViews();
        }

八、测试效果

在这里插入图片描述

在这里插入图片描述

总结

以上就是关于.Net Core Web MVC配置邮件发送服务的内容了。如果您觉得这篇文章对您有帮助,还请不要吝啬您手里的赞。同样,如果您觉得这篇文章有误,请您指正批评,作者将感激不尽!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值