目的


在一些客户响应系统中,面对客户的需求,我们有可能需要通过邮件对客户进行通知或者向客户反馈查询信息。

比如:银行的账单系统,需要对客户的查账请求进行处理,发送账单邮件,此时就能将账单数据写入到HTML文档中,通过邮件发送到客户的邮箱进行回馈;移动运营商的客户响应也包括查询余额、查询套餐等功能,都可以通过邮件订阅。而服务端只需要将模板设定好,将数据嵌套进去,就能针对每个客户发送不同的反馈信息。

所以今天写的示例,就是在Java程序中,发送一个可以设置通知对象和通知内容的HTML邮件。

使用的工具


1.首先我们需要操作HTML文档,在java程序中,操作HTML、XML只要使用Dom4j即可,可以将文档转化成document对象,在程序中进行读写。

2.发送邮件需要用到javamail工具,需要对javamail发送邮件的配置和使用有一定的研究。我在之前写过一个使用构建器配置参数的javamail工具类,就直接拿来用了~

代码


模板文件

pageTemplet.html

<html><head><title>通知邮件</title><meta charset="utf-8"/><style type="text/css">body{font-size: 10pt;}.header,.content,.footer{width: 600px;height: 180px;}.footer{text-align: right;}#name{color: grey;}#message{color: grey;}</style></head><body><div class="header"><img src="http://www.zhku.edu.cn/images/logo.jpg" alt="zhkulogo"/></div><div class="content">你好,<span id="name"></span>同学:<br/><br/><div id="message"><span>    </span><span id="message"></span></div><div class="footer">校园通知(<span id="time"></span>)</div></div></body>
</html>

邮件工具类

MailSender .java

