import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties; /**
* @author <a herf="mailto:yanwu0527@163.com">yanwu</a>
* @date 2019-10-22 14:17.
* <p>
* description: 邮件工具类
*/
@Slf4j
public class EmailUtil {
/*** 发件人地址 */
private static final String SEND_ADDRESS = "xxxxxxx@qq.com";
/*** 发件人账户名 */
private static final String ACCOUNT = "xxxxxxx@qq.com";
/*** 发件人账户密码[注:此密码不是邮箱登陆密码,而是邮箱授权密码] */
private static final String PASSWORD = "xxxxxxx"; private static final String UTF_8 = "UTF-8";
private static final String CONTENT_TYPE = "text/html;charset=UTF-8"; /*** 连接邮件服务器的参数配置 */
private static final Properties PROPERTIES; static {
PROPERTIES = new Properties();
// ----- 设置用户的认证方式
PROPERTIES.setProperty("mail.smtp.auth", "true");
// ----- 设置传输协议
PROPERTIES.setProperty("mail.transport.protocol", "smtp");
// ----- 设置发件人的SMTP服务器地址
PROPERTIES.setProperty("mail.smtp.host", "smtp.qq.com");
} public static void main(String[] args) throws Exception {
String toRecipient = "xxx@163.com";
String[] ccRecipient = {"xxx@qq.com", "xxx@qq.com"};
String subject = "测试邮件";
String content = "尊敬的用户:xxx@qq.com,您的车票已经抢票成功!信息如下:乘客:xx,日期:xxxx-xx-xx,车次:xxx,地点:杭州xx:xx-合肥xx:xx,席别:硬座。请在30分钟内完成付款!更多信息请查询未付款订单。";
String[] attachments = {"F:\\compression\\base_menu.sql", "E:\\log\\tcp-client.log"};
sendEmail(toRecipient, ccRecipient, subject, content, attachments);
} /**
* 发送邮件[使用默认的发件人信息]
*
* @param toRecipient 接收人地址
* @param ccRecipient 抄送人地址 [为null则不抄送]
* @param subject 主题
* @param content 内容
* @param attachments 附件 [为null则表示无附件]
* @throws Exception
*/
public static void sendEmail(String toRecipient, String[] ccRecipient,
String subject, String content, String... attachments) throws Exception {
sendEmail(SEND_ADDRESS, ACCOUNT, PASSWORD, toRecipient, ccRecipient, subject, content, attachments);
} /**
* 发送邮件[使用指定的发件人信息]
*
* @param sendAddress 发送人地址
* @param account 发送人账号
* @param password 发送人密码
* @param toRecipient 接收人地址
* @param ccRecipient 抄送人地址 [为null则不抄送]
* @param subject 主题
* @param content 内容
* @param attachments 附件 [为null则表示无附件]
* @throws Exception
*/
public static void sendEmail(String sendAddress, String account, String password,
String toRecipient, String[] ccRecipient,
String subject, String content, String... attachments) throws Exception {
log.info("发送人: [{}], 接收人: [{}], 抄送人: {}, 主题: [{}], 内容: [{}], 附件: {}", sendAddress, toRecipient, ccRecipient, subject, content, attachments);
// ===== 参数校验
checkParam(sendAddress, "sender address cannot be empty!");
checkParam(account, "sender account cannot be empty!");
checkParam(password, "sender password cannot be empty!");
checkParam(toRecipient, "recipient address cannot be empty!");
checkParam(subject, "mail subject cannot be empty!");
checkParam(content, "mail content cannot be empty!");
// ===== 创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getInstance(PROPERTIES);
// ===== 创建邮件的实例对象
Message msg = getMimeMessage(session, sendAddress, toRecipient, ccRecipient, subject, content, attachments);
// ===== 根据session对象获取邮件传输对象Transport
Transport transport = session.getTransport();
// ----- 设置发件人的账户名和密码
transport.connect(account, password);
// ----- 发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(msg, msg.getAllRecipients());
// ===== 关闭邮件连接
transport.close();
} /**
* 获得创建一封邮件的实例对象
*
* @param session session
* @param sendAddress 发送人地址
* @param toRecipient 接收人地址
* @param ccRecipient 抄送人地址
* @param subject 主题
* @param content 内容
* @param attachments 附件
* @return 邮件的实例对象
* @throws Exception
*/
private static MimeMessage getMimeMessage(Session session, String sendAddress,
String toRecipient, String[] ccRecipient,
String subject, String content, String... attachments) throws Exception {
// ----- 创建一封邮件的实例对象
MimeMessage msg = new MimeMessage(session);
// ===== 发件人地址
msg.setFrom(new InternetAddress(sendAddress));
// ===== 收件人地址
msg.setRecipients(MimeMessage.RecipientType.TO, toRecipient);
if (ArrayUtil.isNotEmpty(ccRecipient)) {
// ----- 抄送人
Address[] addresses = new InternetAddress[ccRecipient.length];
for (int i = 0; i < ccRecipient.length; i++) {
String cc = ccRecipient[i];
checkParam(cc, "Cc address cannot be empty!");
addresses[i] = new InternetAddress(cc);
}
msg.setRecipients(MimeMessage.RecipientType.CC, addresses);
}
// ===== 邮件主题
msg.setSubject(subject, UTF_8);
// ===== 邮件处理附件
if (ArrayUtil.isEmpty(attachments)) {
// ----- 邮件正文
msg.setContent(content, CONTENT_TYPE);
} else {
// ----- 附件
MimeMultipart mm = new MimeMultipart();
// ----- 邮件正文
MimeBodyPart text = new MimeBodyPart();
text.setContent(content, CONTENT_TYPE);
mm.addBodyPart(text);
// ----- 处理附件
for (String path : attachments) {
if (StringUtils.isBlank(path)) {
continue;
}
// ===== 创建附件节点
MimeBodyPart attachment = new MimeBodyPart();
// ----- 读取本地文件
DataHandler dh = new DataHandler(new FileDataSource(path));
// ----- 将附件数据添加到节点
attachment.setDataHandler(dh);
// ----- 设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dh.getName(), UTF_8, null));
mm.addBodyPart(attachment);
}
mm.setSubType("mixed");
msg.setContent(mm);
}
// ----- 设置邮件的发送时间,默认立即发送
msg.setSentDate(new Date());
return msg;
} /**
* 参数校验
*
* @param str 参数
* @param msg 异常信息
*/
private static void checkParam(String str, String msg) {
if (StringUtils.isBlank(str)) {
throw new RuntimeException(msg);
}
}
}

