From b0a69f88f08916678ea590c101fabe7c654d7b79 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Sun, 26 Nov 2023 20:15:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Mail=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=85=8D=E7=BD=AE=EF=BC=88=E6=B6=88=E6=81=AF=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- continew-starter-dependencies/pom.xml | 7 + .../continew-starter-messaging-mail/pom.xml | 25 ++ .../autoconfigure/MailAutoConfiguration.java | 40 +++ .../messaging/mail/util/MailUtils.java | 241 ++++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../main/resources/default-messaging-mail.yml | 3 + continew-starter-messaging/pom.xml | 1 + 7 files changed, 318 insertions(+) create mode 100644 continew-starter-messaging/continew-starter-messaging-mail/pom.xml create mode 100644 continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/autoconfigure/MailAutoConfiguration.java create mode 100644 continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/util/MailUtils.java create mode 100644 continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/default-messaging-mail.yml diff --git a/continew-starter-dependencies/pom.xml b/continew-starter-dependencies/pom.xml index 564caf11..399dcf56 100644 --- a/continew-starter-dependencies/pom.xml +++ b/continew-starter-dependencies/pom.xml @@ -221,6 +221,13 @@ ${revision} + + + top.charles7c.continew + continew-starter-messaging-mail + ${revision} + + top.charles7c.continew diff --git a/continew-starter-messaging/continew-starter-messaging-mail/pom.xml b/continew-starter-messaging/continew-starter-messaging-mail/pom.xml new file mode 100644 index 00000000..12a838a9 --- /dev/null +++ b/continew-starter-messaging/continew-starter-messaging-mail/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + top.charles7c.continew + continew-starter-messaging + ${revision} + + + continew-starter-messaging-mail + jar + + ${project.artifactId} + ContiNew Starter 消息模块 - 邮件 + + + + + org.springframework.boot + spring-boot-starter-mail + + + \ No newline at end of file diff --git a/continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/autoconfigure/MailAutoConfiguration.java b/continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/autoconfigure/MailAutoConfiguration.java new file mode 100644 index 00000000..cf0b1d43 --- /dev/null +++ b/continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/autoconfigure/MailAutoConfiguration.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.continew.starter.messaging.mail.autoconfigure; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.PropertySource; +import top.charles7c.continew.starter.core.handler.GeneralPropertySourceFactory; + +/** + * 邮件自动配置 + * + * @author Charles7c + * @since 1.0.0 + */ +@Slf4j +@AutoConfiguration +@PropertySource(value = "classpath:default-messaging-mail.yml", factory = GeneralPropertySourceFactory.class) +public class MailAutoConfiguration { + + @PostConstruct + public void postConstruct() { + log.info("[ContiNew Starter] - Auto Configuration 'Mail' completed initialization."); + } +} diff --git a/continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/util/MailUtils.java b/continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/util/MailUtils.java new file mode 100644 index 00000000..884b8e9b --- /dev/null +++ b/continew-starter-messaging/continew-starter-messaging-mail/src/main/java/top/charles7c/continew/starter/messaging/mail/util/MailUtils.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.continew.starter.messaging.mail.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; +import lombok.AccessLevel; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import top.charles7c.continew.starter.core.constant.StringConstants; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 邮件工具类 + * + * @author Charles7c + * @since 1.0.0 + */ +@Data +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MailUtils { + + private static final JavaMailSender MAIL_SENDER = SpringUtil.getBean(JavaMailSender.class); + + /** + * 发送文本邮件给单个人 + * + * @param subject + * 主题 + * @param content + * 内容 + * @param to + * 收件人 + * @throws MessagingException + * / + */ + public static void sendText(String to, String subject, String content) throws MessagingException { + send(splitAddress(to), null, null, subject, content, false); + } + + /** + * 发送 HTML 邮件给单个人 + * + * @param subject + * 主题 + * @param content + * 内容 + * @param to + * 收件人 + * @throws MessagingException + * / + */ + public static void sendHtml(String to, String subject, String content) throws MessagingException { + send(splitAddress(to), null, null, subject, content, true); + } + + /** + * 发送 HTML 邮件给单个人 + * + * @param subject + * 主题 + * @param content + * 内容 + * @param to + * 收件人 + * @param files + * 附件列表 + * @throws MessagingException + * / + */ + public static void sendHtml(String to, String subject, String content, File... files) throws MessagingException { + send(splitAddress(to), null, null, subject, content, true, files); + } + + /** + * 发送 HTML 邮件给多个人 + * + * @param subject + * 主题 + * @param content + * 内容 + * @param tos + * 收件人列表 + * @param files + * 附件列表 + * @throws MessagingException + * / + */ + public static void sendHtml(Collection tos, String subject, String content, File... files) + throws MessagingException { + send(tos, null, null, subject, content, true, files); + } + + /** + * 发送 HTML 邮件给多个人 + * + * @param subject + * 主题 + * @param content + * 内容 + * @param tos + * 收件人列表 + * @param ccs + * 抄送人列表 + * @param files + * 附件列表 + * @throws MessagingException + * / + */ + public static void sendHtml(Collection tos, Collection ccs, String subject, String content, + File... files) throws MessagingException { + send(tos, ccs, null, subject, content, true, files); + } + + /** + * 发送 HTML 邮件给多个人 + * + * @param subject + * 主题 + * @param content + * 内容 + * @param tos + * 收件人列表 + * @param ccs + * 抄送人列表 + * @param bccs + * 密送人列表 + * @param files + * 附件列表 + * @throws MessagingException + * / + */ + public static void sendHtml(Collection tos, Collection ccs, Collection bccs, String subject, + String content, File... files) throws MessagingException { + send(tos, ccs, bccs, subject, content, true, files); + } + + /** + * 发送邮件给多个人 + * + * @param tos + * 收件人列表 + * @param ccs + * 抄送人列表 + * @param bccs + * 密送人列表 + * @param subject + * 主题 + * @param content + * 内容 + * @param isHtml + * 是否是 HTML + * @param files + * 附件列表 + * @throws MessagingException + * / + */ + public static void send(Collection tos, Collection ccs, Collection bccs, String subject, + String content, boolean isHtml, File... files) throws MessagingException { + Assert.isTrue(CollUtil.isEmpty(tos), "请至少指定一名收件人"); + MimeMessage mimeMessage = MAIL_SENDER.createMimeMessage(); + MimeMessageHelper messageHelper = + new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.displayName()); + + // 设置基本信息 + messageHelper.setFrom(SpringUtil.getProperty("spring.mail.username")); + messageHelper.setSubject(subject); + messageHelper.setText(content, isHtml); + + // 设置收信人 + // 抄送人 + if (CollUtil.isNotEmpty(ccs)) { + messageHelper.setCc(ccs.toArray(String[]::new)); + } + // 密送人 + if (CollUtil.isNotEmpty(bccs)) { + messageHelper.setBcc(bccs.toArray(String[]::new)); + } + // 收件人 + messageHelper.setTo(tos.toArray(String[]::new)); + + // 设置附件 + if (ArrayUtil.isNotEmpty(files)) { + for (File file : files) { + messageHelper.addAttachment(file.getName(), file); + } + } + + // 发送邮件 + MAIL_SENDER.send(mimeMessage); + } + + /** + * 将多个联系人转为列表,分隔符为逗号或者分号 + * + * @param addresses + * 多个联系人,如果为空返回null + * @return 联系人列表 + */ + private static List splitAddress(String addresses) { + if (StrUtil.isBlank(addresses)) { + return new ArrayList<>(0); + } + + List result; + if (StrUtil.contains(addresses, StringConstants.COMMA)) { + result = StrUtil.splitTrim(addresses, StringConstants.COMMA); + } else if (StrUtil.contains(addresses, StringConstants.SEMICOLON)) { + result = StrUtil.splitTrim(addresses, StringConstants.SEMICOLON); + } else { + result = CollUtil.newArrayList(addresses); + } + return result; + } +} diff --git a/continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..edc6f607 --- /dev/null +++ b/continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +top.charles7c.continew.starter.messaging.mail.autoconfigure.MailAutoConfiguration \ No newline at end of file diff --git a/continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/default-messaging-mail.yml b/continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/default-messaging-mail.yml new file mode 100644 index 00000000..64d37d44 --- /dev/null +++ b/continew-starter-messaging/continew-starter-messaging-mail/src/main/resources/default-messaging-mail.yml @@ -0,0 +1,3 @@ +--- ### 邮件配置 +spring.mail: + default-encoding: utf-8 \ No newline at end of file diff --git a/continew-starter-messaging/pom.xml b/continew-starter-messaging/pom.xml index 12e626af..77268b49 100644 --- a/continew-starter-messaging/pom.xml +++ b/continew-starter-messaging/pom.xml @@ -17,6 +17,7 @@ continew-starter-messaging-sms + continew-starter-messaging-mail