package util;import java.util.Properties;import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;public class MailSender {private final Properties prop = new Properties();private final Session session;private final Message msg;private final Transport transport;//构建器public static class Builder{private final String mailContent;private final String toAddress;private String debug = "true";private String auth = "true";private String host = "smtp.163.com";private String protocol = "smtp";private String subject = "通知邮件";//发件人地址private String fromAddress= "xxxxx@163.com";//发件账户密码private String fromCount = "xxxxx";private String fromPassword = "xxxxx";public Builder Debug(String debug) {this.debug = debug;return this;}public Builder Subject(String subject) {this.subject = subject;return this;}public Builder Auth(String auth) {this.auth = auth;return this;}public Builder Host(String host) {this.host = host;return this;}public Builder FromCount(String fromCount) {this.fromCount = fromCount;return this;}public Builder FromAddress(String fromAddress) {this.fromAddress = fromAddress;return this;}public Builder FromPassword(String fromPassword) {this.fromPassword = fromPassword;return this;}public Builder(String mailContent, String toAddress) {this.mailContent = mailContent;this.toAddress = toAddress;}public Builder Protocol(String protocol) {this.protocol = protocol;return this;}public MailSender send() throws Exception{return new MailSender(this);}}private MailSender(Builder builder) throws Exception{prop.setProperty("mail.debug", builder.debug);prop.setProperty("mail.smtp.auth", builder.auth);prop.setProperty("mail.host", builder.host);prop.setProperty("mail.transport.protocol",builder.protocol);session = Session.getInstance(prop);msg = new MimeMessage(session);transport = session.getTransport();msg.setSubject(builder.subject);msg.setFrom(new InternetAddress(builder.fromAddress,"通知邮件"));transport.connect(builder.fromCount,builder.fromPassword);//在这里contentType要设置成text/html,编码格式也要视情况而设定msg.setContent(builder.mailContent, "text/html;charset=utf-8");transport.sendMessage(msg, new Address[] {new InternetAddress(builder.toAddress)});}}

示例主程序

SendHTMLMail.java

package practice;import java.io.FileReader;
import java.io.FileWriter;
import java.util.Calendar;
import java.util.List;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;import util.MailSender;/*** 类描述:示例如何根据html模板发送html邮件* @author xiezd**/
public class SendHTMLMail {@Testpublic void send(){SAXReader reader = new SAXReader();Document document = null;try {//获取模板html文档document = reader.read(SendHTMLMail.class.getResource("../file/pageTemplet.html").getPath());Element root = document.getRootElement();//分别获取id为name、message、time的节点。Element name = getNodes(root,"id","name");Element message = getNodes(root,"id","message");Element time = getNodes(root, "id", "time");//设置收件人姓名,通知信息、当前时间Calendar calendar = Calendar.getInstance();time.setText(calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH)+1)+"-"+calendar.get(Calendar.DATE));name.setText("小明");//随便写的message.setText("因为您、我有缘,所以才能共结一个圆。为进一步优化教育环境,"+ "加强家校互动,共同促进学生的成长和进步,本着家校共育的精神,我校决定召开高一家长会,"+ "希望你在百忙中抽出时间,拨冗光临,对孩子在家和在校的表现与各班主任进行深入的面对面交流,"+ "针对每个孩子的不同特点,与老师共同商讨教育孩子的策略,最大程度的促进您孩子的进步。");//保存到临时文件FileWriter fwriter = new FileWriter("d:/temp.html");XMLWriter writer = new XMLWriter(fwriter);writer.write(document);writer.flush();//读取临时文件,并把html数据写入到字符串str中,通过邮箱工具发送FileReader in = new FileReader("d:/temp.html");char[] buff = new char[1024*10];in.read(buff);String str = new String(buff);System.out.println(str.toString());new MailSender.Builder(str.toString(),"xxx@qq.com").send();} catch (Exception e) {e.printStackTrace();}}/*** 方法描述:递归遍历子节点,根据属性名和属性值,找到对应属性名和属性值的那个子孙节点。* @param node 要进行子节点遍历的节点* @param attrName 属性名* @param attrValue 属性值* @return 返回对应的节点或null*/public Element getNodes(Element node, String attrName, String attrValue) {  final List<Attribute> listAttr = node.attributes();// 当前节点的所有属性  for (final Attribute attr : listAttr) {// 遍历当前节点的所有属性  final String name = attr.getName();// 属性名称  final String value = attr.getValue();// 属性的值  System.out.println("属性名称:" + name + "---->属性值:" + value);if(attrName.equals(name) && attrValue.equals(value)){return node;}}  // 递归遍历当前节点所有的子节点  final List<Element> listElement = node.elements();// 所有一级子节点的list  for (Element e : listElement) {// 遍历所有一级子节点  Element temp = getNodes(e,attrName,attrValue);// 递归if(temp != null){return temp;};  }  return null;}  }

效果

JavaMail发送HTML邮件相关推荐

  1. JavaMail发送QQ邮件

    JavaMail发送QQ邮件 1.开启QQ服务并获得授权码 授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码 适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/ ...

  2. QQ邮箱炸啦,我的附件名怎么乱码?解决javaMail发送QQ邮件,附件名乱码的问题

    解决javaMail发送QQ邮件,附件名乱码的问题 问题背景 具体问题 解决思路 源码Debug 解决方式 问题背景 项目里面使用javaMail发QQ邮件,日志显示我们这边传过去的附件名是正常的,个 ...

  3. java 发送邮件昵称_利用JavaMail发送QQ邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  4. JavaMail发送简单邮件

    2019独角兽企业重金招聘Python工程师标准>>> package cn.jmail.test;import java.util.Properties;import javax. ...

  5. 【Java】JavaMail发送QQ邮件邮件

    荐读 JavaMail邮件发送不成功的那些坑人情况及分析说明 javax.mail.AuthenticationFailedException异常的处理 QQ邮箱如何开启POP3/SMTP服务 发送说 ...

  6. javamail发送SSL邮件报报Unrecognized SSL message, plaint

    2019独角兽企业重金招聘Python工程师标准>>> 发送邮件报如下错误.smtp服务器是smtp.live.com,有要求安全连接(SSL) 2009-04-27 10:35:3 ...

  7. JavaMail的体系结构及发送复杂邮件

    2019独角兽企业重金招聘Python工程师标准>>> 一 . 电子邮件传输的全过程: 二 . JavaMail 的体系结构与API分类 JavaMail API按其功能划分通常可分 ...

  8. Java-使用JavaMail发送一封邮件给用户邮箱功能实现

    <---------–start---------–> 通过javamail发送一封邮件: 较早前,我已经编写好了发送邮件的工具类MailUtils.有以下要点需要注意: ① 发件箱的邮件 ...

  9. JavaMail发送和接收邮件

    一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...

  10. java 邮件 附件_java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理em ...

最新文章

  1. 实测 Mysql UUID 性能(转)
  2. 尚硅谷学习:createElement 方法笔记
  3. php mysql网站导航跳转_PHP微信公众平台跳转网页实现定位思路 By:阿尚
  4. 如何去掉系统快捷方式的箭头(转载)
  5. php和asp程序如何进行301设置?
  6. Android Handler消息传递机制
  7. springboot-数据访问
  8. 白瑜庆:知乎基于Kubernetes的kafka平台的设计和实现
  9. 三班的孩子们,你们现在还好吗?
  10. idea下使用Maven找不到类
  11. C#数组和集合专题2(Array)
  12. 数据结构:线性表理论题目集
  13. svpwm c语言程序,SVPWM的实现过程附C代码.doc
  14. 软件工程-----个人总结
  15. git的安装步骤,仅适用于windows-64位系统
  16. mybaits源码分析(八) StatementHandler的详解
  17. mysql中如何创建数据和表
  18. Hadoop题库(选择题、判断题)详细介绍
  19. 精灵复兴 与服务器链接中断,精灵复兴一键服务端+视频架设教程+GM模式介绍+2036合成公式+客户端...
  20. 一文读懂CPU工作原理、程序是如何在单片机内执行的、指令格式之操作码地址码

热门文章

  1. 人世之厄人性之恶——陈应松《母亲》读后
  2. UG NX 12同步建模:调整面大小
  3. python创建字符串数组_用zeep创建一个字符串数组参数?
  4. 计算机应用主要学PS,计算机应用专业PS模块考试标准.doc
  5. apache ab压测与参数传递
  6. Java 转换EXCEL Duble格式时间为指定格式日期字符串
  7. 学习java的第五天 基本数据类型 double、char、boolean
  8. 制作window11系统U盘启动盘
  9. 主板rgb接口是什么_什么是主板?
  10. 什么是像素格式(色彩采样、色度抽样)RGB 4:4:4、(Limit)RGB 4:4:4、Ycbcr 4:4:4、Ycbcr 4:2:2、Ycbcr 4:2:0又是什么?