关于使用JavaMail发送邮件的更多相关文章

  1. JavaMail发送邮件

    发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄 ...

  2. JavaMail发送邮件第一版

    首先,我们先来了解一个基本的知识点,用什么工具来发邮件? 简单的说一下,目前用的比较多的客户端:OutLook,Foxmail等 顺便了解一下POP3.SMTP协议的区别: POP3,全名为" ...

  3. web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  4. JavaMail发送邮件的笔记及Demo

    最近碰到一个需求,就是注册用户时候需要向用户发送激活邮箱,于是照着网上搜来的demo自己试着运行了一下,发件时我用的是网易163邮箱,收件时用QQ邮箱,运行后报了一个错误: 网络上搜索解决方式,多次尝 ...

  5. web应用中使用JavaMail发送邮件 。。转载

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  6. (转载)JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

    博客源地址:http://www.cnblogs.com/xdp-gacl/p/4220190.html 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件 ...

  7. JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  8. javamail发送邮件的简单实例

    今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接 ...

  9. javamail发送邮件的简单实例(转)

    今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 注意:要先导入javamail的mail.jar ...

  10. javamail发送邮件的简单实例(转)

    javamail发送邮件的简单实例 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码 ...

随机推荐

  1. odoo 8.0 多核启用

    对于很多企业来说,随着时间的推移,用户量或者企业建点扩张,使用erp就会出现应用访问越来越慢的情况, 其实这种情况不但限于erp,只要是有数据量增长的互联网业务必然会遇到的,因为一开始的是就没有做好大 ...

  2. K8s 学习者绝对不能错过的最全知识图谱(内含 56个知识点链接)

    导读:Kubernetes 作为云原生时代的“操作系统”,熟悉和使用它是每名用户的必备技能.本篇文章概述了容器服务 Kubernetes 的知识图谱,部分内容参考了网上的知识图谱,旨在帮助用户更好的了 ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  4. 读书笔记--Head First JavaScript 目录

    1.交互式网络 2.存储数据 3.探索客户端 4.决策 5.循环 6.函数 7.表单与验证 8.驾驭网页 9.为数据带来生命 10.创建自定义对象 11.除错务尽 12.动态数据

  5. linux操作系统清除报错Disk /dev/mapper/ddf1_4c53492....

    现象描述 Disk /dev/mapper/ddf1_4c5349202020202010000055000000004711471100000a28p1: 666.0 GB, 66600088934 ...

  6. Ubuntu 16.04 配置 L2tp 客户端

    #install lib -dev libsecret--dev libgtk--dev libglib2.-dev xl2tpd strongswan #install network-manage ...

  7. vim 查找及替换

    #全文(%)查找(s)行首2个空格开头(/^ ), 替换(g)为无即删掉(//) :%s/^ //g #全文查找每行尾的2个空格,删除 :%s/ $//g

  8. 数据库--sql语句

    数据库的操作语句总共四大类:增insert into  删delete  改update  查select; 增:INSERT INTO `表名`(`字段名`,`字段名`) `VALUES`('值', ...

  9. centos 安装nginx + 多个tomcat负载均衡

    今天在centos上安装了两个tomcat和nginx,进行配置.今天记录的只是最基本的实现测试.(不包含使用redis进行session共享) Nginx 是一款轻量级的Web 服务器/反向代理服务 ...

  10. 通过inputSplit分片size控制map数目

    前言:在具体执行Hadoop程序的时候,我们要根据不同的情况来设置Map的个数.除了设置固定的每个节点上可运行的最大map个数外,我们还需要控制真正执行Map操作的任务个数. 1.如何控制实际运行的m ...