配置
<!-- Thymeleaf view -->
<bean id="emailTemplateResolver" class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver" >
<property name="prefix" value ="template/email/" />
<property name="templateMode" value ="HTML5" />
<property name="characterEncoding" value ="utf-8" />
<property name = "order" value="1" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="emailTemplateResolver" />
</bean>
使用
/**
* @param resend 再次发送状态
* @param checkHastily 紧急邮件状态
* @param checkRead 回执状态
*/
public MyResult mailYard(int resend, String classId,
Yard yard, String[] ids, String[] ccemails,
String entryMode, String ps, HttpSession session, Integer checkHastily, Integer checkRead) {
MimeMessage mail = javaMailSender.createMimeMessage();
MimeMessageHelper helper;
List<AB> absO = new ArrayList<AB>();
try {
helper = new MimeMessageHelper(mail, true, "utf-8");
helper.setSubject("Container delivery pre-inform!");
helper.setFrom(javaMailSender.getUsername());
// helper.setTo(yard.getEmail1());
mail.addRecipient(RecipientType.TO, new InternetAddress(yard.getEmail1()));
if (!yard.getEmail2().trim().equals("")) {
// helper.addCc(yard.getEmail2());
mail.addRecipient(RecipientType.TO, new InternetAddress(yard.getEmail2()));
}
for (String ccemail : ccemails) {
helper.addCc(ccemail);
// mail.addRecipient(RecipientType.TO, new InternetAddress(ccemail));
}
Context ctx = new Context();
ctx.setVariable("contactPerson", yard.getContactPerson());
ctx.setVariable("entryYardMode", entryMode);
ctx.setVariable("yardNameCn", yard.getNameCn() == null ? yard.getName() : yard.getNameCn());
ctx.setVariable("yardNameEn", yard.getNameEn() == null ? yard.getName() : yard.getNameEn());
ctx.setVariable("ps", ps);
Object obj = session.getAttribute("currentUser");
User logUser = new User();
if (obj != null)
logUser = (User) obj;
ctx.setVariable("userName", logUser.getName());
ctx.setVariable("userNameEn", logUser.getNameEn());
ctx.setVariable("userEmail", logUser.getEmail());
ctx.setVariable("userTel", logUser.getTel());
List<AB> absO1 = abMapper.selectABsByReturnYardId(yard.getId(), classId);
for (AB ab : absO1) {
if (useArraysBinarySearch(ids, ab.getId())) {
absO.add(ab);
}
}
if (absO.size() > 0) {
// 因前面符号相同,按照还箱单号后面数字顺序排序 ZR20191201,ZR201912
long[] strings2 = new long[absO.size()];
List<AB> abs = new ArrayList<AB>();
for (int i = 0; i < absO.size(); i++) {
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
if (null != absO.get(i).getReturnSn() && !"".equals(absO.get(i).getReturnSn())) {
Matcher m = p.matcher(absO.get(i).getReturnSn());
strings2[i - abs.size()] = Long.valueOf(m.replaceAll("").trim());
} else {
abs.add(absO.get(i));
}
}
Arrays.sort(strings2);
for (int i = 0; i < strings2.length; i++) {
for (int j = 0; j < absO.size(); j++) {
if (absO.get(j).getReturnSn().contains(String.valueOf(strings2[i]))) {
abs.add(absO.get(j));
break;
}
}
}
ctx.setVariable("abs", abs);
} else
return new MyResult(0, "XXXXXX");
String content = templateEngine.process("XXXXXXEn.html", ctx);
helper.setText(content, true);
// 邮件图片
addInLineImages(helper);
if (checkHastily == 1) {
mail.setHeader("X-Priority", "1");
}
if (checkRead == 1) {
mail.setHeader("Disposition-Notification-To", javaMailSender.getUsername());
}
// 如果要添加附件
/*String fullFilename = "";
String shortFilename = "";
for (AB ab : absO1) {
String filename = ab.getReturnFile();
fullFilename = fileFolder + "/pdf/xxx/" + filename;
try {
shortFilename = filename.substring(0, filename.indexOf('_'))
+ "_re" + filename.substring(filename.lastIndexOf('.'));
} catch (Exception e) {
logger.error(e.getMessage());
shortFilename = filename;
}
FileSystemResource file = new FileSystemResource(fullFilename);
helper.addAttachment(shortFilename, file);
}*/
javaMailSender.send(mail);
// 更新信息状态TODO
} catch (MessagingException e) {
logger.error("发送邮件异常:" + e);
return new MyResult(0, "邮件发送失败:" + e.getLocalizedMessage());
} catch (MailAuthenticationException e) {
logger.error("发送邮件异常发送认证失败:" + e);
return new MyResult(0, "邮件发送认证失败,请检查邮件服务器设置!");
} catch (TemplateInputException e) {
logger.error("发送邮件异常模板丢失:" + e);
return new MyResult(0, "邮件模板丢失,邮件发送失败!");
} catch (TemplateProcessingException e) {
logger.error("发送邮件异常模板错误:" + e);
return new MyResult(0, "邮件模板错误,邮件发送失败!");
} catch (Exception e) {
logger.error("发送邮件异常:" + e);
return new MyResult(0, "邮件发送失败:" + e.getLocalizedMessage());
}
return new MyResult(1, "共 " + absO.size() + " 个邮件已提交邮件发送服务器!");
}
private void addInLineImages(MimeMessageHelper helper) throws MessagingException {
ClassPathResource logoImage = new ClassPathResource("template/email/imgs/logo.png");
ClassPathResource barImage = new ClassPathResource("template/email/imgs/code_bar.png");
helper.addInline("codeBar", barImage, "image/x-png");
helper.addInline("logo", logoImage, "image/x-png");
}
下面是mailRecieveYardEn.html 模板,mailRecieveYardCn.html是中文版。
这两个模板都在template/email/下
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
</head>
<body style="padding:10px;">
<!-- <img src="cid:zihLogo" style="height:68px;"/> -->
<p>Dear <b th:text="${contactPerson}" >contactPerson</b> ,</p>
<p>Good day.</p>
<p>XXXXXXXXXXXX.</p>
<p>Container details:</p>
<table >
<tr style="height:35px;background-color:plum;">
<th width="40px">#</th>
<th width="120px">CNTR.No</th>
<th width="50px">Type</th>
<th width="200px">Ref.</th>
<th width="300px">Depot</th>
</tr>
<tr th:each="ab,iterationStatus:${abs}" style="background-color:wheat;">
<td align="center" th:text="${iterationStatus.count}">1</td>
<td align="center" th:text="${ab.containerNo}">containerNo</td>
<td align="center" th:text="${ab.containerType}">containerType</td>
<td align="center" th:text="${ab.returnSn}">containerNo</td>
<td align="center" th:text="${yardNameEn}">depot</td>
</tr>
</table>
<p style="text-indent:2em;" th:text="${ps}">ps</p>
<p></p>
<p>Yours sincerely, </p>
<hr style="margin-bottom:auto auto 0px auto;"/>
<ol class="footer" style="list-style:none;font-size:12px;color:indigo;padding-left:20px;margin:0 auto 0 auto;">
<li style="list-style:none;"><img src="cid:logo"/><img src="cid:codeBar" style="height:107px;"/></li>
<li style="list-style:none;">XXXXXX<span th:text="${userNameEn}">1</span></li>
<li style="list-style:none;">Web: XXXXXX</li>
<li style="list-style:none;">Add:XXXXXX</li>
<li style="list-style:none;" th>E-mail: <span th:text="${userEmail}">1</span></li>
<li style="list-style:none;">Tel: <span th:text="${userTel}">1</span></li>
</ol>
</body>
</html>
上面使用中邮箱配置
// XXX.properties配置
#[email] 邮件
email.host=smtp.qiye.163.com
email.port=25
email.username=XXXXXX
email.password=XXXXXX
email.smtpAuth=true
email.smtpConnectiontimeout=800000000
email.smtpTimeout=800000000
// spring-mybatis.xml配置
<util:properties id="sysconfig" location="classpath:XXX.properties" />
<!--邮件发送 -->
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="#{sysconfig['email.host']}"/>
<property name="port" value="#{sysconfig['email.port']}"/>
<property name="username" value="#{sysconfig['email.username']}"/>
<property name="password" value="#{sysconfig['email.password']}"/>
<property name="javaMailProperties">
<props >
<prop key="mail.smtp.auth">#{sysconfig['email.smtpAuth']}</prop>
<prop key="mail.smtp.connectiontimeout">#{sysconfig['email.smtpConnectiontimeout']}</prop>
<prop key="mail.smtp.timeout">#{sysconfig['email.smtpTimeout']}</prop>
<!-- <prop key="sendFrom">#{sysconfig['email.username']}</prop> -->
</props>
</property>
</bean>
效果
发送收箱通知邮件,邮件截图: