博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DWR+freemarker+commons.mail 实现模板定制动态邮件发送
阅读量:5935 次
发布时间:2019-06-19

本文共 5519 字,大约阅读时间需要 18 分钟。

首先介绍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,如需转载请自行联系原作者
你可能感兴趣的文章
[Android]权限处理
查看>>
Ubuntu修改时区
查看>>
JavaScript中核心概念Scope理解
查看>>
Mybatis 常用的几个对象
查看>>
参加微软 MVP 之夜暨微软技术与生态大会
查看>>
屌丝气质难掩,逼人逃离么?
查看>>
OFBiz + Opentaps 目录管理 四. 产品(一)定义产品
查看>>
list泛型类型获取
查看>>
VIM一些用法
查看>>
Nginx 502错误原因与解决办法
查看>>
使用Django来处理对于静态文件的请求
查看>>
dom4j解析xml的简单实用
查看>>
批量进行One-hot-encoder且进行特征字段拼接,并完成模型训练demo
查看>>
MySQL数据库在Windows环境下安装配置
查看>>
由浅入深学习Apache httpd原理与配置
查看>>
用tiny project来激励自己入门
查看>>
制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
查看>>
Beyond Compare的几种实用功能
查看>>
旧工程适配iOS 6和iPhone 5的一些故事
查看>>
CentOS版本怎么安装python的pip及mycli的安装
查看>>