!87 update 简化 MailService 代码

Merge pull request !87 from 疯狂的狮子Li/dev-3.0.x-xiaoyan
This commit is contained in:
风如歌 2023-09-04 00:43:20 +00:00 committed by Gitee
commit 57dc15df1f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 119 additions and 993 deletions

View File

@ -2,453 +2,13 @@ package org.dromara.email.api;
import org.dromara.email.comm.entity.MailMessage;
import java.io.InputStream;
import java.lang.String;
import java.util.List;
import java.util.Map;
public interface MailClient {
/**
* sendMail
* <p> 发送纯文本邮件
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件正文
* @author :Wind
*/
void sendMail(String mailAddress, String title ,String body);
/**
* sendMail
* <p> 群体发送纯文本邮件
* @param mailAddress 收件人地址,添加多个
* @param title 邮件标题
* @param body 邮件正文
* @author :Wind
*/
void sendMail(List<String> mailAddress ,String title ,String body);
/**
* sendEmail
* <p>发送带有附件的文本邮件
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件正文
* @param files 附件可添加多个
* @author :Wind
*/
void sendEmail(String mailAddress, String title, String body,Map<String,String> files);
/**
* sendEmail
* <p>发送带有附件的文本邮件
* @param mailAddress 收件人地址 多个收件人地址请按英文','字符隔开
* @param title 邮件标题
* @param body 邮件正文
* @param zipName 压缩包名称 比如 附件.zip
* @param files 附件可添加多个
* @author :Wind
*/
void sendEmail(String mailAddress, String title, String body, String zipName, Map<String,String> files);
/**
* sendEmail
* <p>群体发送带有附件的文本邮件
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件正文
* @param files 附件可添加多个
* @author :Wind
*/
void sendEmail(List<String> mailAddress, String title, String body, Map<String,String> files);
/**
* sendEmail
* <p>单人发送带有附件的文本邮件,同时可以携带密送人和抄送人
* <p>需要注意的是密送人和抄送人也不能存在于黑名单内否则也会被过滤
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件正文
* @param files 附件可添加多个
* @author :Wind
*/
void sendEmail(String mailAddress, String title, String body,List<String> cc,List<String> bcc,Map<String,String> files);
/**
* sendEmail
* <p>群体发送带有附件的文本邮件,同时可以携带密送人和抄送人
* <p>需要注意的是密送人和抄送人也不能存在于黑名单内否则也会被过滤
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件正文
* @param files 附件可添加多个
* @param bcc 密送人
* @param cc 抄送人
* @author :Wind
*/
void sendEmail(List<String> mailAddress, String title, String body,List<String> cc,List<String> bcc,Map<String,String> files);
/**
* sendEmail
* <p> 发送邮件可以通过对象构造群体发送或者单体发送取决于添加进去的收件人同时可以添加
* 密送人抄送人附件等参数
* @param mailMessage 发送邮件参数对象
* @author :Wind
*/
void sendEmail(MailMessage mailMessage);
/**
* sendHtml
* <p> 读取模板发送html邮件无正文
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName, Map<String,String> parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件无正文
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title , String htmlName, Map<String,String> parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName, Parameter parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title , String htmlName, Parameter parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文带附件
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName,Map<String,String> parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文带附件
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title , String htmlName,Map<String,String> parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文带附件
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName,Parameter parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文带附件
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title , String htmlName,Parameter parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Map<String,String> parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title ,String body, String htmlName, Map<String,String> parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter 实体
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Parameter parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter 实体
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title ,String body, String htmlName, Parameter parameter);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Map<String,String> parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址 多个收件人地址请按英文','字符隔开
* @param title 邮件标题
* @param body 邮件文本正文 可为空
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @param zipName 压缩包名称 比如 附件.zip
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :bleachtred
*/
void sendHtml(String mailAddress, String title, String body, String htmlName, Map<String,String> parameter, String zipName, Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址 多个收件人地址请按英文','字符隔开
* @param title 邮件标题
* @param body 邮件文本正文 可为空
* @param htmlName 邮件正文
* @param parameter 字段名称为变量名称字段值为变量值
* @param zipName 压缩包名称 比如 附件.zip
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter, String zipName, Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title ,String body, String htmlName, Map<String,String> parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter 字段名称为变量名称字段值为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Parameter parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter 字段名称为变量名称字段值为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title ,String body, String htmlName, Parameter parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 从用户给定的输入流获取html模板文件
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param html html模板的输入流这个流可以来自任何来源例如网络请求或是本地文件或者对象存储等
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title , String body, InputStream html, Map<String, String> parameter, Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 从用户给定的输入流获取html模板文件
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param html html模板的输入流,这个流可以来自任何来源例如网络请求或是本地文件或者对象存储等
* @param parameter 字段名称为变量名称字段值为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title ,String body, InputStream html, Parameter parameter,Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 从用户给定的输入流获取html模板文件
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param html html模板的输入流,这个流可以来自任何来源例如网络请求或是本地文件或者对象存储等
* @param parameter key为变量名称value为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @param cc 抄送人可添加多个
* @param bcc 密送人可添加多个
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title,String body,InputStream html,List<String> cc,List<String> bcc,Map<String, String> parameter, Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 从用户给定的输入流获取html模板文件
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param html html模板的输入流,这个流可以来自任何来源例如网络请求或是本地文件或者对象存储等
* @param parameter 字段名称为变量名称字段值为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @param cc 抄送人可添加多个
* @param bcc 密送人可添加多个
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title,String body,InputStream html,List<String> cc,List<String> bcc,Parameter parameter, Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 从用户给定的输入流获取html模板文件
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param html html模板的名称
* @param parameter 字段名称为变量名称字段值为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @param cc 抄送人可添加多个
* @param bcc 密送人可添加多个
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title,String body,String html,List<String> cc,List<String> bcc,Map<String, String> parameter, Map<String,String> files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 从用户给定的输入流获取html模板文件
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param title 邮件标题
* @param body 邮件文本正文
* @param html html模板的名称
* @param parameter 字段名称为变量名称字段值为变量值
* @param files 附件可添加多个 key 为文件名value为文件的路径
* @param cc 抄送人可添加多个
* @param bcc 密送人可添加多个
* @author :Wind
*/
void sendHtml(List<String> mailAddress, String title,String body,String html,List<String> cc,List<String> bcc,Parameter parameter, Map<String,String> files);
/**
* sendHtml
* <p> 发送邮件可以通过对象构造群体发送或者单体发送取决于添加进去的收件人同时可以添加
* 发送邮件可以通过对象构造群体发送或者单体发送取决于添加进去的收件人同时可以添加
* 密送人抄送人附件等参数
* @param mailMessage 发送邮件参数对象
* @author :Wind
*/
void sendHtml(MailMessage mailMessage);
void send(MailMessage mailMessage);
}

View File

@ -1,5 +1,8 @@
package org.dromara.email.comm.entity;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import lombok.Builder;
import lombok.Getter;
import java.io.InputStream;
@ -9,136 +12,62 @@ import java.util.List;
import java.util.Map;
@Getter
@Builder
public class MailMessage {
/** 收件人地址*/
private List<String> mailAddress;
/**
* 收件人地址
*/
private String mailAddress;
/** 邮件主题*/
/**
* 收件人地址多人(优先使用)
*/
private List<String> mailAddressList;
/**
* 邮件主题
*/
private String title;
/** 文字正文*/
/**
* 文字正文
*/
private String body;
/** html模板文件路径resources目录下的路径*/
/**
* html模板文件路径resources目录下的路径
*/
private String htmlPath;
/** html模板文件的输入流可来自任意可读取位置*/
/**
* html模板文件的输入流可来自任意可读取位置
*/
private InputStream htmlInputStream;
/** html 模板参数*/
private Map<String,String> htmlValues;
/**
* html 模板参数
*/
private Map<String, String> htmlValues;
/** 抄送人*/
/**
* zip文件名称
*/
private String zipName;
/**
* 抄送人
*/
private List<String> cc;
/** 密送人*/
/**
* 密送人
*/
private List<String> bcc;
/** 附件*/
private Map<String,String> files;
/**
* 附件
*/
private Map<String, String> files;
public static MailsBuilder Builder(){
return new MailsBuilder();
}
static class MailsBuilder{
private final MailMessage mailMessage = new MailMessage();
public MailsBuilder() {
}
public MailMessage build(){
return mailMessage;
}
public MailsBuilder setMailAddress(List<String> mailAddress) {
mailMessage.mailAddress = mailAddress;
return this;
}
public MailsBuilder setMailAddress(String mailAddress){
if ( mailMessage.mailAddress == null){
mailMessage.mailAddress = new ArrayList<>();
}
mailMessage.mailAddress.add(mailAddress);
return this;
}
public MailsBuilder setTitle(String title){
mailMessage.title = title;
return this;
}
public MailsBuilder setBody(String body){
mailMessage.body = body;
return this;
}
public MailsBuilder setCc(List<String> cc){
mailMessage.cc = cc;
return this;
}
public MailsBuilder setCc(String cc){
if (mailMessage.cc == null){
mailMessage.cc = new ArrayList<>();
}
mailMessage.cc.add(cc);
return this;
}
public MailsBuilder setBcc(List<String> bcc){
mailMessage.bcc = bcc;
return this;
}
public MailsBuilder setBcc(String bcc){
if (mailMessage.bcc == null){
mailMessage.bcc = new ArrayList<>();
}
mailMessage.bcc.add(bcc);
return this;
}
public MailsBuilder setFiles(Map<String, String> files){
if (mailMessage.files == null){
mailMessage.files = new HashMap<>();
}
mailMessage.files.putAll(files);
return this;
}
public MailsBuilder setFiles(String fileName,String filePath){
if (mailMessage.files == null){
mailMessage.files = new HashMap<>();
}
mailMessage.files.put(fileName,filePath);
return this;
}
public MailsBuilder setHtmlPath(String htmlPath){
mailMessage.htmlPath = htmlPath;
return this;
}
public MailsBuilder setHtmlInputStream(InputStream htmlInputStream){
mailMessage.htmlInputStream = htmlInputStream;
return this;
}
public MailsBuilder setHtmlValues(String key, String value){
if (mailMessage.files == null){
mailMessage.files = new HashMap<>();
}
mailMessage.htmlValues.put(key,value);
return this;
}
public MailsBuilder setHtmlValues(Map<String,String> htmlValues){
if (mailMessage.files == null){
mailMessage.files = new HashMap<>();
}
mailMessage.htmlValues.putAll(htmlValues);
return this;
}
}
}

View File

@ -72,10 +72,10 @@ public class MailBuild {
}
public static MailClient build(MailSmtpConfig config) throws MessagingException {
return MailService.NewMailService(new MailBuild(config));
return MailService.instance(new MailBuild(config));
}
public static MailClient build(MailSmtpConfig config,Blacklist blacklist)throws MessagingException {
return MailService.NewMailService(new MailBuild(config,blacklist));
return MailService.instance(new MailBuild(config,blacklist));
}
/**

View File

@ -1,5 +1,6 @@
package org.dromara.email.core.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.UUID;
@ -7,13 +8,11 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import org.dromara.email.api.MailClient;
import org.dromara.email.api.Parameter;
import org.dromara.email.comm.constants.FileConstants;
import org.dromara.email.comm.entity.MailMessage;
import org.dromara.email.comm.errors.MailException;
import org.dromara.email.comm.utils.HtmlUtil;
import org.dromara.email.comm.utils.ZipUtils;
import org.dromara.email.core.ReflectUtil;
import javax.activation.DataHandler;
import javax.activation.DataSource;
@ -28,8 +27,6 @@ import javax.mail.util.ByteArrayDataSource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@ -44,211 +41,37 @@ public class MailService implements MailClient {
this.mailBuild = mailBuild;
}
public static MailClient NewMailService(MailBuild mailBuild) {
public static MailClient instance(MailBuild mailBuild) {
return new MailService(mailBuild);
}
@Override
public void sendMail(String mailAddress, String title, String body) {
sendEmail(mailAddress, title, body, null);
}
@Override
public void sendMail(List<String> mailAddress, String title, String body) {
sendEmail(mailAddress, title, body, null);
}
@Override
public void sendEmail(String mailAddress, String title, String body, Map<String, String> files) {
sendEmail(Collections.singletonList(mailAddress), title, body, files);
}
@Override
public void sendEmail(List<String> mailAddress, String title, String body, Map<String, String> files) {
sendEmail(mailAddress, title, body, null, null, files);
}
@Override
public void sendEmail(String mailAddress, String title, String body, List<String> cc, List<String> bcc, Map<String, String> files) {
sendEmail(Collections.singletonList(mailAddress), title, body, cc, bcc, files);
}
@Override
public void sendEmail(MailMessage mailMessage) {
sendEmail(mailMessage.getMailAddress(),
public void send(MailMessage mailMessage) {
List<String> html;
if (mailMessage.getHtmlInputStream() == null) {
html = HtmlUtil.readHtml(mailMessage.getHtmlPath());
} else {
html = HtmlUtil.readHtml(mailMessage.getHtmlInputStream());
}
List<String> address;
if (CollUtil.isEmpty(mailMessage.getMailAddressList())) {
if (StrUtil.isBlank(mailMessage.getMailAddress())) {
throw new MailException("收件人地址不能为空!");
}
address = CollUtil.newArrayList(mailMessage.getMailAddress());
} else {
address = mailMessage.getMailAddressList();
}
send(address,
mailMessage.getTitle(),
mailMessage.getBody(),
html,
mailMessage.getHtmlValues(),
mailMessage.getZipName(),
mailMessage.getFiles(),
mailMessage.getCc(),
mailMessage.getBcc(),
mailMessage.getFiles());
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Map<String, String> parameter) {
sendHtml(Collections.singletonList(mailAddress), title, htmlName, parameter);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String htmlName, Map<String, String> parameter) {
sendHtml(mailAddress, title, htmlName, parameter, null);
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Parameter parameter) {
sendHtml(Collections.singletonList(mailAddress), title, htmlName, parameter);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String htmlName, Parameter parameter) {
sendHtml(mailAddress, title, htmlName, ReflectUtil.getValues(parameter));
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Map<String, String> parameter, Map<String, String> files) {
sendHtml(mailAddress, title, "", htmlName, parameter, files);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String htmlName, Map<String, String> parameter, Map<String, String> files) {
sendHtml(mailAddress, title, "", htmlName, parameter, files);
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Parameter parameter, Map<String, String> files) {
sendHtml(mailAddress, title, htmlName, ReflectUtil.getValues(parameter), files);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String htmlName, Parameter parameter, Map<String, String> files) {
sendHtml(mailAddress, title, htmlName, ReflectUtil.getValues(parameter), files);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Map<String, String> parameter) {
sendHtml(mailAddress, title, body, htmlName, parameter, null);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Map<String, String> parameter) {
sendHtml(mailAddress, title, body, htmlName, parameter, null);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter) {
sendHtml(Collections.singletonList(mailAddress), title, body, htmlName, parameter);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Parameter parameter) {
sendHtml(mailAddress, title, body, htmlName, parameter, null);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Map<String, String> parameter, Map<String, String> files) {
sendHtml(Collections.singletonList(mailAddress), title, body, htmlName, parameter, files);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter, String zipName, Map<String, String> files) {
sendHtml(mailAddress, title, body, htmlName, ReflectUtil.getValues(parameter), zipName, files);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Map<String, String> parameter, Map<String, String> files) {
send(mailAddress, title, body, HtmlUtil.readHtml(htmlName), parameter, files, null, null);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter, Map<String, String> files) {
sendHtml(Collections.singletonList(mailAddress), title, body, htmlName, parameter, files);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Parameter parameter, Map<String, String> files) {
sendHtml(mailAddress, title, body, htmlName, ReflectUtil.getValues(parameter), files);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, InputStream html, Map<String, String> parameter, Map<String, String> files) {
send(mailAddress, title, body, HtmlUtil.readHtml(html), parameter, files, null, null);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, InputStream html, Parameter parameter, Map<String, String> files) {
sendHtml(mailAddress, title, body, html, ReflectUtil.getValues(parameter), files);
}
@Override
public void sendHtml(List<String> mailAddress,
String title,
String body,
InputStream html,
List<String> cc,
List<String> bcc,
Map<String, String> parameter,
Map<String, String> files) {
send(mailAddress, title, body, HtmlUtil.readHtml(html), parameter, files, cc, bcc);
}
@Override
public void sendHtml(List<String> mailAddress,
String title,
String body,
InputStream html,
List<String> cc,
List<String> bcc,
Parameter parameter,
Map<String, String> files) {
send(mailAddress, title, body, HtmlUtil.readHtml(html), ReflectUtil.getValues(parameter), files, cc, bcc);
}
@Override
public void sendHtml(List<String> mailAddress,
String title,
String body,
String html,
List<String> cc,
List<String> bcc,
Map<String, String> parameter,
Map<String, String> files) {
send(mailAddress, title, body, HtmlUtil.readHtml(html), parameter, files, cc, bcc);
}
@Override
public void sendHtml(List<String> mailAddress,
String title,
String body,
String html,
List<String> cc,
List<String> bcc,
Parameter parameter,
Map<String, String> files) {
send(mailAddress, title, body, HtmlUtil.readHtml(html), ReflectUtil.getValues(parameter), files, cc, bcc);
}
@Override
public void sendHtml(MailMessage mailMessage) {
if (mailMessage.getHtmlInputStream() == null) {
sendHtml(mailMessage.getMailAddress(),
mailMessage.getTitle(),
mailMessage.getBody(),
mailMessage.getHtmlPath(),
mailMessage.getCc(),
mailMessage.getBcc(),
mailMessage.getHtmlValues(),
mailMessage.getFiles()
);
} else {
sendHtml(mailMessage.getMailAddress(),
mailMessage.getTitle(),
mailMessage.getBody(),
mailMessage.getHtmlInputStream(),
mailMessage.getCc(),
mailMessage.getBcc(),
mailMessage.getHtmlValues(),
mailMessage.getFiles()
);
}
mailMessage.getBcc()
);
}
private void forFiles(Multipart multipart, Map<String, String> files) throws MessagingException {
@ -261,7 +84,7 @@ public class MailService implements MailClient {
if (v.startsWith("http")) {
byte[] bytes = HttpUtil.downloadBytes(v);
source = new ByteArrayDataSource(bytes, FileConstants.IO_FILE_TYPE);
}else {
} else {
source = new FileDataSource(v);
}
messageBodyPart.setDataHandler(new DataHandler(source));
@ -287,72 +110,18 @@ public class MailService implements MailClient {
String body,
List<String> html,
Map<String, String> parameter,
String zipName,
Map<String, String> files,
List<String> cc,
List<String> bcc) {
try {
Message message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc);
Message message = messageBuild(mailAddress, title, body, html, parameter, zipName, cc, bcc, files);
Transport.send(message);
logger.info("邮件发送成功!^_^");
} catch (MessagingException e) {
} catch (MessagingException | IOException e) {
// 防止 maxRetries 数值小于0带来的其他问题
if (mailBuild.getMaxRetries() > 0){
ReSendList(mailAddress,
title,
body,
html,
parameter,
files,
cc,
bcc);
} else {
logger.warning(e.getMessage());
throw new MailException(e);
}
}
}
@Override
public void sendEmail(List<String> mailAddress, String title, String body, List<String> cc, List<String> bcc, Map<String, String> files) {
try {
Message message = messageBuild(mailAddress, title, body, cc, bcc, files);
Transport.send(message);
logger.info("邮件发送成功!^_^");
} catch (MessagingException e) {
if (mailBuild.getMaxRetries() > 0) {
ReSendList(mailAddress, title, body, cc, bcc, files);
} else {
logger.warning(e.getMessage());
throw new MailException(e);
}
}
}
@Override
public void sendEmail(String mailAddress, String title, String body, String zipName, Map<String, String> files) {
try {
Message message = messageBuild(mailAddress, title, body, zipName, files);
Transport.send(message);
logger.info("邮件发送成功!^_^");
} catch (MessagingException | IOException e) {
if (mailBuild.getMaxRetries() > 1) {
ReSend(mailAddress, title, body, zipName, files);
} else {
logger.warning(e.getMessage());
throw new MailException(e);
}
}
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Map<String, String> parameter, String zipName, Map<String, String> files) {
try {
Message message = messageBuild(mailAddress, title, body, htmlName, parameter, zipName, files);
Transport.send(message);
logger.info("邮件发送成功!^_^");
} catch (MessagingException | IOException e) {
if (mailBuild.getMaxRetries() > 1) {
ReSend(mailAddress, title, body, htmlName, parameter, zipName, files);
ReSendList(mailAddress, title, body, html, parameter, zipName, files, cc, bcc);
} else {
logger.warning(e.getMessage());
throw new MailException(e);
@ -361,13 +130,14 @@ public class MailService implements MailClient {
}
private void ReSendList(List<String> mailAddress,
String title,
String body,
List<String> html,
Map<String, String> parameter,
Map<String, String> files,
List<String> cc,
List<String> bcc) {
String title,
String body,
List<String> html,
Map<String, String> parameter,
String zipName,
Map<String, String> files,
List<String> cc,
List<String> bcc) {
int maxRetries = mailBuild.getMaxRetries();
int retryCount = 1; // 初始值为1则while循环中少发送一次最后一次发送在判断 retryCount >= maxRetries 这里
boolean retryOnFailure = true;
@ -376,14 +146,14 @@ public class MailService implements MailClient {
try {
logger.warning("邮件第 {" + retryCount + "} 次重新发送");
Message message;
if (html != null || parameter != null){
message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc);
if (html != null || parameter != null) {
message = messageBuild(mailAddress, title, body, html, parameter, zipName, cc, bcc, files);
} else {
message = messageBuild(mailAddress, title, body, cc, bcc, files);
message = messageBuild(mailAddress, title, body, null, null, zipName, cc, bcc, files);
}
Transport.send(message);
retryOnFailure = false; // 发送成功停止重试
} catch (MessagingException e) {
} catch (MessagingException | IOException e) {
retryCount++;
try {
// 间隔秒数
@ -397,180 +167,42 @@ public class MailService implements MailClient {
if (retryCount >= maxRetries && retryOnFailure) {
try {
Message message;
if (html != null || parameter != null){
message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc);
if (html != null || parameter != null) {
message = messageBuild(mailAddress, title, body, html, parameter, null, cc, bcc, files);
} else {
message = messageBuild(mailAddress, title, body, cc, bcc, files);
message = messageBuild(mailAddress, title, body, null, null, null, cc, bcc, files);
}
Transport.send(message);
} catch (MessagingException e) {
} catch (MessagingException | IOException e) {
throw new MailException(e);
}
}
}
public void ReSendList(List<String> mailAddress,
String title,
String body,
List<String> cc,
List<String> bcc,
Map<String, String> files) {
ReSendList(mailAddress, title, body, null, null, files, cc, bcc);
}
private void ReSend(String mailAddress,
String title,
String body,
String htmlName,
Map<String, String> parameter,
String zipName,
Map<String, String> files) {
int maxRetries = mailBuild.getMaxRetries();
int retryCount = 1; // 初始值为1则while循环中少发送一次最后一次发送在判断 retryCount >= maxRetries 这里
boolean retryOnFailure = true;
while (retryOnFailure && retryCount < maxRetries) {
try {
logger.warning("邮件第 {" + retryCount + "} 次重新发送");
if (htmlName != null || parameter != null){
Message message = messageBuild(mailAddress, title, body, htmlName, parameter, zipName, files);
Transport.send(message);
} else {
Message message = messageBuild(mailAddress, title, body, zipName, files);
Transport.send(message);
}
retryOnFailure = false; // 发送成功停止重试
} catch (MessagingException e) {
retryCount++;
try {
// 间隔秒数
TimeUnit.SECONDS.sleep(mailBuild.getRetryInterval());
} catch (InterruptedException ex) {
ex.printStackTrace();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (retryCount >= maxRetries && retryOnFailure) {
try {
if (htmlName != null || parameter != null){
Message message = messageBuild(mailAddress, title, body, htmlName, parameter, zipName, files);
Transport.send(message);
} else {
Message message = messageBuild(mailAddress, title, body, zipName, files);
Transport.send(message);
}
} catch (MessagingException e) {
throw new MailException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
private void ReSend(String mailAddress,
String title,
String body,
String zipName,
Map<String, String> files) {
ReSend(mailAddress, title, body, null, null, zipName, files);
}
// messageBuild 方法重载
private Message messageBuild(List<String> mailAddress,
String title,
String body,
List<String> html,
Map<String, String> parameter,
Map<String, String> files,
List<String> cc,
List<String> bcc) throws MessagingException {
Message message = mailBuild.getMessage();
message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(mailAddress));
message.setSubject(title);
Multipart multipart = new MimeMultipart("alternative");
// 读取模板并进行变量替换
List<String> strings = HtmlUtil.replacePlaceholder(html, parameter);
// 拼合HTML数据
String htmlData = HtmlUtil.pieceHtml(strings);
if (!body.isEmpty()) {
// 创建文本正文部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(body);
multipart.addBodyPart(textPart);
}
// 添加附件
if (files != null && files.size() != 0) {
forFiles(multipart, files);
}
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlData, "text/html;charset=UTF-8");
addCC(cc, bcc, message);
multipart.addBodyPart(htmlPart);
message.setContent(multipart);
return message;
}
public Message messageBuild(List<String> mailAddress,
String title,
String body,
List<String> html,
Map<String, String> parameter,
String zipName,
List<String> cc,
List<String> bcc,
Map<String, String> files) throws MessagingException {
Map<String, String> files) throws MessagingException, IOException {
Message message = mailBuild.getMessage();
message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(mailAddress));
message.setSubject(title);
if (StrUtil.isNotBlank(body)) {
message.setText(body);
}
if (files != null && files.size() != 0) {
Multipart multipart = new MimeMultipart();
forFiles(multipart, files);
message.setContent(multipart);
}
addCC(cc, bcc, message);
return message;
}
public Message messageBuild(String mailAddress,
String title,
String body,
String zipName,
Map<String, String> files) throws MessagingException, IOException {
Message message = mailBuild.getMessage();
message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(Convert.toList(String.class, mailAddress)));
message.setSubject(title);
if (StrUtil.isNotBlank(body)) {
message.setText(body);
}
if (files != null && files.size() != 0) {
Multipart multipart = new MimeMultipart();
zipFiles(multipart, zipName, files);
message.setContent(multipart);
}
return message;
}
public Message messageBuild(String mailAddress,
String title,
String body,
String htmlName,
Map<String, String> parameter,
String zipName,
Map<String, String> files) throws MessagingException, IOException {
Message message = mailBuild.getMessage();
message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(Convert.toList(String.class, mailAddress)));
message.setSubject(title);
Multipart multipart = new MimeMultipart("alternative");
//读取模板并进行变量替换
List<String> strings = HtmlUtil.replacePlaceholder(HtmlUtil.readHtml(htmlName), parameter);
//拼合HTML数据
String htmlData = HtmlUtil.pieceHtml(strings);
if (CollUtil.isNotEmpty(html) && MapUtil.isNotEmpty(parameter)) {
//读取模板并进行变量替换
List<String> strings = HtmlUtil.replacePlaceholder(html, parameter);
//拼合HTML数据
String htmlData = HtmlUtil.pieceHtml(strings);
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlData, "text/html;charset=UTF-8");
multipart.addBodyPart(htmlPart);
}
if (StrUtil.isNotBlank(body)) {
// 创建文本正文部分
MimeBodyPart textPart = new MimeBodyPart();
@ -578,21 +210,26 @@ public class MailService implements MailClient {
multipart.addBodyPart(textPart);
}
//添加附件
if (MapUtil.isNotEmpty(files)) {
if (MapUtil.isNotEmpty(files) && StrUtil.isNotBlank(zipName)) {
zipFiles(multipart, zipName, files);
} else {
if (MapUtil.isNotEmpty(files)) {
forFiles(multipart, files);
message.setContent(multipart);
}
}
if (CollUtil.isNotEmpty(cc) || CollUtil.isNotEmpty(bcc)) {
addCC(cc, bcc, message);
}
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlData, "text/html;charset=UTF-8");
multipart.addBodyPart(htmlPart);
message.setContent(multipart);
return message;
}
private void addCC(List<String> cc, List<String> bcc, Message message) throws MessagingException {
if (cc != null && cc.size() > 0) {
if (CollUtil.isNotEmpty(cc)) {
message.addRecipients(Message.RecipientType.CC, mailBuild.eliminate(cc));
}
if (bcc != null && bcc.size() > 0) {
if (CollUtil.isNotEmpty(bcc)) {
message.addRecipients(Message.RecipientType.BCC, mailBuild.eliminate(bcc));
}
}