[JAVA教程] Velocity1.7邮件模板 , Jodd-mail3.7发送邮件

一、需求描述:
    
    日前,做了一个发送客户账单的功能,邮件模板采用自定义,生成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();

三、采用jodd发送邮件
    1.Jodd的流式编程:
        Email email = Email.create()
            .from("[email protected]")
            .to("[email protected]")
            .subject("Hello!")
            .addText("text message...")
            .addHtml("<b>HTML</b> message...")
            .priority(PRIORITY_HIGHEST);
    
    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了.
    
博客书写过程中,难免出现一些疏漏和错误,欢迎大家批评指正.

时间: 2024-11-09 00:14:01

[JAVA教程] Velocity1.7邮件模板 , Jodd-mail3.7发送邮件的相关文章

JIRA 本地环境搭建、插件开发、邮件模板定制

系统 Mac 语言 JAVA 1.首先安装本地开发环境,JIRA提供SDK,供本地运行及开发. SDK安装参考文档:https://developer.atlassian.com/docs/getting-started/set-up-the-atlassian-plugin-sdk-and-build-a-project/install-the-atlassian-sdk-on-a-linux-or-mac-system 2.环境搭建好就可以开发插件了. SDK中 JIRA 版本和 实际使用的

转:一个java教程各章节的链接

Java概述,Java是什么? Java环境变量设置 Java基本语法 Java对象和类 Java基本数据类型 Java变量类型 Java修饰符类型 Java基本运算符 Java循环for, while和do...while Java决策制定 Java Numbers类 Java String类 Java数组 Java日期时间(Date/Time) Java正则表达式 Java方法 Java流,文件和I/O Java异常处理 Java继承 Java覆盖/重载 Java多态性 Java抽象 Jav

学java教程之普通方法重载

学编程吧学java教程之普通方法重载发布了,欢迎通过xuebiancheng8.com来访问 先来看什么是普通方法重载呢,先来看一个例子 public class Person{ String username; int age; public void hello(){ System.out.println("Hello"); } public void hello(String username){ System.out.println("你好"+usernam

学java教程之对象数组

学编程吧学java教程之对象数组发布了,欢迎通过xuebiancheng8.com来访问 什么是对象数组呢,对象数组顾名思义是对象的数组. 首先定义一个对象 public class Student{ private String username; private String password; setter,getter.... } 如上面所示,定义了一个Student对象 加入现在需要3个Student对象怎么办呢,我们得 Student stu1 = new Student(); St

java教程(五)SSH框架-配置

前言:从这篇博客开始我将继续讲述Java教程:SSH篇,主要内容围绕SSH框架分析与搭建,今天先简单介绍一下SSH的配置. SSH配置顺序是: spring-->hibernate-->struts 1. 建立web-project ,并添加Spring支持,添加JAR包时注意,aop  core web commons等包要加载,然后一直下一步就可以成功添加spring支持: 2. 添加hibernate支持,同样注意包的选择, 下一步中注意,选择添加到spring中(spring conf

学java教程之集合框架

学编程吧学编程学IT教程之java教程集合框架发布了,欢迎通过xuebiancheng8.com来访问 java中的集合框架故名思议就是针对集合的框架.那什么是集合呢,前面已经学习过数组,没错,数组就是一组数据的集合,换句话说数组也是一种特殊的集合框架,可以完成集合的功能.那数组在使用的时候有没有不方便的地方呢,比方说数组有可能有满的时候,满了怎么办,我们是不是得自己写程序来更改数组的大小呢,而且还要把原来的数组赋值到新的数组的原来位置上,这样很明显数组用起来不是特别方便,很多功能得让我们自己去

Magento修改邮件模板内容

Magento 默认邮件模板 都是带着官方的标志和一些官方的基本信息.为了建立品牌形象我们需要把邮件模板中的所有官方信息换成自己的信息.修改步骤如下: 1.找到Magento的邮件模板文件(这里以 en_US为例),如下列文件:magento\app\locale\en_US\template\email\account_new.html:magento\app\locale\en_US\template\email\admin_password_new.html:magento\app\loc

学java教程之封装

学编程吧学java教程之封装发布了,欢迎大家通过xuebiancheng8.com来访问 下面来分析面向对象中的封装,什么是封装呢.先来段代码 public class Person{ String username; int age; } Person p = new Person(); p.username="张三"; p.age=-10; 上面实例化了一个Person对象p,然后赋值,这里我们将年龄的值赋值成了-10,这里很明显是不正确的,因为年龄不能为负的,那怎么办呢,这里我们

学java教程之面向对象(四)

学编程吧学java教程之面向对象(四)发布了,欢迎通过xuebiancheng8.com来访问 本次课来分析java面向对象之构造方法.什么是构造方法呢,构造方法听名字顾名思义,构造的时候执行的方法就叫构造方法. 没错,构造方法就是在构造对象的时候执行的方法,就是构造方法,那什么时候构造对象呢,是不是在new的时候调用构造对象呢,所以构造方法就是在new对象的时候执行的方法就是构造方法.构造方法一般用来为对象赋初值.完成对象的初始化. 下面我们来看如何定义构造方法. public class P