From 9bbac291b65924b6a44d592d300db3e90c223402 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Fri, 29 May 2026 09:29:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=86=85=E5=AE=B9=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Helper/Email/SendEmailHelper.cs | 59 ++++++++++++++++++- .../MassTransit/Consumer/ImageConsumer.cs | 4 +- .../Consumer/ReadingRelationEmailConsumer.cs | 8 +-- .../Consumer/SiteSurverEmailConsumer.cs | 6 +- .../SubjectVisitQCAndCheckConsumer.cs | 14 ++--- .../Recurring/IRRecurringConsumer.cs | 2 +- .../Recurring/TrialDocumentConsumer.cs | 4 +- .../Service/Common/MailService.cs | 14 ++--- 8 files changed, 83 insertions(+), 28 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs b/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs index 8597cbf7d..832413e88 100644 --- a/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs +++ b/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs @@ -62,8 +62,15 @@ public static class SendEmailHelper } - - public static async Task SendEmailAsync(MimeMessage messageToSend, Trial trial, EventHandler? messageSentSuccess = null) + /// + /// 发送项目邮件 + /// + /// + /// + /// + /// + /// + public static async Task SendTrialEmailAsync(MimeMessage messageToSend, Trial trial, EventHandler? messageSentSuccess = null) { // 项目的需要重设 发件地址与邮件地址 @@ -78,12 +85,39 @@ public static class SendEmailHelper string result = string.Empty; result = messageToSend.MessageId; + //没有收件人 那么不发送 if (messageToSend.To.Count == 0) { return string.Empty; } + // 替换邮件标题 + if (!string.IsNullOrEmpty(messageToSend.Subject)) + { + foreach (var item in trial.TrialObjectNameList) + { + // 把标题里的占位符替换成真实名称 + messageToSend.Subject = messageToSend.Subject.Replace(item.Name, item.TrialName); + } + } + + // 构建替换字典 + var replacements = new Dictionary(); + foreach (var item in trial.TrialObjectNameList) + { + replacements[item.Name] = item.TrialName; + } + + // 安全替换 HTML + ReplaceHtmlContent(messageToSend.Body, replacements); + + + + + + + try { using (var smtp = new MailKit.Net.Smtp.SmtpClient()) @@ -128,6 +162,27 @@ public static class SendEmailHelper return result; } + + + // 遍历邮件体,找到 HTML 部分并替换 + public static void ReplaceHtmlContent(MimeEntity entity, Dictionary replacements) + { + if (entity is Multipart multipart) + { + foreach (var part in multipart) + { + ReplaceHtmlContent(part, replacements); + } + } + else if (entity is TextPart textPart && textPart.ContentType.MediaType == "text/html") + { + // 只有这里才是真正的 HTML + foreach (var kv in replacements) + { + textPart.Text = textPart.Text.Replace(kv.Key, kv.Value); + } + } + } public static async Task TestEmailConfigAsync(SystemEmailSendConfig _systemEmailConfig) { using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5))) diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs index 832e6b638..477f9dcc5 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs @@ -397,7 +397,7 @@ public class ImageConsumer( await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(inDto.EmailNoticeConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } @@ -547,7 +547,7 @@ public class ImageConsumer( await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailNoticeConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } } diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs index f620b1f11..ceb6ff525 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs @@ -130,7 +130,7 @@ public class UrgentMedicalReviewAddedEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -240,7 +240,7 @@ public class UrgentIRRepliedMedicalReviewConsumer( }; await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } @@ -360,7 +360,7 @@ public class UrgentMIMRepliedMedicalReviewConsumer( }; await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } } @@ -484,7 +484,7 @@ public class UrgentIRApplyedReReadingConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs index 0a4a7eb4f..24d2d98a1 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs @@ -134,7 +134,7 @@ public class UserSiteSurveySubmitedEventConsumer( await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } @@ -227,7 +227,7 @@ public class SiteSurveySPMSubmitedEventConsumer( await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -357,7 +357,7 @@ public class SiteSurverRejectedEventConsumer( await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs index 2daf610d3..52f7fae9c 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs @@ -128,7 +128,7 @@ public class CRCSubmitedAndQCToAuditEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -235,7 +235,7 @@ public class CRCRepliedQCChallengeEventConsumer( }; await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } } @@ -360,7 +360,7 @@ public class QCRepliedQCChallengeEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -472,7 +472,7 @@ public class CRCRepliedCheckChallengeEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -607,7 +607,7 @@ public class PMRepliedCheckChallengeEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } @@ -715,7 +715,7 @@ public class CheckStateChangedToAuditEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } @@ -833,7 +833,7 @@ public class QCClaimTaskEventConsumer( await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } } } diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs index 7c62558c1..984472b8b 100644 --- a/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs @@ -173,7 +173,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); //处理标记已通知的任务 diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/TrialDocumentConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/TrialDocumentConsumer.cs index 57e78cd53..bc017b2e4 100644 --- a/IRaCIS.Core.Application/MassTransit/Recurring/TrialDocumentConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Recurring/TrialDocumentConsumer.cs @@ -167,7 +167,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring }; await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailConfig, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } catch (Exception) @@ -341,7 +341,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring continue; } - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); msg += "发送成功"; } diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index 2e64e5721..50a32982a 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -334,7 +334,7 @@ namespace IRaCIS.Core.Application.Service var sucessHandle = GetEmailSuccessHandle(Guid.Empty, verificationCode, emailAddress); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo, sucessHandle); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo, sucessHandle); } @@ -578,7 +578,7 @@ namespace IRaCIS.Core.Application.Service await GetEmailSubejctAndHtmlInfoAndBuildAsync(sysUserInfo.IsFirstAdd ? EmailBusinessScenario.SiteUseOrExternalUserFirstrJoinTrial : EmailBusinessScenario.SiteUserOrExternalUserExistJoinTrial, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -639,7 +639,7 @@ namespace IRaCIS.Core.Application.Service await GetEmailSubejctAndHtmlInfoAndBuildAsync(sysUserInfo.IsFirstAdd ? EmailBusinessScenario.SiteUseOrExternalUserFirstrJoinTrial : EmailBusinessScenario.SiteUserOrExternalUserExistJoinTrial, messageToSend, emailConfigFunc, workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } @@ -779,7 +779,7 @@ namespace IRaCIS.Core.Application.Service await GetEmailSubejctAndHtmlInfoAndBuildAsync(sysUserInfo.IsFirstAdd ? EmailBusinessScenario.DoctorUserFirstJoinTrial : EmailBusinessScenario.DoctorUserExistJoinTrial, messageToSend, emailConfigFunc,workLanguage); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo, null); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo, null); //创建账号 和创建角色 一条,更新的时候才记录更新角色 if (isNeedCreateNewUser == false) @@ -951,7 +951,7 @@ namespace IRaCIS.Core.Application.Service } else { - await SendEmailHelper.SendEmailAsync(messageToSend, trialinfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialinfo); } @@ -1031,7 +1031,7 @@ namespace IRaCIS.Core.Application.Service await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.SiteSurvey_CheckUser, messageToSend, emailConfigFunc); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } public async Task SiteSuervyUpdateUser(Guid trialSiteId, string email, string name, string url) @@ -1073,7 +1073,7 @@ namespace IRaCIS.Core.Application.Service await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.SiteSurvey_UpdateUser, messageToSend, emailConfigFunc); - await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + await SendEmailHelper.SendTrialEmailAsync(messageToSend, trialInfo); } }