DWR+freemarker+commons.mail 实现模板定制动态邮件发送

简介:
首先介绍DWR
1.        代码准备dwr.xml(dwr配置文件)
 
这个应用主要用到 < include  method = "buildHtmlMail" /> 这个方法,所以我们的DWRUtil类中也要定义这个方法
public boolean buildHtmlMail(String id, String email, String realname) {
       String sql = "SELECT TSNR_ID,TITLE,TSLX,to_char(TSSHJ,'yyyy-mm-dd hh24:mi:ss') TSSHJ," +
              "TSR,LXFSH,CONTENT,SHFKF " + "FROM TJEG_TSNR WHERE TSNR_ID = ?";
       try {
           List list = this.queryForList(sql, new Object[] { id });
           Map map = null;
           Map root = new HashMap();
           for (java.util.Iterator i = list.iterator(); i.hasNext();) {
              map = (Map) i.next();
           }
           list = null;
           sql = "SELECT TSDF_ID,DFR,to_char(DFSHJ,'yyyy-mm-dd hh24:mi:ss') DFSHJ,CONTENT " +
                  "FROM TJEG_TSDF WHERE TSNR_ID = ?  ORDER BY TSDF_ID";
           list = this.queryForList(sql, new Object[] { id });
           List listContent = new ArrayList();
           for (java.util.Iterator i = list.iterator(); i.hasNext();) {
              Map mapContent = (Map) i.next();
              listContent.add(new TSContent((String) mapContent.get("DFR"),
                     (String) mapContent.get("DFSHJ"), ELFuncUtil
                            .mClob(mapContent.get("CONTENT"))));
           }
           root.put("TITLE", (String) map.get("TITLE"));
           root.put("CONTENT"ELFuncUtil.mClob(map.get("CONTENT")));
           root.put("TSR", (String) map.get("TSR"));
           root.put("LXFSH", (String) map.get("LXFSH"));
           root.put("TSSHJ", (String) map.get("TSSHJ"));
           root.put("TSDF", listContent);
           Configuration cfg = cfg = new Configuration();
           cfg.setClassForTemplateLoading(this.getClass(),
                  "\\com\\tianjin\\canic\\tjeg\\utils\\template");
           Template t = cfg.getTemplate("mail.ftl");
           ByteArrayOutputStream bos = new ByteArrayOutputStream();
           Writer out = new OutputStreamWriter(bos, "GBK");
           t.process(root, out);
           String content = bos.toString();
           out.close();
           System.out.println(content);
           return SendEmail.sendHTML(email, realname, "Re :"
                  + (String) map.get("TITLE"), content);
       catch (IOException e) {
           e.printStackTrace();
           return false;
       catch (TemplateException e) {
           e.printStackTrace();
           return false;
       catch (SQLException e1) {
           e1.printStackTrace();
           return false;
       catch (Exception e) {
           e.printStackTrace();
           return false;
       }
}
这个方法首先根据条件查询数据库得到相应的数据,然后存储到一个Map集合中 Map root = new HashMap();
root.put("TITLE", (String) map.get("TITLE"));
           root.put("CONTENT"ELFuncUtil.mClob(map.get("CONTENT")));
           root.put("TSR", (String) map.get("TSR"));
           root.put("LXFSH", (String) map.get("LXFSH"));
           root.put("TSSHJ", (String) map.get("TSSHJ"));
    root.put("TSDF", listContent);
然后构建 freemarker 模版 Configuration cfg = cfg = new Configuration(); 对象 cfg.setClassForTemplateLoading(this.getClass(),
               "\\com\\tianjin\\canic\\tjeg\\utils\\template"); 获得存储模版的文件夹,由于是使用Web开发所以不能写绝对路径(因为不知道应用最终部署到那个地方)只能写相对路径,所以经过查看文档发现 Configuration 类有一个 setClassForTemplateLoading 方法可以获得classpath然后根据classpath获得模版文件夹(这是非常有用的)
下面是模版文件夹和模版文件
   Mail.ftl 是模版文件,里面的语法到网上可以查到,就像使用jsp差不多.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
 <title></title>
</head>
<body>
  <table  width="95%" align="center" class="message">
    <tr><td align="center" bgcolor="#e9f8fe" width="100">主题 : </td><td colspan="3">${TITLE}</td></tr>
    <tr><td align="center" bgcolor="#e9f8fe">投诉人 : </td><td>${TSR}</td><td align="center" bgcolor="#e9f8fe"width="100">联系方式 : </td><td>${LXFSH}</td></tr>
    <tr><td align="center" bgcolor="#e9f8fe">投诉时间 : </td><td colspan="3">${TSSHJ}</td></tr>
    <tr><td align="center" bgcolor="#e9f8fe">投诉内容 : </td><td colspan="3">${CONTENT}</td></tr>
  </table>
  <br/>
  <#list TSDF as being> 
     <table width="95%" align="center" class="message">
       <tr>
         <td align="center" class="left">答复内容 :</td>
         <td align="left" class="right"> ${being.content}</td>
       </tr>
       <tr>
         <td align="center" class="left">答复人 : </td>
         <td align="left" class="right">${being.dfr}</td>
       </tr>
       <tr>
         <td align="center" class="left">答复时间 :</td>
         <td align="left" class="right"> ${being.dfshj}</td>
       </tr>
     </table>
 </#list> 
 </body>
</html>
获得到模板文件后
Template t = cfg.getTemplate("mail.ftl");
           ByteArrayOutputStream bos = new ByteArrayOutputStream();
           Writer out = new OutputStreamWriter(bos, "GBK");
    t.process(root, out);
再得到一个Writer对象然后调用 处理 方法对模版进行处理(生成新的一个文件,或者一个流),由于我们要发送一封Html格式的Email所以需要得到一个String(讲那个流直接转出String)
String content = bos.toString();
           out.close();
           return SendEmail.sendHTML(email, realname, "Re :"
               + (String) map.get("TITLE"), content);
并调用 SendEmail.sendHTML 方法发送邮件
  
由于我们的项目所有的配置都保存在数据库中,所以大家会看到 semail.setHostName(getSysConfig( " 邮件服务器地址 " )); 这类的代码至此邮件已经发送完毕,但是前台页面是如何调用DWR的呢?
 
会打开一个模式窗口,弹出senmail.jsp页面需要用户输入需要歘发的邮箱地址然后点击转发邮件按钮会调用javascriptsendMail方法
 
<script type="text/javascript">
    function sendMail(realname){
       if($F('sendAddr') == ''){
           $('sendAddrspan').innerHTML = "<font color='red'>请输入转发邮件地址</font>";
           $('sendAddr').focus();
           return false;
       }
       $("sendAddrspan").innerHTML="<img src='${ctx}/images/xin_332090401170007802931.gif'/><font color='#1EB216'>系统正在处理</font>";
       DWRUtil.buildHtmlMail($F('tsnrid'),$F('sendAddr'),realname,showResult);
    }
    function showResult(result){
       if(result){
           alert('邮件发送成功');
           window.close();
       }
       else{
           $("sendAddrspan").innerHTML="<font color='red'>邮件发送失败,请重新发送</font>";
           return false;
       }
    }
</script>
调用 DWRUtil.buildHtmlMail($F('tsnrid'),$F('sendAddr'),realname,showResult); 方法,注意最后一个参数是一个回调函数这个函数用于判断邮件是否发送成功,
public boolean buildHtmlMail(String id, String email, String realname)
我们的buildHtmlMail方法就是返回一个boolean,所以经过判断是否为true,也就知道我们的邮件是否发送成功了.









本文转自 tony_action 51CTO博客,原文链接:http://blog.51cto.com/tonyaction/42055,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Java 应用服务中间件
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
1370 1
|
安全 JavaScript 前端开发
08dwr - web.xml配置(测试模式配置)
08dwr - web.xml配置(测试模式配置)
56 0
|
Java 数据安全/隐私保护
【Java用法】java使用javax.mail读取邮箱,SpringBoot javax.mail获取邮件内容,根据时间段筛选邮件,内附代码,拿来即用
【Java用法】java使用javax.mail读取邮箱,SpringBoot javax.mail获取邮件内容,根据时间段筛选邮件,内附代码,拿来即用
292 0
|
Java
【JavaWeb】Java Web三大组件之Filter过滤器
JavaWeb中的过滤器:当浏览器访问服务器资源时,过滤器就会拦截浏览器发过来的请求,实现一些特别的功能。 作用:一般用于完成通用的操作,如登录验证,身份验证,统一字符编码和敏感字过滤等。
178 1
|
存储 编解码 Java
Java Web之Servlet中过滤器与监听器的解析及使用(附源码)
Java Web之Servlet中过滤器与监听器的解析及使用(附源码)
156 0
Java:web.xml配置模板
Java:web.xml配置模板
|
存储 Java 应用服务中间件
JavaWeb学习笔记二 --- 会话机制、JSP、 EL+JSTL 总结(超详细的总结~~)
JavaWeb学习笔记二 --- 会话机制、JSP、 EL+JSTL 总结(超详细的总结~~)
164 0
JavaWeb学习笔记二 --- 会话机制、JSP、 EL+JSTL 总结(超详细的总结~~)
|
存储 Java
Java Web(十二) commons-fileupload上传下载
今天心态正常。。。继续努力。。
216 0
|
Java 应用服务中间件 数据安全/隐私保护
下一篇
无影云桌面