一、需求描述:

日前,做了一个发送客户账单的功能,邮件模板采用自定义,生成vm文件,保存至redis,

采用jodd-mail发送邮件,查询用户账单数据,账单明细,缓存加载模板并渲染数据,推送邮件至客户端.

这里给大家推荐一下,jodd是一款很优秀的分类工具插件,邮件服务可以说是使用超级简单,

但是性能很不错,实现代码干净利落;

二、Velocity的基本代码实现

1 VelocityEngine ve = newVelocityEngine();2 ve.setProperty(Velocity.INPUT_ENCODING, "utf-8");//设置输入字符集

3 ve.setProperty(Velocity.OUTPUT_ENCODING, "utf-8");//设置输出字符集

4 ve.init();5

6 VelocityContext context = newVelocityContext();7 HashMap result = new HashMap();8 result.put("name", "麦德漂");9 result.put("age", "26")10 context.put("map", result);11

12 //ve.evaluate(context, writer, "logTag", StringTemplate);

13 ve.evaluate(context, writer, "logTag", "第一列:$map.get('name'),第二列:$map.get('key')");14 String content =writer.toString();15 writer.close();

比较简单,如果缓存中没有模板内容,重新加载一遍

1 VelocityContext context = newVelocityContext();2 StringWriter writer = newStringWriter();3 Template t = ve.getTemplate("/First.vm");4 t.merge(context, writer);5 String content =writer.toString();6 writer.close();

或者从本地文件去加载

1 VelocityEngine ve = newVelocityEngine();2 ve.setProperty(Velocity.RESOURCE_LOADER, "file");3 ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/test/test/template/");4 ve.setProperty(Velocity.INPUT_ENCODING, "utf-8");5 ve.setProperty(Velocity.OUTPUT_ENCODING, "utf-8");6 ve.init();

三、采用jodd发送邮件

1.Jodd的流式编程:

1 Email email =Email.create().from("...@jodd.org").to("...@jodd.org").subject("Hello!").addText("text").addHtml("HTML message...");

2.Jodd的邮件推送

1 SmtpServer smtpServer = SmtpServer.create("mail.jodd.org").authenticateWith("user", "password");2 SendMailSession session =smtpServer.createSession();3 session.open();4 session.sendMail(email1);5 session.sendMail(email2);6 session.close();

3.考虑到发送效率,避免进入垃圾箱,我目前每500封邮件关闭一次session,session中的邮件全部发送,保存发送记录,

停顿10秒,失败时记录用户数据,支持失败重发.

四、关于统计邮件已读,未读

邮件发送出去,很多时候我们很在意用户是否已读,刚开始有两种思路:

1.邮件设置已读回执,这种解决方案需要用户来触发,交互性不好,且统计不一定准确,直接放弃

2.在邮箱内容中添加隐藏图片,很简单,如下:

1

这样用户在打开邮件时,会加载图片重新打到你的服务器,方便监控已读未读情况.

注:在使用OutLook时,隐藏图片无法隐藏,最后我的统计路径输出了一张无色的java矢量图,当然很小,同样扔到redis了.

edm java_EDM推送相关推荐

  1. EDM系统看板多邮件模板邮箱配置地址簿​EDM营销推送邮件系统开发

    多用途市场调查推广销售活动EDM营销推送邮件系统开发 EDM营销(Email营销),帮助企业向目标客户发送EDM邮件,建立同目标顾客的沟通渠道,向其直接传达相关信息,是促进销售的一种营销方式. EDM ...

  2. 外贸邮件推送平台,外贸开发信邮件推送平台,外贸EDM推送平台,如何选择?

    目前外贸已进入主动开发时代,企业邮箱已不能满足日发大量邮件的需求.不少客户咨询如何选择"外贸邮件推送平台,外贸开发信邮件推送平台,外贸EDM推送平台". 客户踩过的坑: 1. 在某 ...

  3. 使用阿里云邮件推送服务架设自己邮件验证与推送体系

    提示:阅读本文需提前了解的相关知识 1.电子邮件协议(http://baike.baidu.com/view/2367542.htm) 2.阿里云邮件推送(https://www.aliyun.com ...

  4. 依托人工智能实现的个性化推送

    从人工智能目前的发展进程来看,其技术水平已经能够设计出主动推送人工智能系统了.传统推荐系统系统会根据用户请求来展现相关内容或产品,而主动推送系统则具备主动推送通知的功能,在内容有更新或更改时会主动通知 ...

  5. 如何选择第三方消息推送SDK?你必须把握这几个关键点

    ​​消息推送(常通过第三方消息推送平台实现)是APP触达用户,和用户沟通的重要方式.通过消息推送,用户可以及时接收到新闻资讯.商品优惠.产品功能更新通知等重要消息.有效的消息推送,可以帮助APP唤醒沉 ...

  6. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  7. 微信公众号为指定openid用户推送消息

    微信公众号为指定openid用户推送消息 微信提供的开放接口中,有两个给指定openid的用户发送信息的接口,适用场景应该是向 预约用户或者中奖用户发送消息. 第一个接口:客服发送消息 请求方式: P ...

  8. Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)

    1. git remote add--添加远程仓库 在GitHub 上创建的仓库路径为 "git@github.com:用户名/git-tutorial.git".现在我们用git ...

  9. HTTP服务器端常用推送技术

    服务器端推送技术描述 不论是传统的HTTP请求-响应式的通信模式, 还是异步的AJAX式请求, 服务器端始终处于被动的应答状态, 只有在客户端发出请求的情况下, 服务器端才会返回响应. 这种通信模式被 ...

  10. Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取

    1. 高频命令 git add 将工作文件修改提交到本地暂存区. git add . 将所有修改过的工作文件提交暂存区(常用). git commit -m "XXX" 为本次修改 ...

最新文章

  1. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
  2. 利用Cache,asp.net 简单实现定时执行任务
  3. Apache的安装与下载
  4. Codeforces Round 263(Div. 2)
  5. programcreek
  6. 游戏AI——行为树理论及实现
  7. java keypad game,Take character and return the Keypad equivalant
  8. 使用Lightbox制作照片条
  9. win7旗舰版安装不了python_怎样在Win7 64位旗舰版安装Python+Eclipse开发环境
  10. RHEL(Red Hat Enterprise Linux)配置YUM源
  11. 挑战杯获奖作品_我校学生参加河北省“挑战杯”竞赛获奖作品展示二
  12. python绘图背景透明_如何在 Matplotlib 中更改绘图背景
  13. python 抓取页面内容_用Python程序抓取网页的HTML信息的一个小实例
  14. 树莓派 opencv 调用摄像头
  15. 利用python selenium+cv2破解qq空间登录滑动验证码(无法获得完整图情况)(上)
  16. Linux 查看文件格式和更改文件格式
  17. mysql.sock.lock的作用_mysql.sock的作用
  18. ANSI标准判断sql空值与去空去空格
  19. 少年派的计算机游戏怎么弄,少年派的无聊之旅攻略大全图文详解
  20. Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置

热门文章

  1. Jmeter-界面功能介绍
  2. 计算机msvcp100.dll,msvcp100.dll丢失的解决方法
  3. 计算机网络路由器配置IP地址,电脑查看路由器设置网址(登录IP地址)的方法
  4. 张家界和桂林的旅游纪实(避坑指南)
  5. [Hulu] 数组最大价值
  6. 国产抗攻击服务器GeekServer V1.1发布。
  7. Sentinel控制台实时监控空白
  8. vue解决Not allowed to load local resource
  9. api 接口简单调用
  10. 关于PC下安装MAC苹果系统!