EDM推送
一、需求描述:
日前,做了一个发送客户账单的功能,邮件模板采用自定义,生成vm文件,保存至redis,
采用jodd-mail发送邮件,查询用户账单数据,账单明细,缓存加载模板并渲染数据,推送邮件至客户端.
这里给大家推荐一下,jodd是一款很优秀的分类工具插件,邮件服务可以说是使用超级简单,
但是性能很不错,实现代码干净利落;
二、Velocity的基本代码实现
VelocityEngine ve = new VelocityEngine();
ve.setProperty(Velocity.INPUT_ENCODING, "utf-8");// 设置输入字符集
ve.setProperty(Velocity.OUTPUT_ENCODING, "utf-8");// 设置输出字符集
ve.init(); VelocityContext context = new VelocityContext();
HashMap<String, Object> result = new HashMap<String, Object>();
result.put("name", "麦德漂");
result.put("age", "26")
context.put("map", result); //ve.evaluate(context, writer, "logTag", StringTemplate);
ve.evaluate(context, writer, "logTag", "第一列:$map.get('name'),第二列:$map.get('key')");
String content = writer.toString();
writer.close();
比较简单,如果缓存中没有模板内容,重新加载一遍
VelocityContext context = new VelocityContext();
StringWriter writer = new StringWriter();
Template t = ve.getTemplate("/First.vm");
t.merge(context, writer);
String content = writer.toString();
writer.close();
或者从本地文件去加载
VelocityEngine ve = new VelocityEngine();
ve.setProperty(Velocity.RESOURCE_LOADER, "file");
ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/test/test/template/");
ve.setProperty(Velocity.INPUT_ENCODING, "utf-8");
ve.setProperty(Velocity.OUTPUT_ENCODING, "utf-8");
ve.init();
三、采用jodd发送邮件
1.Jodd的流式编程:
Email email = Email.create().from("...@jodd.org").to("...@jodd.org").subject("Hello!").addText("text").addHtml("<b>HTML</b> message...");
2.Jodd的邮件推送
SmtpServer smtpServer = SmtpServer.create("mail.jodd.org").authenticateWith("user", "password");
SendMailSession session = smtpServer.createSession();
session.open();
session.sendMail(email1);
session.sendMail(email2);
session.close();
3.考虑到发送效率,避免进入垃圾箱,我目前每500封邮件关闭一次session,session中的邮件全部发送,保存发送记录,
停顿10秒,失败时记录用户数据,支持失败重发.
四、关于统计邮件已读,未读
邮件发送出去,很多时候我们很在意用户是否已读,刚开始有两种思路:
1.邮件设置已读回执,这种解决方案需要用户来触发,交互性不好,且统计不一定准确,直接放弃
2.在邮箱内容中添加隐藏图片,很简单,如下:
<img style='display:none;' src='" + countUrl + id + "'/>
这样用户在打开邮件时,会加载图片重新打到你的服务器,方便监控已读未读情况.
注:在使用OutLook时,隐藏图片无法隐藏,最后我的统计路径输出了一张无色的java矢量图,当然很小,同样扔到redis了.
EDM推送的更多相关文章
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- iOS---iOS10适配iOS当前所有系统的远程推送
一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- SignalR SelfHost实时消息,集成到web中,实现服务器消息推送
先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- Android 几种消息推送方案总结
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- fir.im Weekly - 关于 iOS10 适配、开发、推送的一切
"小程序"来了,微信变成名副其实的 Web OS,新一轮的Web App 与Native App争论四起.程序员对新技术永远保持灵敏的嗅觉和旺盛的好奇心,@李锦发整理了微信小程序资 ...
- ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知
一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...
随机推荐
- 算法 python实现(二) 冒泡排序
首先说一下 冒泡排序 是怎么做的: 总体的想法是,把小的轻的浮上前面去,把大的重的沉到后面去. 这样设置两个指针,i j, 1. i标识每一趟循环.这一趟的目的是把后面那些未排序的数列中最小的浮上前面 ...
- ASPNET5中的那些K
ASPNET5中的那些K ASP.NET 5最大的变化是什么?首当其冲的就是多了很多K,K表示的是ASP.NET vNext的项目代号“Project K”,但很容易让人想到一个汉字——“坑”,希望K ...
- Bootstrap+MetroNic_1.5.4 Head meta
Bootstrap+MetroNic_1.5.4 HTML <meta> 标签设定含义: <meta http-equiv="X-UA-Compatible" c ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- 1 storm基本概念 + storm编程规范及demo编写
本博文的主要内容有 .Storm的单机模式安装 .Storm的分布式安装(3节点) .No space left on device .storm工程的eclipse的java编写 http:// ...
- POJ 3125 Printer Queue
题目: Description The only printer in the computer science students' union is experiencing an extremel ...
- 动态的变量如何作为json的键
定义一个json,然后设置键值,可是键本身也是变量 如何写呢? 按照以往的写法 var name="lizhaoyao"; var json={}; json.name=" ...
- Android——打造万能适配器(CommonAdapter)
List<T> : ListView -> Adapter extends BaseAdapter -> ViewHolder ViewHolder CommonAdaper ...
- MySql中having字句对组记录进行筛选使用说明
having字句可以让我们筛选成组后的各种数据 having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前 ...
- SSL安全解决方案(转)
http://blog.csdn.net/photnman/article/details/388853 背景及部分安全知识在高度保证应用程序安全的过程中我们不免会考虑到如下的安全需求,然后根据这些安 ...