基于JavaMail开发邮件发送器工具类

在开发当中肯定会碰到利用Java调用邮件服务器的服务发送邮件的情况,比如账号激活、找回密码等功能。本人之前也碰到多次这样需求,为此特意将功能封装成一个简单易用工具类,需要用邮件发送功能时,只需要调用相关的接口即可。本人也将该工具提交到了GitHub上(https://github.com/lzj09/mail-helper),供大家参考。接下来,简单介绍一下该工具类及使用方法。

1、工程依赖

本工程主要依赖如下Jar:

<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency> <dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency> <dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency> <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

由于邮件发送是基于JavaMail的所以需要依赖JavaMail相关的Jar;

发送邮件的模板不仅支持简单的文本内容,也支持html,同时邮件模板中的语法支持freemarker语法,所以需要freemarker相关Jar;

记录日志信息,目前使用log4j。

2、核心类MailHelper

核心类MailHelper中最重要的send方法,即邮件发送方法,该方法的签名为:

public static void send(SenderConfig sender, String receiver, String subject, String template, Map<String, Object> data) throws Exception

该方法有5个参数,分别是:

  • SenderConfig sender:邮件发送账号的配置信息,配置信息有:

    // 用户名
    private String username;
    // 密码
    private String password;
    // 昵称
    private String nickname;
    // smtp服务主机名
    private String smtpHost;
    // smtp服务端口
    private String smtpPort;
    // 是否开启ssl
    private boolean isSsl;

    其实最主要就是smtp的配置信息

  • String receiver:邮件接收者邮箱地址

  • String subject:邮件的主题,也即在邮件列表上显示的名称

  • String template:邮件模板内容,支持freemarker语法

  • Map<String, Object> data:邮件模板中需要替换的数据内容

该方法的实现为:

// 将SenderConfig配置信息转换成Properties
Properties prop = wrapProperties(sender); // 获取权限配置
AuthConfig auth = getAuthConfig(sender); // 构建邮件会话
Session mailSession = Session.getDefaultInstance(prop, auth);
mailSession.setDebug(false); // 构建邮件消息
Message mailMessage = new MimeMessage(mailSession); // 设置昵称
String nick = MimeUtility.encodeText(getNickname(sender));
Address from = new InternetAddress(nick + " <" + sender.getUsername() + ">");
mailMessage.setFrom(from); // 设置邮件接收者
Address to = new InternetAddress(receiver);
mailMessage.setRecipient(Message.RecipientType.TO, to); // 设置邮件主题
mailMessage.setSubject(subject); // 设置发送时间
mailMessage.setSentDate(new Date()); // 设置邮件内容
Multipart mainPart = new MimeMultipart();
// 内容是可以包含html
BodyPart html = new MimeBodyPart();
html.setContent(getContent(template, data), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
mailMessage.setContent(mainPart); // 发送邮件
Transport.send(mailMessage);

3、测试

利用邮件发送的工具类测试将邮件发送出去:

首先准备需要发送的邮件模板:test.html

<!doctype html>
<html>
<head>
<title>测试邮件</title>
<meta charset="utf-8">
</head> <body>
<h2>${name}</h2>
<div>${description}</div>
</body>
</html>

其中模板中放置了2个占位符,分别是${name}和${description}

构建测试例子:

// 配置邮件发送信息
SenderConfig sender = new SenderConfig();
sender.setNickname("架构与我");
// 改成自己的邮件帐号
sender.setUsername("xxx@163.com");
// 改成自己的邮件密码
sender.setPassword("xxx");
sender.setSmtpHost("smtp.163.com");
sender.setSmtpPort("25");
sender.setSsl(false); // 获取邮件模板
File tpl = new File("src/test/resources/test.html");
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(tpl), "utf-8"));) {
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} // 测试数据
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "架构与我");
data.put("description", "专注大数据、微服务架构、高并发高吞吐量大型网站、移动开发。"); // 测试发送邮件
// 改成自己的接收邮件地址
MailHelper.send(sender, "xxx@qq.com", "来自架构与我的邮件", builder.toString(), data);

发送成功后,可以看到接收邮箱的内容如下:

该邮件昵称和主题都是按我们的设置显示出来了,打开邮件内容如下:

可以看到模板当中占位符内容也替换成了我们设置的数据。

关注我

以你最方便的方式关注我:

微信公众号:

基于JavaMail开发邮件发送器工具类的更多相关文章

  1. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类

    准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://www.cnblogs.com/pojo/p/14276637.html ...

  2. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  3. 邮件发送工具类 SendMail.java

    package com.util; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.Simp ...

  4. Android开发调试日志工具类[支持保存到SD卡]

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

  5. java 邮件发送工具类

    首先需要下载mail.jar文件,我个人通常是使用maven中心库的那个: <dependency> <groupId>javax.mail</groupId> & ...

  6. java 邮件发送工具类【来源网络自己已经实际应用】

    最近在做一个Java发送邮件的工具类,现在分享一下完整的代码 首先需要java邮件的包javax.mail-1.5.4.jar 之前因为链接给错了,很不好意思,现在重新发一次. 包在这里可以下载htt ...

  7. 基于javaMail的邮件发送--excel作为附件

    基于JavaMail的Java邮件发送 Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用 ...

  8. Java 基于javaMail的邮件发送(支持附件)

    基于JavaMail的Java邮件发送Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户 ...

  9. 基于Python的邮件检测工具

    邮件快速检测工具 概要介绍 mmpi,是一款使用python实现的开源邮件快速检测工具库,基于community框架设计开发.mmpi支持对邮件头.邮件正文.邮件附件的解析检测,并输出json检测报告 ...

随机推荐

  1. Using Sass with the Angular CLI

    https://www.tuicool.com/articles/mauiMzY One of the first things you'll usually do in a project is t ...

  2. SpringMVC配置多个数据源

    多数据源,说白了,就是多数据库. 想要实现多数据库查询,只需简单四步即可实现! 第一步: 配置 jdbc.properties: # MySQL #========================== ...

  3. JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图

    1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...

  4. java文件传输之文件编码和File类的使用

    ---恢复内容开始--- 我们知道,在用户端和服务端之间存在一个数据传输的问题,例如下载个电影.上传个照片.发一条讯息.在这里我们 就说一下文件的传输. 1.文件编码 相信大家小时候玩过积木(没玩过也 ...

  5. 微信小程序-设计指南

    基于微信小程序轻快的特点,官方拟定了小程序界面设计指南和建议,可作为小程序开发参考. 友好礼貌 -避免用户使用服务时被周围环境干扰,设计时应减少无关设计对用户的影响,礼貌的向用户提供服务,友好的引导用 ...

  6. node传统读取文件和promise,async await,

    先上传统文件加载方式代码,传统方式在处理多层嵌套时代码比较混乱 const fs = require('fs') //引入文件系统 function readFile (cb) { fs.readFi ...

  7. Django+xadmin打造在线教育平台(五)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

  8. python 基础(四) 正则,递归 生成器

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ...

  9. Python_字符串简单加密解密

    def crypt(source,key): from itertools import cycle result='' temp=cycle(key) for ch in source: resul ...

  10. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...