编写Html模板邮件发送方法

This commit is contained in:
wind 2023-06-09 17:41:16 +08:00
parent a45df3ea28
commit 1b8eed8f5d
3 changed files with 198 additions and 77 deletions

View File

@ -48,7 +48,17 @@ public interface MailClient {
*/
void sendEmail(List<String> mailAddress, String title, String body, String... files);
/**
* 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
@ -59,8 +69,21 @@ public interface MailClient {
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName, Map<String,Object> parameter);
*/
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
@ -73,7 +96,20 @@ public interface MailClient {
* @param parameter 实体
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName, Parameter parameter);
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,String...files);
/**
* sendHtml
@ -86,14 +122,14 @@ public interface MailClient {
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title , String htmlName,Map<String,Object> parameter,String...files);
void sendHtml(List<String> mailAddress, String title , String htmlName,Map<String,String> parameter,String...files);
/**
* sendHtml
* <p> 读取模板发送html邮件,无正文带附件
* <p> 将默认读取resources/template下的html文件第三个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址添加多个
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param htmlName 邮件模板名称
* @param parameter 实体
@ -102,6 +138,33 @@ public interface MailClient {
*/
void sendHtml(String mailAddress, String title , String htmlName,Parameter parameter,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,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邮件,并携带正文
@ -113,7 +176,21 @@ public interface MailClient {
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Map<String,Object> parameter);
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
@ -127,7 +204,21 @@ public interface MailClient {
* @param parameter 实体
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Parameter parameter);
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 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Map<String,String> parameter,String...files);
/**
* sendHtml
@ -141,7 +232,23 @@ public interface MailClient {
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Map<String,Object> parameter,String...files);
void sendHtml(List<String> mailAddress, String title ,String body, String htmlName, Map<String,String> parameter,String...files);
/**
* sendHtml
* <p> 读取模板发送html邮件,并携带正文和附件
* <p> 将默认读取resources/template下的html文件第四个参数为html的名称需携带尾缀
* <p> 用户可以自己编写一个实体类并实现Parameter接口编写get和set方法这样一来字段的名称则为模板变量名称对象的值则为模板变量的值
* @param mailAddress 收件人地址
* @param title 邮件标题
* @param body 邮件文本正文
* @param htmlName 邮件正文
* @param parameter key为模板的变量名称 无需携带大括号 value为模板变量所对应的值
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Parameter parameter,String...files);
/**
* sendHtml
@ -156,7 +263,7 @@ public interface MailClient {
* @param files 附件可添加多个
* @author :Wind
*/
void sendHtml(String mailAddress, String title ,String body, String htmlName, Parameter parameter,String...files);
void sendHtml(List<String> mailAddress, String title ,String body, String htmlName, Parameter parameter,String...files);
}

View File

