package com.example.test.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.net.NetUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 发送邮件工具
*
* @author 陈学冬杭州分冬
*/
@Slf4j
public class MailSendUtil {
/*********************************** 需要修改的配置 开始 ***************************************/
/**
* 邮件参数
*/
public static final List<MailAccount> MAIL_ACCOUNT_LIST = CollUtil.newArrayList(
initMailAccount("发送邮件的邮箱1@163.com", "ABVYBZDLAWIGQBGE")
, initMailAccount("发送邮件的邮箱2@163.com", "NMISTNGOYQMXYBUN")
, initMailAccount("发送邮件的邮箱3@163.com", "FPIYNFZBNAEQKMQN")
, initMailAccount("发送邮件的邮箱4@163.com", "ZXUWEGHWPGXBXBIQ")
, initMailAccount("发送邮件的邮箱5@163.com", "OPGKTDTYZLYWXFPM")
);
/**
* 邮件接收人
*/
public static final ArrayList<String> TOS = CollUtil.newArrayList("接收邮件的邮箱@qq.com");
/*********************************** 需要修改的配置 结束 ***************************************/
/*********************************** 准备工作 开始 ***************************************/
/**
* 获取本机网卡IP地址
*/
public static final String LOCALHOST_STR = NetUtil.getLocalhostStr();
/**
* 邮件list下标
*/
public static int SUBSCRIPT = 0;
/**
* 发送邮件失败次数
*/
public static int fail = 0;
/**
* 更换邮件参数列表下标
*/
private static void updateSUBSCRIPT() {
//配置list下标+1
int i = SUBSCRIPT + 1;
//如果没超出总量就直接赋值
if (i < MAIL_ACCOUNT_LIST.size()) {
SUBSCRIPT = i;
//超出了则归0计数
} else {
SUBSCRIPT = 0;
}
}
/**
* 通过下标获取生效的邮件参数
*
* @return
*/
public static MailAccount getMailAccount() {
return MAIL_ACCOUNT_LIST.get(SUBSCRIPT);
}
/**
* 初始化邮件参数
*
* @param from
* @param pass
*/
private static MailAccount initMailAccount(String from, String pass) {
MailAccount mailAccount = new MailAccount();
mailAccount.setPort(465);
mailAccount.setSslEnable(true);
mailAccount.setFrom(from);
mailAccount.setPass(pass);
return mailAccount;
}
/*********************************** 准备工作 结束 ***************************************/
/*********************************** 发送方法 开始 ***************************************/
/**
* 发送普通文本邮件
*
* @param subject
* @param content
*/
public static void mailSend(String subject, String content) {
Thread thread = new Thread(new MailSend(subject, content));
thread.start();
}
/**
* 发送普通文本邮件(给线程用)
*
* @param subject
* @param content
*/
public static void mailSendRunnable(String subject, String content) {
//如果发送失败次数大于了邮件配置list,说明每个配置都试过了都不成功,则不再重试,并打印报错信息
if (fail > MAIL_ACCOUNT_LIST.size()) {
// log.info("邮件发送失败:{}", MAIL_ACCOUNT_LIST);
return;
}
try {
//尝试发送邮件
MailUtil.send(
//拖过下标获取生效的邮件参数
getMailAccount(),
//发送人
TOS,
//当前ip地址(可以知道是哪台机子发的) + 标题
LOCALHOST_STR + subject,
//正文
content, false);
//如果未发生异常,则把失败次数归零
fail = 0;
} catch (Exception e) {
//发送失败则失败次数+1
fail++;
//获取邮件list的下标更新
updateSUBSCRIPT();
//递归
mailSendRunnable(subject, content);
}
}
/**
* 带文件的发送邮件
*
* @param subject
* @param content
* @param file
*/
public static void mailSend(String subject, String content, MultipartFile file) {
Thread thread = new Thread(new MailSendFile(subject, content, file));
thread.start();
}
/**
* 带文件的发送邮件(给线程用)
*
* @param subject
* @param content
*/
public static void mailSendRunnable(String subject, String content, boolean isHtml, File... files) {
if (fail > MAIL_ACCOUNT_LIST.size()) {
// log.info("邮件发送失败:{}", MAIL_ACCOUNT_LIST);
return;
}
try {
MailUtil.send(getMailAccount(), TOS, LOCALHOST_STR + subject, content, isHtml, files);
fail = 0;
} catch (Exception e) {
fail++;
updateSUBSCRIPT();
mailSendRunnable(subject, content, isHtml, files);
}
}
/*********************************** 发送方法 结束 ***************************************/
/****************************************** 多线程类 开始 ******************************************************/
@Data
private static class MailSend implements Runnable {
private String subject;
private String content;
private MailSend(String subject, String content) {
super();
this.subject = subject;
this.content = content;
}
@Override
public void run() {
MailSendUtil.mailSendRunnable(subject, content);
}
}
@Data
private static class MailSendFile implements Runnable {
private String subject;
private String content;
private MultipartFile file;
private MailSendFile(String subject, String content, MultipartFile file) {
super();
this.subject = subject;
this.content = content;
this.file = file;
}
@Override
public void run() {
if (file != null) {
File file2 = null;
try {
//获取原始文件名
String originalFilename = file.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
//创建临时文件
file2 = File.createTempFile(filename[0], "." + filename[1]);
//把网络文件转移至临时文件
file.transferTo(file2);
//发送邮件
MailSendUtil.mailSendRunnable(subject, content, true, file2);
//删除临时文件
file2.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/****************************************** 多线程类 结束 ******************************************************/
}
java发送邮件工具
最新推荐文章于 2024-05-31 09:04:52 发布