admin管理员组

文章数量:1559735

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

  • 第一章,.Net Core Web MVC配置身份验证和注册登录功能并修改默认页面
  • 第二章,.Net Core Web MVC配置邮件发送服务
  • 第三章,在.Net Core Web MVC中使用Sqlite数据库
  • 第四章,添加模型并使用EF Core生成基架&自动生成控制器和视图
  • 第五章,条件查询的设计与实现

第二章,.Net Core MVC配置邮件发送服务

  • 基于.Net Core Web MVC的图书查询系统
  • 前言
  • 一、创建带身份验证的 .Net Core Web MVC 项目
  • 二、创建发送者信息类
  • 三、配置邮件发送方信息
  • 四、添加邮件发送类
  • 五、配置启动以支持电子邮件
  • 六、添加自定义电子邮件服务提供者
  • 七、然后将自定义提供程序添加到服务容器
  • 八、测试效果
  • 总结


前言

在跟随微软官网文档学习搭建mvc网站时教程上只教了SendGrid,还需要注册账号,由于不想注册这个,而网上的教程几乎都是asp的,而且都是一个函数下来的,没有详细的配置说明。因此作者写了这篇文章来记录 .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”,//我这里用的是腾讯企业邮箱的发件服务器
“SmtpPort”: 25,//由于使用System.Net.Mail下的SmtpClient来发送邮件,而System.Net.Mail only仅支持Explicit SSL,所以这里使用普通端口,不使用ssl端口
“EnableSsl”: false,
“SendUser”: “jiumu@jumul”,//这里配置你自己的邮箱
“SendKey”: “**********”//这里配置你的密码
},

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=MySqLite.db",
    "UserContextConnection": "Data Source=Demo.db"
  },
  "EmailSender": {
    "SmtpHost": "smtp.exmail.qq",//我这里用的是腾讯企业邮箱的发件服务器
    "SmtpPort": 25,//由于使用System.Net.Mail下的SmtpClient来发送邮件,而System.Net.Mail only仅支持Explicit SSL,所以这里使用普通端口,不使用ssl端口
    "EnableSsl": false,
    "SendUser": "jiumu@jumul",//这里配置你自己的邮箱
    "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配置邮件发送服务的内容了。如果您觉得这篇文章对您有帮助,还请不要吝啬您手里的赞。同样,如果您觉得这篇文章有误,请您指正批评,作者将感激不尽!

本文标签: 腾讯企业邮箱第二章查询系统账户