using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using MailKit; using MimeKit; using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; using System.Text; using System.Threading.Tasks; namespace IRaCIS.Core.Application.Service { public interface IEmailSendService { } public class EmailSendService : BaseService { private readonly IRepository _trialEmailNoticeConfigRepository; private readonly IRepository _emailNoticeConfigRepository; public EmailSendService(IRepository trialEmailNoticeConfigRepository, IRepository emailNoticeConfigRepository) { _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository; _emailNoticeConfigRepository = emailNoticeConfigRepository; } public async Task SendTrialEmail(Guid trialId, CommonDocumentBusinessScenario businessScenario, Func topicAndHtmlFunc, Guid? trialReadingCriterionId, Guid? subjectId) { //找到配置 var trialEmailConfig = await _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.BusinessScenarioEnum == businessScenario, ignoreQueryFilters: true) .Include(t => t.TrialEmailNoticeUserList).Include(t => t.TrialEmailBlackUserList).FirstOrDefaultAsync(); if (trialEmailConfig == null || trialEmailConfig.IsAutoSend == false) { return; } else { var sendEmailConfig = new SMTPEmailConfig(); var (topicStr, htmlBodyStr) = topicAndHtmlFunc(trialEmailConfig); sendEmailConfig.TopicDescription = topicStr; sendEmailConfig.HtmlBodyStr = htmlBodyStr; var blackUserIdList = trialEmailConfig.TrialEmailBlackUserList.Select(t => t.UserId).ToList(); //收件人 如果是CRC CRA 要按照中心发送 var toUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(c => c.UserType).ToList(); var copyUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(c => c.UserType).ToList(); var allUserTypeEnumList = toUserTypeEnumList.Union(copyUserTypeEnumList).Distinct().ToList(); var allUserList = await _repository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.UserId, t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToListAsync(); var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum)) .ToList(); if (subjectId != null) { toUserList = _repository.Where(t => t.TrialId == trialId && toUserTypeEnumList.Contains(t.User.UserTypeEnum) && t.TrialSite.SubjectList.Any(c => c.Id == subjectId)).Select(t => new { t.UserId, t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToList(); } //去除黑名单 toUserList = toUserList.Where(t => !blackUserIdList.Contains(t.UserId)).ToList(); var copyUserList = allUserList.Where(t => copyUserTypeEnumList.Contains(t.UserTypeEnum)).Where(t => !blackUserIdList.Contains(t.UserId)).ToList(); if (toUserList.Count() == 0) { //---没有收件人,无法发送邮件 throw new BusinessValidationFailedException(_localizer["TrialEmailN_NoRecipient"]); } if (trialEmailConfig.FromEmail.Contains("@") && !string.IsNullOrEmpty(trialEmailConfig.FromEmail)) { sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(trialEmailConfig.FromName, trialEmailConfig.FromEmail); sendEmailConfig.AuthorizationCode = trialEmailConfig.AuthorizationCode; sendEmailConfig.UserName = trialEmailConfig.FromEmail; sendEmailConfig.Host = trialEmailConfig.SMTPServerAddress; sendEmailConfig.Port = trialEmailConfig.SMTPServerPort; } else { //---项目发件邮箱配置有误,请核实 throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidEmailConfig"]); } foreach (var item in toUserList) { if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail)) { sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail)); } } foreach (var item in copyUserList) { if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail)) { sendEmailConfig.CopyToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail)); } } await SendEmailHelper.SendEmailAsync(sendEmailConfig); } } } }