@ -1,9 +1,9 @@
package org.dromara.email.comm.utils;
package org.dromara.email.core;
import org.dromara.email.api.Parameter;
import org.dromara.email.comm.errors.MailException;
import java.lang.reflect.Field;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.Map;
@ -19,14 +19,14 @@ public class ReflectUtil {
/**
* 将对象的属性和属性值变为map
* */
public static Map<String, Object> getValues(Parameter parameter) {
public static Map<String, String> getValues(Parameter parameter) {
try {
Map<String ,Object> map = new HashMap<>();
Map<String ,String> map = new HashMap<>();
Class<?> clazz = Class.forName(getObjectName(parameter));
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
map.put(declaredField.getName(),declaredField.get(parameter));
map.put(declaredField.getName(), (String) declaredField.get(parameter));
}
return map;
} catch (Exception e) {

View File

@ -1,11 +1,12 @@
package org.dromara.email.core.service;
import lombok.extern.slf4j.Slf4j;
import org.dromara.email.api.Blacklist;
import org.dromara.email.api.MailClient;
import org.dromara.email.api.Parameter;
import org.dromara.email.comm.errors.MailException;
import org.dromara.email.comm.utils.BaseUtil;
import org.dromara.email.comm.utils.HtmlUtil;
import org.dromara.email.core.ReflectUtil;
import javax.activation.DataHandler;
import javax.activation.DataSource;
@ -32,17 +33,17 @@ public class MailService implements MailClient {
@Override
public void sendMail(String mailAddress, String title, String body) {
sendEmail(mailAddress,title,body);
sendEmail(mailAddress, title, body);
}
@Override
public void sendMail(List<String> mailAddress, String title, String body) {
sendEmail(mailAddress,title,body);
sendEmail(mailAddress, title, body);
}
@Override
public void sendEmail(String mailAddress, String title, String body, String... files) {
sendEmail(Collections.singletonList(mailAddress),title,body,files);
sendEmail(Collections.singletonList(mailAddress), title, body, files);
}
@Override
@ -53,14 +54,7 @@ public class MailService implements MailClient {
message.setSubject(title);
message.setText(body);
Multipart multipart = new MimeMultipart();
for (String file : files) {
// 设置附件消息部分
MimeBodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(BaseUtil.getPathName(file));
multipart.addBodyPart(messageBodyPart);
}
forFiles(multipart, files);
message.setContent(multipart);
Transport.send(message);
@ -70,92 +64,112 @@ public class MailService implements MailClient {
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Map<String, Object> parameter) {
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, new String[0]);
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Parameter parameter) {
sendHtml(Collections.singletonList(mailAddress), title, htmlName, parameter);
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Map<String, Object> parameter, String... files) {
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, String... files) {
sendHtml(mailAddress, title, "", htmlName, parameter, files);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String htmlName, Map<String, String> parameter, String... files) {
sendHtml(mailAddress, title, "", htmlName, parameter, files);
}
@Override
public void sendHtml(String mailAddress, String title, String htmlName, Parameter parameter, String... files) {
sendHtml(mailAddress, title, htmlName, ReflectUtil.getValues(parameter), files);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Map<String, Object> parameter) {
public void sendHtml(List<String> mailAddress, String title, String htmlName, Parameter parameter, 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, new String[0]);
}
@Override
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Map<String, String> parameter) {
sendHtml(mailAddress, title, body, htmlName, parameter, new String[0]);
}
@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(String mailAddress, String title, String body, String htmlName, Map<String, Object> parameter, String... files) {
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Parameter parameter) {
sendHtml(mailAddress, title, body, htmlName, parameter, new String[0]);
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter, String... files) {
public void sendHtml(String mailAddress, String title, String body, String htmlName, Map<String, String> parameter, String... files) {
sendHtml(Collections.singletonList(mailAddress), title, body, htmlName, parameter, files);
}
@Override
public void sendHtml(String mailAddress, String Title, String body) {
String smtpServer = "smtp.qq.com";
String username = "wzsf1810@qq.com";
String password = "xophzbzswkzkiacb";
String fromAddress = "wzsf1810@qq.com";
String toAddress = "291203727@qq.com";
int port = 465; // SMTP服务器的端口号
Properties props = new Properties();
props.put("mail.smtp.host", smtpServer);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port);
props.put("mail.smtp.ssl.enable", "true");
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
public void sendHtml(List<String> mailAddress, String title, String body, String htmlName, Map<String, String> parameter, String... files) {
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromAddress));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddress));
message.setSubject(Title);
// 创建 MimeMultipart 对象
MimeMultipart multipart = new MimeMultipart("related");
// 创建 MimeBodyPart 对象并将 HTML 内容添加到 MimeMultipart
Message message = mailBuild.getMessage();
message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(mailAddress));
message.setSubject(title);
message.setText(body);
Multipart multipart = new MimeMultipart();
//读取模板并进行变量替换
List<String> strings = HtmlUtil.replacePlaceholder(HtmlUtil.readHtml(htmlName), parameter);
//拼合HTML数据
String htmlData = HtmlUtil.pieceHtml(strings);
//添加附件
forFiles(multipart, files);
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(body, "text/html;charset=UTF-8");
message.setContent(multipart);
htmlPart.setContent(htmlData, "text/html;charset=UTF-8");
multipart.addBodyPart(htmlPart);
MimeBodyPart messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
Transport.send(message);
System.out.println("Email sent successfully.");
} catch (MessagingException e) {
throw new MailException(e);
}
}
@Override
public void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter, 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, String... files) {
sendHtml(mailAddress, title, body, htmlName, ReflectUtil.getValues(parameter), files);
}
private void forFiles(Multipart multipart, String[] files) throws MessagingException {
for (String file : files) {
// 设置附件消息部分
MimeBodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(BaseUtil.getPathName(file));
multipart.addBodyPart(messageBodyPart);
}
}
}