基于.Net Core Web MVC的图书查询系统
- 第一章,.Net Core Web MVC配置身份验证和注册登录功能并修改默认页面
- 第二章,.Net Core Web MVC配置邮件发送服务
- 第三章,在.Net Core Web MVC中使用Sqlite数据库
- 第四章,添加模型并使用EF Core生成基架&自动生成控制器和视图
- 第五章,条件查询的设计与实现
第二章,.Net Core 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配置邮件发送服务的内容了。如果您觉得这篇文章对您有帮助,还请不要吝啬您手里的赞。同样,如果您觉得这篇文章有误,请您指正批评,作者将感激不尽!