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. JS获取页面,元素,窗口和返回页面,元素,窗口的宽高以及滚动值

    jquery获取页面,元素,窗口的宽高以及滚动值 //获取浏览器显示区域(可视区域)的高度 : $(window).height(); //获取浏览器显示区域(可视区域)的宽度 : $(window) ...

  2. windows 环境下搭建docker私有仓库

    windows 环境下搭建docker私有仓库 1.在公用仓库中pull仓库镜像 docker pull regitry 2.启动仓库镜像 //-d意思是后台运行,-p是做端口映射,这里是将本地的50 ...

  3. 使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决

    应用场景 我们希望通过缓存来减少对关系型数据库的查询次数,减轻数据库压力.在执行DAO类的select***(), query***()方法时,先从Redis中查询有没有缓存数据,如果有则直接从Red ...

  4. MySQL--修改Mac中的默认编码

    1.在终端中进入到etc目录下 2.打开etc目录下的my.cnf文件(如果这样修改不了的就要提高用户权限, 可以尝试使用sudo来打开文件) 3.将一下内容添加到my.cnf文件中 [client] ...

  5. MyBatis中动态加载where条件

    1.trim 2.where 1 = 1 where 1=1 <if test="beginDate !=null and beginDate !='' "> and ...

  6. sar磁盘I/O统计数据

    sar是一个研究磁盘I/O的优秀工具.以下是sar磁盘I/O输出的一个示例. 第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像sar数据收集器那样.表3-3列出了字段和说明. 表3-3    ...

  7. ML面试1000题系列(51-60)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 51.简单说下sigmoid激活函数 常用的非线 ...

  8. HR招聘_(四)_招聘方法论(简历筛选)

    .主动投递 筛选时需要看学历背景,公司平台,所在时间,岗位职责,项目经验几个部分,根据对岗位需求和企业文化选择合适的候选人. 筛选简历建议分岗位筛选,切记误操作或大意淘汰优秀候选人. .搜索下载 互联 ...

  9. 使用pip安装pymysql

    本人使用的python版本是3.6,该版本是自带有pip.可以直接通过pip工具进行安装pymysql: 第一步:找到pip.exe路径. 例如我安装的目录如下,自带的pip工具的python版本,在 ...

  10. python 模块 chardet下载及介绍

    python 模块 chardet下载及介绍   在处理字符串时,常常会遇到不知道字符串是何种编码,如果不知道字符串的编码就不能将字符串转换成需要的编码.面对多种不同编码的输入方式,是否会有一种有效的 ...