java使用自定义HTML模板发送email
VO接收参数
@Data
public class EmailVo {
@ApiModelProperty("收件人列表")
@NotNull(message = "收件人列表为空")
private List<String> tos;
@ApiModelProperty("抄送人列表")
private List<String> ccs;
@ApiModelProperty("邮件标题")
@NotNull(message = "邮件标题为空")
private String subject;
@ApiModelProperty("项目编码")
@NotNull(message = "项目编码为空")
private String projectCode;
@ApiModelProperty("模板代码")
@NotNull(message = "模板代码为空")
private String templateCode;
@ApiModelProperty("HTML模板参数")
private Map<String,Object> templateParameters;
}
该html模板应需求为数据库表动态配置,也可写死为html文件放在resource
@Slf4j
@Service("emailService")
public class EmailServiceImpl implements EmailService {
@Autowired
private JavaMailSender mailSender;
@Autowired
private HtmlTemplateDao htmlTemplateDao;
@Value("${mail.from}")
private String from;
/**
* XXXX-发送邮件统一接口
* @param emailVo
* @param request
* @return
*/
@Override
public CommonResponse sendEmails(EmailVo emailVo, HttpServletRequest request) {
if(emailVo.getTos().size() == 0){
return CommonResponse.createValidateErrorResponse();
}
String[] tos = new String[emailVo.getTos().size()];
for (int i = 0; i < emailVo.getTos().size(); i++) {
if(isEmail(emailVo.getTos().get(i))){
tos[i] = emailVo.getTos().get(i);
}
}
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(tos);
//发送抄送人
if(emailVo.getCcs() != null && emailVo.getCcs().size() != 0){
String[] ccs = new String[emailVo.getCcs().size()];
for (int i = 0; i < emailVo.getCcs().size(); i++) {
if(isEmail(emailVo.getCcs().get(i))){
ccs[i] = emailVo.getCcs().get(i);
}
}
helper.setCc(ccs);
}
helper.setSubject(emailVo.getSubject());
//查询html模板
String htmlText = null;
EntityWrapper<HtmlTemplate> wrapper = new EntityWrapper<>();
wrapper.eq("cancelsign","n")
.eq("project_code",emailVo.getProjectCode())
.eq("template_code",emailVo.getTemplateCode());
List<HtmlTemplate> htmlTemplates = htmlTemplateDao.selectList(wrapper);
if(htmlTemplates.size() > 0){
htmlText = htmlTemplates.get(0).getHtmlTemplate();
}else{
return CommonResponse.createValidateErrorResponse();
}
helper.setText(buildContent(htmlText,emailVo.getTemplateParameters()), true);
mailSender.send(message);
} catch (Exception e) {
log.error("XXXX-发送邮件失败:email={},logs={}", emailVo.toString(),e.getMessage());
return CommonResponse.createValidateErrorResponse();
}
log.info("XXXX-发送邮件成功:email={}", emailVo.toString());
return CommonResponse.createCommonResponse();
}
/**
* 获取html模板,填充html模板中的动态参数
* @param htmlText
* @param templateParameters
* @return
*/
private String buildContent(String htmlText, Map<String,Object> templateParameters){
if(!templateParameters.isEmpty() && templateParameters != null){
for (Map.Entry<String, Object> entry : templateParameters.entrySet()) {
htmlText = htmlText.replace("{"+entry.getKey()+"}", entry.getValue().toString());
}
}
//改变表格样式
htmlText = htmlText.replaceAll("<td>", "<td style=\"padding:6px 10px; line-height: 150%;\">");
htmlText = htmlText.replaceAll("<tr>", "<tr style=\"border-bottom: 1px solid #eee; color:#666;\">");
return htmlText;
}
/**
* 判断邮箱合法性
* @param string
* @return
*/
public boolean isEmail(String string) {
if (string == null)
return false;
String regEx1 = "^([a-z0-9A-Z]+[_-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern p;
Matcher m;
p = Pattern.compile(regEx1);
m = p.matcher(string);
if (m.matches())
return true;
else
return false;
}
}
html例子
<body style="color: #666; font-size: 14px; font-family: 'Open Sans',Helvetica,Arial,sans-serif;">
<div class="box-content" style="width: 80%; margin: 20px auto; max-width: 800px; min-width: 600px;">
<div class="info-top" style="padding: 15px 25px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
background: #00549f;
color: #fff;
overflow: hidden;
line-height: 32px;">
<div style="font-size: 35px;text-align: center;color:#010e07"><strong>XXIT平台</strong></div>
</div>
<div class="info-wrap" style="border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border:1px solid #ddd;
overflow: hidden;
padding: 15px 15px 20px;">
<div class="tips" style="padding:15px;">
<p style=" list-style: 160%; margin: 10px 0;">Dear {greetName},</p>
<p style=" list-style: 160%; margin: 10px 0;">{content}</p>
</div>
<div class="time" style="text-align: right; color: #999; padding: 0 15px 15px;">签名:{sign}</div>
<br>
</div>
</div>
</body>
配置文件
mail.from = ${mail_from:XXX}
spring.mail.host = ${spring_mail_host:XXX}
spring.mail.username = ${spring_mail_username:XXX}
spring.mail.password = ${spring_mail_password:XXX}
spring.mail.port= ${spring_mail_port:XXX}
spring.mail.properties.mail.smtp.auth = ${spring_mail_properties_mail_smtp_auth:false}
spring.mail.properties.mail.smtp.starttls.enable = ${spring_mail_properties_mail_smtp_starttls_enable:false}
spring.mail.properties.mail.smtp.starttls.required = ${spring_mail_properties_mail_smtp_starttls_required:false}
spring.mail.default-encoding = ${spring_mail_default-encoding:UTF-8}