下面是一个使用过的Freemarker的模板,可以作为参考(代码不完整)。附件就是它的源文件。
dmap-alarm-template-mail.ftl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>报警邮件</title> <style> *{ font-size: 12px; } .mailTitle{ text-align: center; margin-top: 25px; } .mailBody{ margin: 25 25 25 25; } .mailTitleTaskName{ font-size: 16px; color: red; font-weight: bolder; } .mailTitleErrorMessage{ font-size: 16px; color: red; font-weight: bolder; } table{margin-left:25px; margin-top:10px; width:95%; border:1px blue solid;} td{ border:1px solid #cccccc;padding:5px 5px 5px 5px;} caption{ background-color: rgb(95,175,17); font-weight: bold; padding-top: 5px; padding-bottom:5px; } .copyRight{text-align: center;font-size: 14px; font-weight:bold;color: silver;margin-top:10px;margin-bottom:25px;} .firstRow{text-align: center;font-size: 14px;font-weight:bold;} .run_other_state{color: blue;font-weight:bold;} .run_wait_running{color: silver;font-weight:bold;} .run_success{color: green;font-weight:bold;} .run_failure{color: red;font-weight:bold;} .current_first_column{width:30%;font-weight:bold;} </style> </head> <body> <div class="mailTitle"> <div class="mailTitleTaskName">任务ID:${current_task_id}</div> <div>数据版本:${current_dataversion_no}</div> <div class="mailTitleErrorMessage">${current_task_error_message}</div> </div> <div class="mailBody"> <table> <caption>任务信息</caption> <tr> <td class="current_first_column">任务ID</td> <td>${current_task_id}</td> </tr> <tr> <td class="current_first_column">任务名称</td> <td>${current_task_name}</td> </tr> <tr> <td class="current_first_column">数据版本最后更新时间</td> <td>${current_dataversion_last_mofied}</td> </tr> <tr> <td class="current_first_column">所属团队</td> <td>${current_task_team_name}</td> </tr> <tr> <td class="current_first_column">任务启动延迟时间点</td> <td>${current_launched_timeout}</td> </tr> <tr> <td class="current_first_column">运行超时时间</td> <td>${current_running_timeout}分钟</td> </tr> <tr> <td class="current_first_column">版本运行信息</td> <td> <textarea rows="5" style="width:100%;text-align:left;">${current_data_version_message!""}</textarea> </td> </tr> <tr> <td class="current_first_column">第一值班人</td> <#if current_task_duty_first??> <td>${current_task_duty_first.name}(${current_task_duty_first.username},手机号码:${(current_task_duty_first.mobileNumber)!"无"},邮箱:<a href="mailto:${current_task_duty_first.email}">${current_task_duty_first.email}</a>)</td> <#else> <td>无</td> </#if> </tr> <tr> <td class="current_first_column">第二值班人</td> <#if current_task_duty_second??> <td>${current_task_duty_second.name}(${current_task_duty_second.username},手机号码:${(current_task_duty_first.mobileNumber)!"无"},邮箱:<a href="mailto:${current_task_duty_second.email}">${current_task_duty_second.email}</a>)</td> <#else> <td>无</td> </#if> </tr> <tr> <td class="current_first_column">直接下游任务数量(DOWN)</td> <td>${current_task_down_stream_count}</td> </tr> </table> <#if down_stream_effect_map?exists> <#assign rowIndex = 0> <#assign mapsize = down_stream_effect_map?size> <#if (mapsize>0)> <table style="text-align: center;"> <caption>当前任务的直接下游任务列表</caption> <tr class="firstRow"> <td>#</td> <td>任务类型</td> <td>任务ID</td> <td>任务名称</td> <td>数据版本</td> <td>所属团队</td> <td>第一值班人</td> <td>第二值班人</td> </tr> <#list down_stream_effect_map?keys as key> <#assign ls = down_stream_effect_map[key]> <#assign rowspan = ls?size> <#list ls as object> <#assign rowIndex = rowIndex + 1> <tr> <td>${rowIndex}</td> <#if object_index == 0> <td rowspan="${rowspan}">下游任务</td> <td rowspan="${rowspan}">${object.taskIdString}</td> <td rowspan="${rowspan}">${object.taskName}</td> </#if> <td>${object.dataVersionNo}</td> <#if object_index == 0> <td rowspan="${rowspan}">${object.teamName}</td> <#if object.firstUser??> <td rowspan="${rowspan}">${object.firstUser.name}(${object.firstUser.username},手机号码:${(object.firstUser.mobileNumber)!"无"},邮箱:<a href="mailto:${object.firstUser.email}">${object.firstUser.email}</a>)</td> <#else> <td rowspan="${rowspan}">无</td> </#if> <#if object.secondUser??> <td rowspan="${rowspan}">${object.secondUser.name}(${object.secondUser.username},手机号码:${(object.secondUser.mobileNumber)!"无"},邮箱:<a href="mailto:${object.secondUser.email}">${object.secondUser.email}</a>)</td> <#else> <td rowspan="${rowspan}">无</td> </#if> </#if> </tr> </#list> </#list> </table> </#if> </#if> <div class="copyRight">@Copyright: 运营产品研发部-CDC[2014.11-${current_year_month}]</div> </div> </body> </html>
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import freemarker.template.Template; import java.util.Map; public class TemplateEmailService { private FreeMarkerConfigurer freeMarkerConfigurer; private String fileName; public FreeMarkerConfigurer getFreeMarkerConfigurer() { return freeMarkerConfigurer; } // 通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。 public <K, V> String getMailText(Map<K, V> map) { String htmlText = ""; try { // 通过指定模板名获取FreeMarker模板实例 Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate( fileName); // FreeMarker通过Map传递动态数据 // 解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。 htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map); } catch (Exception e) { e.printStackTrace(); } return htmlText; } public void setFreeMarkerConfigurer( FreeMarkerConfigurer freeMarkerConfigurer) { this.freeMarkerConfigurer = freeMarkerConfigurer; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:p="http://www.springframework.org/schema/p" xmlns:sec="http://www.springframework.org/schema/security" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="classpath:org/kanpiaoxue/test/freemarker" /><!--指定模板文件目录 --> <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性 --> <props> <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒 --> <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 --> <prop key="locale">zh_CN</prop><!-- 本地化设置 --> </props> </property> </bean> <bean id="templateEmail" class="org.kanpiaoxue.test.freemarker.TemplateEmailService"> <property name="freeMarkerConfigurer" ref="freeMarker"></property> </bean> </beans>
main 函数的部分代码:
private static final String CURRENT_TASK_ID = "current_task_id"; private static final String CURRENT_TASK_NAME = "current_task_name"; private static final String CURRENT_TASK_TEAM_NAME = "current_task_team_name"; private static final String CURRENT_TASK_ERROR_MESSAGE = "current_task_error_message"; private static final String CURRENT_TASK_DUTY_FIRST = "current_task_duty_first"; private static final String CURRENT_TASK_DUTY_SECOND = "current_task_duty_second"; private static final String CURRENT_TASK_DOWN_STREAM_COUNT = "current_task_down_stream_count"; private static final String CURRENT_DATAVERSION_NO = "current_dataversion_no"; private static final String CURRENT_DATAVERSION_LAST_MOFIED = "current_dataversion_last_mofied"; private static final String CURRENT_LAUNCHED_TIMEOUT = "current_launched_timeout"; private static final String CURRENT_RUNNING_TIMEOUT = "current_running_timeout"; private static final String DOWN_STREAM_EFFECT_MAP = "down_stream_effect_map"; private static final String CURRENT_YEAR_MONTH = "current_year_month"; private static final String CURRENT_DATA_VERSION_MESSAGE = "current_data_version_message"; String message = "当前任务运行失败,是由于执行脚本错误:echo 'hello' ,exist code: 1"; Map<String, Object> map = Maps.newHashMap(); map.put(CURRENT_TASK_ID, taskId); map.put(CURRENT_TASK_NAME, taskName); map.put(CURRENT_TASK_TEAM_NAME, teamName); map.put(CURRENT_TASK_ERROR_MESSAGE, title); map.put(CURRENT_DATAVERSION_NO, dataVersion); map.put(CURRENT_DATAVERSION_LAST_MOFIED, lastModifiedTime); map.put(CURRENT_TASK_DUTY_FIRST, firstDutyDetail); map.put(CURRENT_TASK_DUTY_SECOND, secondDutyDetail); map.put(CURRENT_TASK_DOWN_STREAM_COUNT, downstreamCount); map.put(CURRENT_LAUNCHED_TIMEOUT, launchedTimeoutString); map.put(CURRENT_RUNNING_TIMEOUT, runingTimeout); map.put(DOWN_STREAM_EFFECT_MAP, downStreamEffecMap); map.put(CURRENT_DATA_VERSION_MESSAGE, message); map.put(CURRENT_YEAR_MONTH, DateTime.now().toString("yyyy.MM")); String html = template.getMailText(map); System.out.println(html);
相关推荐
在本示例中,我们将探讨如何使用Spring框架与FreeMarker模板引擎相结合,来实现一个功能丰富的电子邮件服务。这个服务能够发送HTML格式的邮件,其中包含内嵌的图片,并且能够处理附件,同时解决字符编码可能导致的...
标题 "Spring+Freemarker 使用163发HTML格式的邮件" ...在Spring+Freemarker发送邮件的场景下,这些库可能包含Spring的相关jar包,Freemarker的库,以及JavaMail API等。确保正确引入这些库是项目能够成功运行的关键。
下面是一个使用SpringBoot和FreeMarker模板引擎发送邮件的示例: 首先,我们需要在pom.xml文件中添加以下依赖项: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-freemarker ...
在这个例子中,`email.ftl`(FreeMarker)和`email.vm`(Velocity)是模板文件,`model`是一个键值对,用于填充模板中的变量。`sendEmailWithFreeMarker`和`sendEmailWithVelocity`方法展示了如何使用这两种模板引擎...
使用Spring发送邮件的基本步骤如下: 1. 添加Spring核心库和相关的邮件发送库(如JavaMail API)到项目依赖中。 2. 在Spring配置文件(如`email-163.xml`)中配置邮件服务器的相关信息,如用户名、密码、SMTP服务器...
这个源码应该包含了一个实现了MailSender接口的类,可能使用了线程池进行异步发送,以及如何构建邮件模板和处理邮件列表的逻辑。通过阅读和分析源码,你可以学习到如何在Spring中实现批量邮件发送,并从中获取灵感...
本教程将围绕"Spring + Mail"的组合,结合Freemarker模板引擎,提供一个完整的发送邮件的Demo。 首先,我们需要在项目中添加相关的依赖。Spring框架通常与Spring Boot一起使用,这样可以简化配置。在`pom.xml`或`...
在本例中,可能需要一个`Mail`实体类,用来表示邮件信息,以及一个对应的Mapper接口和XML配置文件,用于执行SQL操作,如插入邮件记录或者获取邮件模板等。 邮件发送功能通常涉及到SMTP服务器,我们需要配置SMTP...
在IT行业中,Spring框架是Java开发中的一个核心组件,它为构建企业级应用程序提供了全面的编程和配置模型。其中,Spring Mail模块是Spring框架的一部分,它简化了通过JavaMail API发送电子邮件的过程。本文将深入...
- 发送邮件:在业务逻辑中,使用`JavaMailSender`发送邮件,并将数据注入VM模板,生成邮件正文。 通过以上步骤,开发者可以利用Spring的邮件发送功能,结合VM模板,实现高效且定制化的邮件服务。这种技术在许多...
- **邮件模板**:在实际应用中,经常需要发送结构相似但具体内容不同的邮件,此时可以使用模板引擎(如Freemarker)来动态生成邮件内容。代码中引用的`FreeMarkerConfigurer`和`Template`就是为此目的服务的,可以...
2. 邮件发送:可以使用Freemarker模板动态生成邮件内容,提高邮件的个性化程度。 3. 文档生成:Freemarker也可用于生成各种格式的文档,如PDF、Excel等,只需为模板提供相应的数据模型。 4. API文档:一些API文档...