From 70c49db323866216442c3ceeb4815c9e3819f26c Mon Sep 17 00:00:00 2001 From: tiejiaxiaobao <2922035952@qq.com> Date: Thu, 20 Jul 2023 11:58:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=82=AE=E4=BB=B6=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84=EF=BC=9B=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=9B=B8=E5=85=B3=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../email/core/service/MailService.java | 315 +++++++++++++----- 1 file changed, 229 insertions(+), 86 deletions(-) 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 ff4b780f..95f593a2 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 @@ -33,9 +33,11 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; public class MailService implements MailClient { + private static Logger logger = Logger.getLogger("mailLog"); private MailBuild mailBuild; private MailService(MailBuild mailBuild) { @@ -61,26 +63,6 @@ public class MailService implements MailClient { sendEmail(Collections.singletonList(mailAddress), title, body, files); } - @Override - public void sendEmail(String mailAddress, String title, String body, String zipName, Map files) { - try { - 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); - } - Transport.send(message); - } catch (MessagingException | IOException e) { - throw new MailException(e); - } - } - @Override public void sendEmail(List mailAddress, String title, String body, Map files) { sendEmail(mailAddress, title, body, null, null, files); @@ -91,27 +73,6 @@ public class MailService implements MailClient { sendEmail(Collections.singletonList(mailAddress), title, body, cc, bcc, files); } - @Override - public void sendEmail(List mailAddress, String title, String body, List cc, List bcc, Map files) { - try { - 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); - Transport.send(message); - } catch (MessagingException e) { - throw new MailException(e); - } - } - @Override public void sendEmail(MailMessage mailMessage) { sendEmail(mailMessage.getMailAddress(), @@ -187,38 +148,6 @@ public class MailService implements MailClient { sendHtml(Collections.singletonList(mailAddress), title, body, htmlName, parameter, files); } - @Override - public void sendHtml(String mailAddress, String title, String body, String htmlName, Map parameter, String zipName, Map files) { - try { - 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 strings = HtmlUtil.replacePlaceholder(HtmlUtil.readHtml(htmlName), parameter); - //拼合HTML数据 - String htmlData = HtmlUtil.pieceHtml(strings); - if (StrUtil.isNotBlank(body)) { - // 创建文本正文部分 - MimeBodyPart textPart = new MimeBodyPart(); - textPart.setText(body); - multipart.addBodyPart(textPart); - } - //添加附件 - if (MapUtil.isNotEmpty(files)) { - zipFiles(multipart, zipName, files); - } - MimeBodyPart htmlPart = new MimeBodyPart(); - htmlPart.setContent(htmlData, "text/html;charset=UTF-8"); - multipart.addBodyPart(htmlPart); - message.setContent(multipart); - Transport.send(message); - } catch (MessagingException | IOException e) { - throw new MailException(e); - } - } - @Override public void sendHtml(String mailAddress, String title, String body, String htmlName, Parameter parameter, String zipName, Map files) { sendHtml(mailAddress, title, body, htmlName, ReflectUtil.getValues(parameter), zipName, files); @@ -364,19 +293,74 @@ public class MailService implements MailClient { try { Message message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc); Transport.send(message); + logger.info("邮件发送成功!^_^"); } catch (MessagingException e) { - ReSend(mailAddress, - title, - body, - html, - parameter, - files, - cc, - bcc); + // 防止 maxRetries 数值小于0带来的其他问题 + if (mailBuild.getMaxRetries() > 0){ + ReSendList(mailAddress, + title, + body, + html, + parameter, + files, + cc, + bcc); + } else { + logger.warning(e.getMessage()); + throw new MailException(e); + } } } - private void ReSend(List mailAddress, + @Override + public void sendEmail(List mailAddress, String title, String body, List cc, List bcc, Map 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 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 parameter, String zipName, Map 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); + } else { + logger.warning(e.getMessage()); + throw new MailException(e); + } + } + } + + private void ReSendList(List mailAddress, String title, String body, List html, @@ -385,12 +369,18 @@ public class MailService implements MailClient { List cc, List bcc) { int maxRetries = mailBuild.getMaxRetries(); - int retryCount = 0; + int retryCount = 1; // 初始值为1;则while循环中少发送一次,最后一次发送在判断 retryCount >= maxRetries 这里。 boolean retryOnFailure = true; while (retryOnFailure && retryCount < maxRetries) { try { - Message message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc); + logger.warning("邮件第 {" + retryCount + "} 次重新发送"); + Message message; + if (html != null || parameter != null){ + message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc); + } else { + message = messageBuild(mailAddress, title, body, cc, bcc, files); + } Transport.send(message); retryOnFailure = false; // 发送成功,停止重试 } catch (MessagingException e) { @@ -404,11 +394,91 @@ public class MailService implements MailClient { } } - if (retryCount >= maxRetries) { - throw new MailException(new MailException()); + if (retryCount >= maxRetries && retryOnFailure) { + try { + Message message; + if (html != null || parameter != null){ + message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc); + } else { + message = messageBuild(mailAddress, title, body, cc, bcc, files); + } + Transport.send(message); + } catch (MessagingException e) { + throw new MailException(e); + } } } + public void ReSendList(List mailAddress, + String title, + String body, + List cc, + List bcc, + Map files) { + ReSendList(mailAddress, title, body, null, null, files, cc, bcc); + } + + private void ReSend(String mailAddress, + String title, + String body, + String htmlName, + Map parameter, + String zipName, + Map 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 files) { + ReSend(mailAddress, title, body, null, null, zipName, files); + } + + // messageBuild 方法重载 private Message messageBuild(List mailAddress, String title, String body, @@ -445,6 +515,79 @@ public class MailService implements MailClient { return message; } + public Message messageBuild(List mailAddress, + String title, + String body, + List cc, + List bcc, + Map files) throws MessagingException { + 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 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 parameter, + String zipName, + Map 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 strings = HtmlUtil.replacePlaceholder(HtmlUtil.readHtml(htmlName), parameter); + //拼合HTML数据 + String htmlData = HtmlUtil.pieceHtml(strings); + if (StrUtil.isNotBlank(body)) { + // 创建文本正文部分 + MimeBodyPart textPart = new MimeBodyPart(); + textPart.setText(body); + multipart.addBodyPart(textPart); + } + //添加附件 + if (MapUtil.isNotEmpty(files)) { + zipFiles(multipart, zipName, files); + } + MimeBodyPart htmlPart = new MimeBodyPart(); + htmlPart.setContent(htmlData, "text/html;charset=UTF-8"); + multipart.addBodyPart(htmlPart); + message.setContent(multipart); + return message; + } + private void addCC(List cc, List bcc, Message message) throws MessagingException { if (cc != null && cc.size() > 0) { message.addRecipients(Message.RecipientType.CC, mailBuild.eliminate(cc));