Commit f7bb6554 by zhangxingmin

邮件发送

parent 527f11e7
...@@ -9,6 +9,7 @@ import com.yd.email.api.service.ApiEmailService; ...@@ -9,6 +9,7 @@ import com.yd.email.api.service.ApiEmailService;
import com.yd.email.feign.dto.ApiEmailSenderConfigDto; import com.yd.email.feign.dto.ApiEmailSenderConfigDto;
import com.yd.email.feign.dto.ApiSendMailDto; import com.yd.email.feign.dto.ApiSendMailDto;
import com.yd.email.feign.enums.EmailTaskStatusEnum; import com.yd.email.feign.enums.EmailTaskStatusEnum;
import com.yd.email.feign.utils.StringUtil;
import com.yd.email.service.model.EmailTask; import com.yd.email.service.model.EmailTask;
import com.yd.email.service.model.EmailTaskRecipients; import com.yd.email.service.model.EmailTaskRecipients;
import com.yd.email.service.service.IEmailTaskRecipientsService; import com.yd.email.service.service.IEmailTaskRecipientsService;
...@@ -101,7 +102,12 @@ public class EmailSendJobHandler { ...@@ -101,7 +102,12 @@ public class EmailSendJobHandler {
apiSendMailDto.setReceiveEmail(recipient.getReceiveEmail()); apiSendMailDto.setReceiveEmail(recipient.getReceiveEmail());
//抄送人邮箱列表 //抄送人邮箱列表
apiSendMailDto.setCcEmailList(ccEmailList); apiSendMailDto.setCcEmailList(ccEmailList);
//邮件内容
if (StringUtil.hasPlaceholdersSimple(apiSendMailDto.getContent())) {
//检测内容是否有占位符,有占位符就替换具体内容,每收件人的占位符内容是不一样的。
apiSendMailDto.setContent(StringUtil.replacePlaceholders(apiSendMailDto.getContent(),
recipient.getVariables()));
}
// 调用邮件服务发送邮件 // 调用邮件服务发送邮件
apiEmailService.sendMail(apiSendMailDto); apiEmailService.sendMail(apiSendMailDto);
......
package com.yd.email.api.service; package com.yd.email.api.service;
import com.yd.common.result.Result;
import com.yd.email.service.model.EmailTaskRecipients;
import java.util.List;
public interface ApiEmailTaskRecipientsService { public interface ApiEmailTaskRecipientsService {
Result<List<EmailTaskRecipients>> saveEmailTaskRecipientsBySessionId(String taskBizId, String status,
String sessionId, Integer source);
} }
...@@ -6,15 +6,13 @@ import com.yd.common.exception.BusinessException; ...@@ -6,15 +6,13 @@ import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.common.utils.DateUtil; import com.yd.common.utils.DateUtil;
import com.yd.common.utils.RandomStringGenerator; import com.yd.common.utils.RandomStringGenerator;
import com.yd.email.api.service.ApiEmailSendService; import com.yd.email.api.service.*;
import com.yd.email.api.service.ApiEmailSenderConfigService;
import com.yd.email.api.service.ApiEmailService;
import com.yd.email.api.service.XxlJobService;
import com.yd.email.feign.dto.ApiEmailSenderConfigDto; import com.yd.email.feign.dto.ApiEmailSenderConfigDto;
import com.yd.email.feign.dto.ApiSendMailDto; import com.yd.email.feign.dto.ApiSendMailDto;
import com.yd.email.feign.enums.EmailTaskStatusEnum; import com.yd.email.feign.enums.EmailTaskStatusEnum;
import com.yd.email.feign.request.ApiSendEmailRequest; import com.yd.email.feign.request.ApiSendEmailRequest;
import com.yd.email.feign.response.ApiSendEmailResponse; import com.yd.email.feign.response.ApiSendEmailResponse;
import com.yd.email.feign.utils.StringUtil;
import com.yd.email.service.model.EmailTask; import com.yd.email.service.model.EmailTask;
import com.yd.email.service.model.EmailTaskRecipients; import com.yd.email.service.model.EmailTaskRecipients;
import com.yd.email.service.service.IEmailTaskRecipientsService; import com.yd.email.service.service.IEmailTaskRecipientsService;
...@@ -24,13 +22,11 @@ import org.apache.commons.lang3.StringUtils; ...@@ -24,13 +22,11 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* 邮件发送实现类 * 邮件发送实现类
...@@ -54,6 +50,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService { ...@@ -54,6 +50,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
@Autowired @Autowired
private ApiEmailService apiEmailService; private ApiEmailService apiEmailService;
@Autowired
private ApiEmailTaskRecipientsService apiEmailTaskRecipientsService;
/** /**
* 发送邮件 * 发送邮件
* @param request * @param request
...@@ -87,31 +86,21 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService { ...@@ -87,31 +86,21 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
//变量分组唯一业务ID //变量分组唯一业务ID
mailTask.setVariableGroupBizId(request.getVariableGroupBizId()); mailTask.setVariableGroupBizId(request.getVariableGroupBizId());
//邮件内容的填充的变量字段(数组分号分隔,英文字段名) //邮件内容的填充的变量字段(数组分号分隔,英文字段名)
mailTask.setFillVariable(!CollectionUtils.isEmpty(request.getFillVariableList()) ? String.join(";") : ""); // mailTask.setFillVariable(!CollectionUtils.isEmpty(request.getFillVariableList()) ? String.join(";") : "");
//导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值) //导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值)
mailTask.setSessionId(request.getSessionId()); mailTask.setSessionId(request.getSessionId());
iEmailTaskService.saveOrUpdate(mailTask); iEmailTaskService.saveOrUpdate(mailTask);
//邮件任务唯一业务ID //邮件任务唯一业务ID
String taskBizId = mailTask.getTaskBizId(); String taskBizId = mailTask.getTaskBizId();
//变量分组唯一业务ID不为空,来源是1-excel导入联系人 为空是0-选择联系人导入
Integer source = StringUtils.isNotBlank(request.getVariableGroupBizId()) ? 1 : 0;
// 保存收件人信息 // 保存收件人信息
List<EmailTaskRecipients> recipientsList = new ArrayList<>(); //根据当前当前会话id和数据来源查询导入数据,保存到邮件任务收件人关联表中,供后续使用
if (!CollectionUtils.isEmpty(request.getRecipientsDtoList())) { Result<List<EmailTaskRecipients>> result = apiEmailTaskRecipientsService
recipientsList = request.getRecipientsDtoList() .saveEmailTaskRecipientsBySessionId(taskBizId,taskStatus,request.getSessionId(),source);
.stream().map(dto -> { List<EmailTaskRecipients> recipientsList = result.getData();
EmailTaskRecipients mailRecipient = new EmailTaskRecipients();
//邮件任务唯一业务ID
mailRecipient.setTaskBizId(taskBizId);
mailRecipient.setStatus(taskStatus);
mailRecipient.setContactBizId(dto.getContactBizId());
mailRecipient.setReceiveEmail(dto.getReceiveEmail());
//抄送人邮箱(多个用分号分隔)
mailRecipient.setCcEmail(!CollectionUtils.isEmpty(dto.getCcEmailList()) ? String.join(";",dto.getCcEmailList()) : "");
return mailRecipient;
}).collect(Collectors.toList());
iEmailTaskRecipientsService.saveOrUpdateBatch(recipientsList);
}
//计划发送时间(为空表示立即发送,不为空表示定时发送) //计划发送时间(为空表示立即发送,不为空表示定时发送)
String jobId = ""; String jobId = "";
...@@ -167,7 +156,12 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService { ...@@ -167,7 +156,12 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
apiSendMailDto.setReceiveEmail(recipient.getReceiveEmail()); apiSendMailDto.setReceiveEmail(recipient.getReceiveEmail());
//抄送人邮箱列表 //抄送人邮箱列表
apiSendMailDto.setCcEmailList(ccEmailList); apiSendMailDto.setCcEmailList(ccEmailList);
//邮件内容
if (StringUtil.hasPlaceholdersSimple(apiSendMailDto.getContent())) {
//检测内容是否有占位符,有占位符就替换具体内容,每收件人的占位符内容是不一样的。
apiSendMailDto.setContent(StringUtil.replacePlaceholders(apiSendMailDto.getContent(),
recipient.getVariables()));
}
// 调用邮件服务发送邮件 // 调用邮件服务发送邮件
apiEmailService.sendMail(apiSendMailDto); apiEmailService.sendMail(apiSendMailDto);
......
...@@ -12,7 +12,7 @@ import org.springframework.beans.BeanUtils; ...@@ -12,7 +12,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -37,6 +37,7 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients ...@@ -37,6 +37,7 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients
* @param source 数据的来源 0-选择联系人导入 1-excel导入联系人 * @param source 数据的来源 0-选择联系人导入 1-excel导入联系人
* @return * @return
*/ */
@Override
public Result<List<EmailTaskRecipients>> saveEmailTaskRecipientsBySessionId(String taskBizId,String status, public Result<List<EmailTaskRecipients>> saveEmailTaskRecipientsBySessionId(String taskBizId,String status,
String sessionId,Integer source) { String sessionId,Integer source) {
//根据当前当前会话id和数据来源查询的导入数据 //根据当前当前会话id和数据来源查询的导入数据
...@@ -45,9 +46,10 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients ...@@ -45,9 +46,10 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients
.sessionId(sessionId) .sessionId(sessionId)
.source(source) .source(source)
.build()); .build());
List<EmailTaskRecipients> saveRecipientsList = new ArrayList<>();
if (!CollectionUtils.isEmpty(emailContactImportList)) { if (!CollectionUtils.isEmpty(emailContactImportList)) {
//不为空,保存到邮件任务收件人关联表中 //不为空,保存到邮件任务收件人关联表中
List<EmailTaskRecipients> saveRecipientsList = emailContactImportList saveRecipientsList = emailContactImportList
.stream() .stream()
.map(dto -> { .map(dto -> {
EmailTaskRecipients recipient = new EmailTaskRecipients(); EmailTaskRecipients recipient = new EmailTaskRecipients();
...@@ -60,6 +62,6 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients ...@@ -60,6 +62,6 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients
iEmailTaskRecipientsService.saveOrUpdateBatch(saveRecipientsList); iEmailTaskRecipientsService.saveOrUpdateBatch(saveRecipientsList);
} }
return Result.success(); return Result.success(saveRecipientsList);
} }
} }
...@@ -42,10 +42,10 @@ public class ApiSendEmailRequest { ...@@ -42,10 +42,10 @@ public class ApiSendEmailRequest {
*/ */
private String attachmentPath; private String attachmentPath;
/** // /**
* 收件人列表信息 // * 收件人列表信息
*/ // */
private List<ApiEmailTaskRecipientsDto> recipientsDtoList; // private List<ApiEmailTaskRecipientsDto> recipientsDtoList;
//===========以下是附加传入字段============= //===========以下是附加传入字段=============
/** /**
...@@ -54,13 +54,13 @@ public class ApiSendEmailRequest { ...@@ -54,13 +54,13 @@ public class ApiSendEmailRequest {
private String variableGroupBizId; private String variableGroupBizId;
/** /**
* 导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值) * 导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值,用于发送到哪些收件人的,查询导入临时表的依据
*/ */
private String sessionId; private String sessionId;
/** // /**
* 邮件内容的填充的变量字段(数组,英文字段名) // * 邮件内容的填充的变量字段(数组,英文字段名)
*/ // */
private List<String> fillVariableList; // private List<String> fillVariableList;
} }
package com.yd.email.feign.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class StringUtil {
/**
* 替换邮件模板内容的变量占位符
* @param content 例:”{{name}} 你好,很高兴认识你。你今年{{age}}岁是吧“
* @param variables 变量和收件人数据json串(导入变量excel时插入)
* [{cn_key: 中文变量字段名,en_key: 英文变量字段名,content: 占位符内容}]
* 例:[{cn_key: '姓名',en_key: ’name‘,content: '张山'},{cn_key: '年龄',en_key: ’age‘,content: '28'}]
* @return
*/
public static String replacePlaceholders(String content, String variables) {
// 解析 JSON 字符串
JSONArray variablesArray = JSON.parseArray(variables);
String result = content;
// 遍历变量数组,逐个替换占位符
for (int i = 0; i < variablesArray.size(); i++) {
JSONObject variable = variablesArray.getJSONObject(i);
String enKey = variable.getString("en_key");
String value = variable.getString("content");
// 替换 {{en_key}} 为对应的值
result = result.replace("{{" + enKey + "}}", value);
}
return result;
}
/**
* 检测内容是否有占位符
* @param content
* @return
*/
public static boolean hasPlaceholders(String content) {
if (content == null) {
return false;
}
// 匹配 {{任意内容}} 的模式
String pattern = "\\{\\{[^}]*\\}\\}";
return content.matches(".*" + pattern + ".*");
}
/**
* 更严格的版本,要求{{}}之间有内容
* @param content
* @return
*/
public static boolean hasValidPlaceholders(String content) {
if (content == null) {
return false;
}
String pattern = "\\{\\{\\w+\\}\\}"; // 只匹配字母数字下划线
return content.matches(".*" + pattern + ".*");
}
public static boolean hasPlaceholdersSimple(String content) {
if (content == null) {
return false;
}
return content.contains("{{") && content.contains("}}");
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment