From 92f030887b45604744d488131a506abbda14b4b5 Mon Sep 17 00:00:00 2001
From: zlyx <1242874891@qq.com>
Date: 星期一, 02 五月 2022 21:21:14 +0800
Subject: [PATCH] [add]: 1. (common) pom.xml - 增加邮件依赖 ; 2. (admin) application-dev.yml - 增加邮件配置 ; 3. (framework) MailProperties, MailConfig - 增加邮件属性配置 ; 4. (common) MailUtils - 重写 Hutool MailUtil方法 ; 5. (demo) MailController - 邮件发送测试方法 ;
---
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MailConfig.java | 39 +++
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/MailProperties.java | 65 +++++
pom.xml | 1
ruoyi-common/src/main/java/com/ruoyi/common/utils/email/MailUtils.java | 468 +++++++++++++++++++++++++++++++++++++++
ruoyi-common/pom.xml | 6
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java | 54 ++++
ruoyi-admin/src/main/resources/application-dev.yml | 28 ++
7 files changed, 661 insertions(+), 0 deletions(-)
diff --git a/pom.xml b/pom.xml
index 4fc098f..71963f2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@
<dynamic-ds.version>3.5.1</dynamic-ds.version>
<tlog.version>1.3.6</tlog.version>
<xxl-job.version>2.3.0</xxl-job.version>
+ <mail.version>1.6.2</mail.version>
<!-- jdk11 缂哄け渚濊禆 jaxb-->
<jaxb.version>3.0.1</jaxb.version>
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 45eb5be..50e060b 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -137,6 +137,34 @@
# 鏄惁寮�鍚痵sl
ssl: false
+ # 閭欢
+ mail:
+ enabled: false
+ # 閭欢鏈嶅姟鍦板潃 (enabled = true 鏃舵墦寮�璇ラ厤缃�)
+# host: smtp.qq.com
+ # 鐢ㄦ埛鍚�
+ username: xxx@qq.com
+ # 鎺堟潈鐮� (璁剧疆 - 璐︽埛 - POP3/SMTP鏈嶅姟)
+ password: xxx
+ # QQ閭鍔犲瘑绔彛锛屼笉鍚岄偖绠辩殑绔彛涓嶄竴鏍�
+ port: 465
+ properties:
+ mail:
+ smtp:
+ socketFactory:
+ class: javax.net.ssl.SSLSocketFactory
+ ssl:
+ trust: smtp.qq.com
+ # 鏄惁闇�瑕佺敤鎴疯璇�
+ auth: true
+ starttls:
+ # 鍚敤TLS鍔犲瘑
+ enable: true
+ required: true
+ # 浼犺緭鍗忚 starttls.enable = true 鏃朵负 smtps
+ protocol: smtps
+ debug: true
+
redisson:
# 绾跨▼姹犳暟閲�
threads: 4
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index bb476cb..fd6a999 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -159,6 +159,12 @@
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.sun.mail</groupId>
+ <artifactId>javax.mail</artifactId>
+ <version>${mail.version}</version>
+ </dependency>
+
</dependencies>
</project>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/email/MailUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/email/MailUtils.java
new file mode 100644
index 0000000..92fa89a
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/email/MailUtils.java
@@ -0,0 +1,468 @@
+package com.ruoyi.common.utils.email;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.CharUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.mail.*;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import javax.mail.Authenticator;
+import javax.mail.Session;
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 閭欢宸ュ叿绫�
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class MailUtils {
+
+ private static final MailAccount ACCOUNT = SpringUtils.getBean(MailAccount.class);
+
+ /**
+ * 鑾峰彇閭欢鍙戦�佸疄渚�
+ */
+ public static MailAccount getMailAccount() {
+ return ACCOUNT;
+ }
+
+ /**
+ * 鑾峰彇閭欢鍙戦�佸疄渚� (鑷畾涔夊彂閫佷汉浠ュ強鎺堟潈鐮�)
+ *
+ * @param username 鍙戦�佷汉
+ * @param password 鎺堟潈鐮�
+ */
+ public static MailAccount getMailAccount(String username, String password) {
+ ACCOUNT.setFrom(StringUtils.blankToDefault(username, ACCOUNT.getUser()));
+ ACCOUNT.setUser(StringUtils.blankToDefault(username, ACCOUNT.getUser()));
+ ACCOUNT.setPass(StringUtils.blankToDefault(password, ACCOUNT.getPass()));
+ return ACCOUNT;
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�佹枃鏈偖浠讹紝鍙戦�佺粰鍗曚釜鎴栧涓敹浠朵汉<br>
+ * 澶氫釜鏀朵欢浜哄彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String sendText(String to, String subject, String content, File... files) {
+ return send(to, subject, content, false, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�丠TML閭欢锛屽彂閫佺粰鍗曚釜鎴栧涓敹浠朵汉<br>
+ * 澶氫釜鏀朵欢浜哄彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String sendHtml(String to, String subject, String content, File... files) {
+ return send(to, subject, content, true, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佸崟涓垨澶氫釜鏀朵欢浜�<br>
+ * 澶氫釜鏀朵欢浜哄彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ */
+ public static String send(String to, String subject, String content, boolean isHtml, File... files) {
+ return send(splitAddress(to), subject, content, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佸崟涓垨澶氫釜鏀朵欢浜�<br>
+ * 澶氫釜鏀朵欢浜恒�佹妱閫佷汉銆佸瘑閫佷汉鍙互浣跨敤閫楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜猴紝鍙互浣跨敤閫楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ * @param cc 鎶勯�佷汉锛屽彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ * @param bcc 瀵嗛�佷汉锛屽彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.0.3
+ */
+ public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) {
+ return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�佹枃鏈偖浠讹紝鍙戦�佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ */
+ public static String sendText(Collection<String> tos, String subject, String content, File... files) {
+ return send(tos, subject, content, false, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�丠TML閭欢锛屽彂閫佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String sendHtml(Collection<String> tos, String subject, String content, File... files) {
+ return send(tos, subject, content, true, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ */
+ public static String send(Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
+ return send(tos, null, null, subject, content, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param ccs 鎶勯�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param bccs 瀵嗛�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.0.3
+ */
+ public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
+ return send(getMailAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files);
+ }
+
+ // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢璁よ瘉瀵硅薄
+ * @param to 鏀朵欢浜猴紝澶氫釜鏀朵欢浜洪�楀彿鎴栬�呭垎鍙烽殧寮�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) {
+ return send(mailAccount, splitAddress(to), subject, content, isHtml, files);
+ }
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢甯愭埛淇℃伅
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ */
+ public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
+ return send(mailAccount, tos, null, null, subject, content, isHtml, files);
+ }
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢甯愭埛淇℃伅
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param ccs 鎶勯�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param bccs 瀵嗛�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.0.3
+ */
+ public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
+ return send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�丠TML閭欢锛屽彂閫佺粰鍗曚釜鎴栧涓敹浠朵汉<br>
+ * 澶氫釜鏀朵欢浜哄彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String sendHtml(String to, String subject, String content, Map<String, InputStream> imageMap, File... files) {
+ return send(to, subject, content, imageMap, true, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佸崟涓垨澶氫釜鏀朵欢浜�<br>
+ * 澶氫釜鏀朵欢浜哄彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ */
+ public static String send(String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ return send(splitAddress(to), subject, content, imageMap, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佸崟涓垨澶氫釜鏀朵欢浜�<br>
+ * 澶氫釜鏀朵欢浜恒�佹妱閫佷汉銆佸瘑閫佷汉鍙互浣跨敤閫楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ *
+ * @param to 鏀朵欢浜猴紝鍙互浣跨敤閫楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ * @param cc 鎶勯�佷汉锛屽彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ * @param bcc 瀵嗛�佷汉锛屽彲浠ヤ娇鐢ㄩ�楀彿鈥�,鈥濆垎闅旓紝涔熷彲浠ラ�氳繃鍒嗗彿鈥�;鈥濆垎闅�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.0.3
+ */
+ public static String send(String to, String cc, String bcc, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�丠TML閭欢锛屽彂閫佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String sendHtml(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, File... files) {
+ return send(tos, subject, content, imageMap, true, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ */
+ public static String send(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ return send(tos, null, null, subject, content, imageMap, isHtml, files);
+ }
+
+ /**
+ * 浣跨敤閰嶇疆鏂囦欢涓缃殑璐︽埛鍙戦�侀偖浠讹紝鍙戦�佺粰澶氫汉
+ *
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param ccs 鎶勯�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param bccs 瀵嗛�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.0.3
+ */
+ public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ return send(getMailAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
+ }
+
+ // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢璁よ瘉瀵硅薄
+ * @param to 鏀朵欢浜猴紝澶氫釜鏀朵欢浜洪�楀彿鎴栬�呭垎鍙烽殧寮�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 3.2.0
+ */
+ public static String send(MailAccount mailAccount, String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ return send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files);
+ }
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢甯愭埛淇℃伅
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.6.3
+ */
+ public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ return send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files);
+ }
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢甯愭埛淇℃伅
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param ccs 鎶勯�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param bccs 瀵嗛�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:$IMAGE_PLACEHOLDER
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.6.3
+ */
+ public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap,
+ boolean isHtml, File... files) {
+ return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
+ }
+
+ /**
+ * 鏍规嵁閰嶇疆鏂囦欢锛岃幏鍙栭偖浠跺鎴风浼氳瘽
+ *
+ * @param mailAccount 閭欢璐︽埛閰嶇疆
+ * @param isSingleton 鏄惁鍗曚緥锛堝叏灞�鍏变韩浼氳瘽锛�
+ * @return {@link Session}
+ * @since 5.5.7
+ */
+ public static Session getSession(MailAccount mailAccount, boolean isSingleton) {
+ Authenticator authenticator = null;
+ if (mailAccount.isAuth()) {
+ authenticator = new UserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass());
+ }
+
+ return isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) //
+ : Session.getInstance(mailAccount.getSmtpProps(), authenticator);
+ }
+
+ // ------------------------------------------------------------------------------------------------------------------------ Private method start
+
+ /**
+ * 鍙戦�侀偖浠剁粰澶氫汉
+ *
+ * @param mailAccount 閭欢甯愭埛淇℃伅
+ * @param useGlobalSession 鏄惁鍏ㄥ眬鍏变韩Session
+ * @param tos 鏀朵欢浜哄垪琛�
+ * @param ccs 鎶勯�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param bccs 瀵嗛�佷汉鍒楄〃锛屽彲浠ヤ负null鎴栫┖
+ * @param subject 鏍囬
+ * @param content 姝f枃
+ * @param imageMap 鍥剧墖涓庡崰浣嶇锛屽崰浣嶇鏍煎紡涓篶id:${cid}
+ * @param isHtml 鏄惁涓篐TML鏍煎紡
+ * @param files 闄勪欢鍒楄〃
+ * @return message-id
+ * @since 4.6.3
+ */
+ private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content,
+ Map<String, InputStream> imageMap, boolean isHtml, File... files) {
+ final Mail mail = Mail.create(mailAccount).setUseGlobalSession(useGlobalSession);
+
+ // 鍙�夋妱閫佷汉
+ if (CollUtil.isNotEmpty(ccs)) {
+ mail.setCcs(ccs.toArray(new String[0]));
+ }
+ // 鍙�夊瘑閫佷汉
+ if (CollUtil.isNotEmpty(bccs)) {
+ mail.setBccs(bccs.toArray(new String[0]));
+ }
+
+ mail.setTos(tos.toArray(new String[0]));
+ mail.setTitle(subject);
+ mail.setContent(content);
+ mail.setHtml(isHtml);
+ mail.setFiles(files);
+
+ // 鍥剧墖
+ if (MapUtil.isNotEmpty(imageMap)) {
+ for (Map.Entry<String, InputStream> entry : imageMap.entrySet()) {
+ mail.addImage(entry.getKey(), entry.getValue());
+ // 鍏抽棴娴�
+ IoUtil.close(entry.getValue());
+ }
+ }
+
+ return mail.send();
+ }
+
+ /**
+ * 灏嗗涓仈绯讳汉杞负鍒楄〃锛屽垎闅旂涓洪�楀彿鎴栬�呭垎鍙�
+ *
+ * @param addresses 澶氫釜鑱旂郴浜猴紝濡傛灉涓虹┖杩斿洖null
+ * @return 鑱旂郴浜哄垪琛�
+ */
+ private static List<String> splitAddress(String addresses) {
+ if (StrUtil.isBlank(addresses)) {
+ return null;
+ }
+
+ List<String> result;
+ if (StrUtil.contains(addresses, CharUtil.COMMA)) {
+ result = StrUtil.splitTrim(addresses, CharUtil.COMMA);
+ } else if (StrUtil.contains(addresses, ';')) {
+ result = StrUtil.splitTrim(addresses, ';');
+ } else {
+ result = CollUtil.newArrayList(addresses);
+ }
+ return result;
+ }
+ // ------------------------------------------------------------------------------------------------------------------------ Private method end
+
+}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java
new file mode 100644
index 0000000..53f130f
--- /dev/null
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java
@@ -0,0 +1,54 @@
+package com.ruoyi.demo.controller;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.email.MailUtils;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.File;
+
+
+/**
+ * 娴嬭瘯閭欢鍙戦�� Controller
+ *
+ * @author Michelle.Chung
+ */
+@Validated
+@Api(value = "閭欢鎺у埗鍣�", tags = {"娴嬭瘯閭欢鍙戦��"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RequestMapping("/demo/mail")
+@RestController
+public class MailController {
+
+ /**
+ * 鍙戦�侀偖浠�
+ *
+ * @param to 鎺ユ敹浜�
+ * @param subject 鏍囬
+ * @param text 鍐呭
+ */
+ @GetMapping("/sendSimpleMessage")
+ public R<Void> sendSimpleMessage(String to, String subject, String text) {
+ MailUtils.send(to, subject, text, false);
+ return R.ok("鎿嶄綔鎴愬姛");
+ }
+
+ /**
+ * 鍙戦�侀偖浠讹紙甯﹂檮浠讹級
+ *
+ * @param to 鎺ユ敹浜�
+ * @param subject 鏍囬
+ * @param text 鍐呭
+ */
+ @GetMapping("/sendMessageWithAttachment")
+ public R<Void> sendMessageWithAttachment(String to, String subject, String text, String filePath) {
+ MailUtils.send(to, subject, text, false, new File(filePath));
+ return R.ok("鎿嶄綔鎴愬姛");
+ }
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MailConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MailConfig.java
new file mode 100644
index 0000000..d4ff8a7
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MailConfig.java
@@ -0,0 +1,39 @@
+package com.ruoyi.framework.config;
+
+import cn.hutool.extra.mail.MailAccount;
+import com.ruoyi.framework.config.properties.MailProperties;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+
+/**
+ * JavaMail 閰嶇疆
+ *
+ * @author Michelle.Chung
+ */
+@Configuration
+public class MailConfig {
+
+ @Resource
+ private MailProperties mailProperties;
+
+ /**
+ * 鍒濆鍖� JavaMailSender
+ */
+ @Bean
+ @ConditionalOnProperty(value = "spring.mail.enabled", havingValue = "true")
+ public MailAccount mailAccount() {
+ MailAccount account = new MailAccount();
+ account.setFrom(mailProperties.getUsername());
+ account.setUser(mailProperties.getUsername());
+ account.setPass(mailProperties.getPassword());
+ account.setPort(mailProperties.getPort());
+ account.setAuth(mailProperties.getAuth());
+ account.setDebug(mailProperties.getDebug());
+ account.setStarttlsEnable(mailProperties.getStarttlsEnable());
+ return account;
+ }
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/MailProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/MailProperties.java
new file mode 100644
index 0000000..ce2103f
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/MailProperties.java
@@ -0,0 +1,65 @@
+package com.ruoyi.framework.config.properties;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * JavaMail 閰嶇疆灞炴��
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "spring.mail")
+public class MailProperties {
+
+ /**
+ * 杩囨护寮�鍏�
+ */
+ private String enabled;
+
+ /**
+ * 閭欢鏈嶅姟鍦板潃
+ */
+ private String host;
+
+ /**
+ * 鐢ㄦ埛鍚�
+ */
+ private String username;
+
+ /**
+ * 鎺堟潈鐮� (璁剧疆 - 璐︽埛 - POP3/SMTP鏈嶅姟)
+ */
+ private String password;
+
+ /**
+ * 閭鍔犲瘑绔彛锛屼笉鍚岄偖绠辩殑绔彛涓嶄竴鏍�
+ */
+ private Integer port;
+
+ /**
+ * 鏄惁闇�瑕佺敤鎴疯璇�
+ */
+ @Value("${spring.mail.properties.mail.smtp.auth}")
+ private Boolean auth;
+
+ /**
+ * 鏄惁鍚敤TLS鍔犲瘑
+ */
+ @Value("${spring.mail.properties.mail.smtp.starttls.enable}")
+ private Boolean starttlsEnable;
+
+ @Value("${spring.mail.properties.mail.smtp.ssl.trust}")
+ private String sslTrust;
+
+ private Boolean debug;
+
+ /**
+ * 浼犺緭鍗忚 starttls.enable = true 鏃朵负 smtps
+ */
+ private String protocol;
+
+}
--
Gitblit v1.9.3