From 1b8eed8f5d1790c6a2acfaf8d7761495f74abba1 Mon Sep 17 00:00:00 2001 From: wind Date: Fri, 9 Jun 2023 17:41:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E5=86=99Html=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/email/api/MailClient.java | 127 ++++++++++++++-- .../org/dromara/email/core}/ReflectUtil.java | 10 +- .../email/core/service/MailService.java | 138 ++++++++++-------- 3 files changed, 198 insertions(+), 77 deletions(-) rename sms4j-Email-plugin/{sms4j-Email-comm/src/main/java/org/dromara/email/comm/utils => sms4j-Email-core/src/main/java/org/dromara/email/core}/ReflectUtil.java (74%) diff --git a/sms4j-Email-plugin/sms4j-Email-api/src/main/java/org/dromara/email/api/MailClient.java b/sms4j-Email-plugin/sms4j-Email-api/src/main/java/org/dromara/email/api/MailClient.java index 5316ac93..579c2c6d 100644 --- a/sms4j-Email-plugin/sms4j-Email-api/src/main/java/org/dromara/email/api/MailClient.java +++ b/sms4j-Email-plugin/sms4j-Email-api/src/main/java/org/dromara/email/api/MailClient.java @@ -48,7 +48,17 @@ public interface MailClient { */ void sendEmail(List mailAddress, String title, String body, String... files); - + /** + * sendHtml + *

读取模板发送html邮件,无正文 + *

将默认读取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 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 parameter); + */ + void sendHtml(List mailAddress, String title , String htmlName, Map parameter); + + /** + * sendHtml + *

读取模板发送html邮件,无正文 + *

将默认读取resources/template下的html文件,第三个参数为html的名称,需携带尾缀 + *

用户可以自己编写一个实体类,并实现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 mailAddress, String title , String htmlName, Parameter parameter); + + /** + * sendHtml + *

读取模板发送html邮件,无正文,带附件 + *

将默认读取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 parameter,String...files); /** * sendHtml @@ -86,14 +122,14 @@ public interface MailClient { * @param files 附件,可添加多个 * @author :Wind */ - void sendHtml(String mailAddress, String title , String htmlName,Map parameter,String...files); + void sendHtml(List mailAddress, String title , String htmlName,Map parameter,String...files); /** * sendHtml *

读取模板发送html邮件,无正文,带附件 *

将默认读取resources/template下的html文件,第三个参数为html的名称,需携带尾缀 *

用户可以自己编写一个实体类,并实现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 + *

读取模板发送html邮件,无正文,带附件 + *

将默认读取resources/template下的html文件,第三个参数为html的名称,需携带尾缀 + *

用户可以自己编写一个实体类,并实现Parameter接口,编写get和set方法,这样一来字段的名称则为模板变量名称,对象的值则为模板变量的值 + * @param mailAddress 收件人地址,添加多个 + * @param title 邮件标题 + * @param htmlName 邮件模板名称 + * @param parameter 实体 + * @param files 附件,可添加多个 + * @author :Wind + */ + void sendHtml(List mailAddress, String title , String htmlName,Parameter parameter,String...files); + + /** + * sendHtml + *

读取模板发送html邮件,并携带正文 + *

将默认读取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 parameter); + /** * sendHtml *

读取模板发送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 parameter); + void sendHtml(List mailAddress, String title ,String body, String htmlName, Map parameter); + + /** + * sendHtml + *

读取模板发送html邮件,并携带正文 + *

将默认读取resources/template下的html文件,第四个参数为html的名称,需携带尾缀 + *

用户可以自己编写一个实体类,并实现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 mailAddress, String title ,String body, String htmlName, Parameter parameter); + + /** + * sendHtml + *

读取模板发送html邮件,并携带正文和附件 + *

将默认读取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 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 parameter,String...files); + void sendHtml(List mailAddress, String title ,String body, String htmlName, Map parameter,String...files); + + /** + * sendHtml + *

读取模板发送html邮件,并携带正文和附件 + *

将默认读取resources/template下的html文件,第四个参数为html的名称,需携带尾缀 + *

用户可以自己编写一个实体类,并实现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 mailAddress, String title ,String body, String htmlName, Parameter parameter,String...files); } diff --git a/sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/utils/ReflectUtil.java b/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/ReflectUtil.java similarity index 74% rename from sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/utils/ReflectUtil.java rename to sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/ReflectUtil.java index cb29aedd..df5aaa0c 100644 --- a/sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/utils/ReflectUtil.java +++ b/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/ReflectUtil.java @@ -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 getValues(Parameter parameter) { + public static Map getValues(Parameter parameter) { try { - Map map = new HashMap<>(); + Map 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) { diff --git a/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailService.java b/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailService.java index 9c046da1..9ebe4295 100644 --- a/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailService.java +++ b/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailService.java @@ -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 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 parameter) { + public void sendHtml(String mailAddress, String title, String htmlName, Map parameter) { + sendHtml(Collections.singletonList(mailAddress), title, htmlName, parameter); + } + @Override + public void sendHtml(List mailAddress, String title, String htmlName, Map 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 parameter, String... files) { + public void sendHtml(List 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 parameter, String... files) { + sendHtml(mailAddress, title, "", htmlName, parameter, files); + } + + @Override + public void sendHtml(List mailAddress, String title, String htmlName, Map 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 parameter) { + public void sendHtml(List 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 parameter) { + sendHtml(mailAddress, title, body, htmlName, parameter, new String[0]); + } + + @Override + public void sendHtml(List mailAddress, String title, String body, String htmlName, Map 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 parameter, String... files) { - + public void sendHtml(List 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 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 mailAddress, String title, String body, String htmlName, Map 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 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 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); + } + } }