using IRaCIS.Core.Domain.Share; using MimeKit; using IRaCIS.Core.Application.Helper; using MailKit; using Microsoft.AspNetCore.Hosting; using IRaCIS.Core.Application.Auth; using AutoMapper; using IRaCIS.Application.Contracts; namespace IRaCIS.Application.Services { public interface IMailVerificationService { Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode); Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode); Task AnolymousSendEmailForResetAccount(string emailAddress, int verificationCode); Task AddUserSendEmailAsync(Guid userId, string routeUrl); Task AdminResetPwdSendEmailAsync(Guid userId); Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl); Task ExternalUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl); } public class MailVerificationService : IMailVerificationService { private readonly IRepository _verificationCodeRepository; private readonly IRepository _systemBasicDatarepository; private readonly IWebHostEnvironment _hostEnvironment; private readonly IRepository _userRepository; private readonly ITokenService _tokenService; private readonly IMapper _mapper; private readonly IRepository _trialRepository; public MailVerificationService(IRepository verificationCodeRepository, IRepository systemBasicDatarepository, IWebHostEnvironment hostEnvironment, IRepository userRepository, ITokenService tokenService, IRepository trialRepository, IMapper mapper) { _verificationCodeRepository = verificationCodeRepository; _systemBasicDatarepository = systemBasicDatarepository; _hostEnvironment = hostEnvironment; _mapper = mapper; _tokenService = tokenService; _userRepository = userRepository; _trialRepository = trialRepository; } //重置邮箱 public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(userName, emailAddress)); //主题 messageToSend.Subject = "[来自展影IRC] 关于重置邮箱的提醒"; var builder = new BodyBuilder(); var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + "UserOptCommon.html"; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); builder.HtmlBody = string.Format(templateInfo, $" 尊敬的 {userName} , ", "您正在进行邮箱重置操作", verificationCode ); } messageToSend.Body = builder.ToMessageBody(); EventHandler sucessHandle = (sender, args) => { // args.Response var code = verificationCode.ToString(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = 0, HasSend = true, Code = code, UserId = userId, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _ = _verificationCodeRepository.SaveChangesAsync().Result; }; await SendEmailHelper.SendEmailAsync(messageToSend, sucessHandle); } //不登录 通过邮箱重置密码 public async Task AnolymousSendEmailForResetAccount(string emailAddress, int verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); //主题 messageToSend.Subject = "[来自展影IRC] 关于重置密码的提醒"; var builder = new BodyBuilder(); var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + "UserOptCommon.html"; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); builder.HtmlBody = string.Format(templateInfo, "", "您正在进行邮箱重置密码操作", verificationCode ); } messageToSend.Body = builder.ToMessageBody(); EventHandler sucessHandle = (sender, args) => { var code = verificationCode.ToString(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = Core.Domain.Share.VerifyType.Email, HasSend = true, Code = code, UserId = Guid.Empty,//此时不知道用户 EmailOrPhone = emailAddress, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _ = _verificationCodeRepository.SaveChangesAsync().Result; }; await SendEmailHelper.SendEmailAsync(messageToSend, sucessHandle); } //中心调研 登陆 public async Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode) { var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); //主题 messageToSend.Subject = $"[来自展影IRC] [{researchProgramNo}] 关于中心调研的提醒"; var builder = new BodyBuilder(); var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + "UserOptCommon.html"; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); builder.HtmlBody = string.Format(templateInfo, "", "您正在参与展影医疗IRC项目中心调研工作", verificationCode ); } messageToSend.Body = builder.ToMessageBody(); EventHandler sucessHandle = (sender, args) => { // args.Response var code = verificationCode.ToString(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = VerifyType.Email, HasSend = true, Code = code, UserId = Guid.Empty,//此时不知道用户 EmailOrPhone = emailAddress, ExpirationTime = DateTime.Now.AddMinutes(3) }).Result; _ = _verificationCodeRepository.SaveChangesAsync().Result; }; await SendEmailHelper.SendEmailAsync(messageToSend, sucessHandle); } //添加用户发送邮件 public async Task AddUserSendEmailAsync(Guid userId, string routeUrl) { var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException(); var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail)); //主题 messageToSend.Subject = "[来自展影IRC] 关于创建账户的提醒"; var builder = new BodyBuilder(); var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + "AdminAddUser.html"; var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map(sysUserInfo))); await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); builder.HtmlBody = string.Format(templateInfo, sysUserInfo.FullName, sysUserInfo.UserName, sysUserInfo.UserTypeRole.UserTypeShortName, routeUrl ); } messageToSend.Body = builder.ToMessageBody(); await SendEmailHelper.SendEmailAsync(messageToSend); } //管理员重置密码发送邮件 public async Task AdminResetPwdSendEmailAsync(Guid userId) { var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException(); var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail)); //主题 messageToSend.Subject = "[来自展影IRC] 关于重置账户密码的提醒"; var builder = new BodyBuilder(); var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + "AdminResetUser.html"; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); builder.HtmlBody = string.Format(templateInfo, sysUserInfo.FullName, sysUserInfo.UserName, sysUserInfo.UserTypeRole.UserTypeShortName, StaticData.DefaultPassword ); } messageToSend.Body = builder.ToMessageBody(); await SendEmailHelper.SendEmailAsync(messageToSend); } public async Task SiteSurveyUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl) { var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).FirstOrDefaultAsync()).IfNullThrowException(); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId); var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail)); //主题 messageToSend.Subject = $"[来自展影IRC] [{ trialInfo.ResearchProgramNo}]邀请信"; var builder = new BodyBuilder(); var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map(sysUserInfo))); if (sysUserInfo.IsFirstAdd) { await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); } var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + (sysUserInfo.IsFirstAdd ? "TrialUserFirstJoin.html" : "TrialUserExistJoin.html"); using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token; builder.HtmlBody = string.Format(templateInfo, sysUserInfo.FullName, trialInfo.ExperimentName, trialInfo.ResearchProgramNo, trialInfo.TrialCode, sysUserInfo.UserName, sysUserInfo.UserTypeRole.UserTypeShortName, sysUserInfo.IsFirstAdd ? routeUrl : baseUrl ); } messageToSend.Body = builder.ToMessageBody(); await SendEmailHelper.SendEmailAsync(messageToSend, null); } public async Task ExternalUserJoinEmail(Guid trialId, Guid userId, string baseUrl, string rootUrl) { var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId)).IfNullThrowException(); var sysUserInfo = (await _userRepository.Where(t => t.Id == userId).Include(t => t.UserTypeRole).FirstOrDefaultAsync()).IfNullThrowException(); var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com")); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, sysUserInfo.EMail)); //主题 messageToSend.Subject = $"[来自展影IRC] [{ trialInfo.ResearchProgramNo}]邀请信"; var builder = new BodyBuilder(); var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map(sysUserInfo))); if (sysUserInfo.IsFirstAdd) { await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); } var pathToFile = _hostEnvironment.WebRootPath + Path.DirectorySeparatorChar.ToString() + "EmailTemplate" + Path.DirectorySeparatorChar.ToString() + (sysUserInfo.IsFirstAdd ? "TrialUserFirstJoin.html" : "TrialUserExistJoin.html"); using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { var templateInfo = SourceReader.ReadToEnd(); var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&access_token=" + token; builder.HtmlBody = string.Format(templateInfo, sysUserInfo.FullName, trialInfo.ExperimentName, trialInfo.ResearchProgramNo, trialInfo.TrialCode, sysUserInfo.UserName, sysUserInfo.UserTypeRole.UserTypeShortName, sysUserInfo.IsFirstAdd ? routeUrl : baseUrl ); } messageToSend.Body = builder.ToMessageBody(); await SendEmailHelper.SendEmailAsync(messageToSend, null); } } }