From c08af08f53beb303bc85c1e3bca49ee5519f0b75 Mon Sep 17 00:00:00 2001 From: tiejiaxiaobao <2922035952@qq.com> Date: Tue, 18 Jul 2023 22:02:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=87=8D=E8=AF=95=E5=8A=9F=E8=83=BD=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../email/comm/config/MailSmtpConfig.java | 12 ++ .../dromara/email/core/service/MailBuild.java | 8 ++ .../email/core/service/MailService.java | 104 +++++++++++++----- 3 files changed, 99 insertions(+), 25 deletions(-) diff --git a/sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/config/MailSmtpConfig.java b/sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/config/MailSmtpConfig.java index 8bc58211..aec4d63e 100644 --- a/sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/config/MailSmtpConfig.java +++ b/sms4j-Email-plugin/sms4j-Email-comm/src/main/java/org/dromara/email/comm/config/MailSmtpConfig.java @@ -52,4 +52,16 @@ public class MailSmtpConfig { * */ @Builder.Default private String isAuth = "true"; + + /** + * 重试间隔(单位:秒),默认为5秒 + */ + @Builder.Default + private int retryInterval = 5; + + /** + * 重试次数,默认为1次 + */ + @Builder.Default + private int maxRetries = 1; } diff --git a/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailBuild.java b/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailBuild.java index f0938607..23450063 100644 --- a/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailBuild.java +++ b/sms4j-Email-plugin/sms4j-Email-core/src/main/java/org/dromara/email/core/service/MailBuild.java @@ -27,6 +27,10 @@ public class MailBuild { private Blacklist blacklist; + private int retryInterval; + + private int maxRetries; + private MailBuild(MailSmtpConfig config) throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", config.getSmtpServer()); @@ -42,6 +46,8 @@ public class MailBuild { this.message = new MimeMessage(session); this.message.setFrom(new InternetAddress(config.getFromAddress())); this.config = config; + this.retryInterval = config.getRetryInterval(); + this.maxRetries = config.getMaxRetries(); } private MailBuild(MailSmtpConfig config,Blacklist blacklist)throws MessagingException{ @@ -61,6 +67,8 @@ public class MailBuild { this.message.setFrom(new InternetAddress(config.getFromAddress())); this.config = config; this.blacklist = blacklist; + this.retryInterval = config.getRetryInterval(); + this.maxRetries = config.getMaxRetries(); } public static MailClient build(MailSmtpConfig config) throws MessagingException { 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 ca76ac5d..ff4b780f 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 @@ -32,6 +32,7 @@ import java.io.InputStream; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; public class MailService implements MailClient { @@ -361,36 +362,89 @@ public class MailService implements MailClient { List cc, List bcc) { try { - Message message = mailBuild.getMessage(); - message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(mailAddress)); - message.setSubject(title); - - Multipart multipart = new MimeMultipart("alternative"); - //读取模板并进行变量替换 - List 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); + Message message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc); Transport.send(message); } catch (MessagingException e) { - throw new MailException(e); + ReSend(mailAddress, + title, + body, + html, + parameter, + files, + cc, + bcc); } } + private void ReSend(List mailAddress, + String title, + String body, + List html, + Map parameter, + Map files, + List cc, + List bcc) { + int maxRetries = mailBuild.getMaxRetries(); + int retryCount = 0; + boolean retryOnFailure = true; + + while (retryOnFailure && retryCount < maxRetries) { + try { + Message message = messageBuild(mailAddress, title, body, html, parameter, files, cc, bcc); + Transport.send(message); + retryOnFailure = false; // 发送成功,停止重试 + } catch (MessagingException e) { + retryCount++; + try { + // 间隔秒数 + TimeUnit.SECONDS.sleep(mailBuild.getRetryInterval()); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + } + + if (retryCount >= maxRetries) { + throw new MailException(new MailException()); + } + } + + private Message messageBuild(List mailAddress, + String title, + String body, + List html, + Map parameter, + Map files, + List cc, + List bcc) throws MessagingException { + Message message = mailBuild.getMessage(); + message.setRecipients(Message.RecipientType.TO, mailBuild.eliminate(mailAddress)); + message.setSubject(title); + + Multipart multipart = new MimeMultipart("alternative"); + // 读取模板并进行变量替换 + List 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; + } + 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));