diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailAccount.java
index ef700b8e9..de9f47a84 100644
--- a/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailAccount.java
+++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailAccount.java
@@ -12,6 +12,7 @@
package org.dromara.hutool.extra.mail;
+import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.core.text.StrUtil;
@@ -75,9 +76,11 @@ public class MailAccount implements Serializable {
*/
private String user;
/**
- * 密码
+ * 密码
+ * 使用char[]保存密码有利于及时擦除
+ * 见:https://www.cnblogs.com/okokabcd/p/16456966.html
*/
- private String pass;
+ private char[] pass;
/**
* 发送方,遵循RFC-822标准
*/
@@ -260,7 +263,7 @@ public class MailAccount implements Serializable {
*
* @return 密码
*/
- public String getPass() {
+ public char[] getPass() {
return pass;
}
@@ -270,7 +273,7 @@ public class MailAccount implements Serializable {
* @param pass 密码
* @return this
*/
- public MailAccount setPass(final String pass) {
+ public MailAccount setPass(final char[] pass) {
this.pass = pass;
return this;
}
@@ -649,7 +652,7 @@ public class MailAccount implements Serializable {
}
if (null == this.auth) {
// 如果密码非空白,则使用认证模式
- this.auth = (!StrUtil.isBlank(this.pass));
+ this.auth = ArrayUtil.isNotEmpty(this.pass);
}
if (null == this.port) {
// 端口在SSL状态下默认与socketFactoryPort一致,非SSL状态下默认为25
@@ -665,7 +668,7 @@ public class MailAccount implements Serializable {
@Override
public String toString() {
- return "MailAccount [host=" + host + ", port=" + port + ", auth=" + auth + ", user=" + user + ", pass=" + (StrUtil.isEmpty(this.pass) ? "" : "******") + ", from=" + from + ", startttlsEnable="
+ return "MailAccount [host=" + host + ", port=" + port + ", auth=" + auth + ", user=" + user + ", pass=" + (ArrayUtil.isEmpty(this.pass) ? "" : "******") + ", from=" + from + ", startttlsEnable="
+ starttlsEnable + ", socketFactoryClass=" + socketFactoryClass + ", socketFactoryFallback=" + socketFactoryFallback + ", socketFactoryPort=" + socketFactoryPort + "]";
}
}
diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailUtil.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailUtil.java
index 899d32738..809352c70 100644
--- a/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailUtil.java
+++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/MailUtil.java
@@ -12,16 +12,17 @@
package org.dromara.hutool.extra.mail;
+import jakarta.mail.Authenticator;
+import jakarta.mail.PasswordAuthentication;
+import jakarta.mail.Session;
import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.map.MapUtil;
+import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.core.util.CharUtil;
-import org.dromara.hutool.core.text.StrUtil;
-import jakarta.mail.Authenticator;
-import jakarta.mail.Session;
import java.io.File;
import java.io.InputStream;
import java.util.Collection;
@@ -374,7 +375,15 @@ public class MailUtil {
public static Session getSession(final MailAccount mailAccount, final boolean isSingleton) {
Authenticator authenticator = null;
if (mailAccount.isAuth()) {
- authenticator = new UserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass());
+ authenticator = new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(
+ mailAccount.getUser(),
+ String.valueOf(mailAccount.getPass())
+ );
+ }
+ };
}
return isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) //
diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/UserPassAuthenticator.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/UserPassAuthenticator.java
deleted file mode 100644
index 0362f924b..000000000
--- a/hutool-extra/src/main/java/org/dromara/hutool/extra/mail/UserPassAuthenticator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2023 looly(loolly@aliyun.com)
- * Hutool is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- */
-
-package org.dromara.hutool.extra.mail;
-
-import jakarta.mail.Authenticator;
-import jakarta.mail.PasswordAuthentication;
-
-/**
- * 用户名密码验证器
- *
- * @author looly
- * @since 3.1.2
- */
-public class UserPassAuthenticator extends Authenticator {
-
- private final String user;
- private final String pass;
-
- /**
- * 构造
- *
- * @param user 用户名
- * @param pass 密码
- */
- public UserPassAuthenticator(final String user, final String pass) {
- this.user = user;
- this.pass = pass;
- }
-
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(this.user, this.pass);
- }
-
-}
diff --git a/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java b/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java
index 08578e55f..65dbe8e66 100644
--- a/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java
+++ b/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java
@@ -19,6 +19,7 @@ public class MailAccountTest {
final MailAccount account = GlobalMailAccount.INSTANCE.getAccount();
account.getSmtpProps();
+ Assertions.assertNotNull(account.getPass());
Assertions.assertNotNull(account.getCharset());
Assertions.assertTrue(account.isSslEnable());
}
@@ -35,7 +36,7 @@ public class MailAccountTest {
public void customPropertyTest() throws GeneralSecurityException {
final MailAccount mailAccount = new MailAccount();
mailAccount.setFrom("xxx@xxx.com");
- mailAccount.setPass("xxxxxx");
+ mailAccount.setPass("xxxxxx".toCharArray());
mailAccount.setHost("smtp.aol.com");
diff --git a/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailTest.java b/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailTest.java
index 0755c9d2d..3ec8e8cfe 100644
--- a/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailTest.java
+++ b/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailTest.java
@@ -53,7 +53,7 @@ public class MailTest {
account.setSslEnable(true);
account.setFrom("hutool@yeah.net");
account.setUser("hutool");
- account.setPass("q1w2e3");
+ account.setPass("q1w2e3".toCharArray());
MailUtil.send(account, "hutool@foxmail.com", "测试", "