diff --git a/CHANGELOG.md b/CHANGELOG.md index ff4b20fc1..38c61e5ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ * 【core 】 DynaBean.create增加重载方法(pr#245@Gitee) * 【core 】 IdcardUtil增加重载是否忽略大小写(issue#1348@Github) * 【poi 】 SheetRidReader增加getRidByIndex方法(issue#1342@Github) +* 【extra 】 MailAccount增加sslProtocols配置项(issue#IZN95@Gitee) +* 【extra 】 MailUtil增加getSession方法 ### Bug修复 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java index fd33ae852..3f5b314cd 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ZipUtilTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.util; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Ignore; @@ -8,6 +9,7 @@ import org.junit.Test; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; @@ -102,8 +104,9 @@ public class ZipUtilTest { try (OutputStream out = new FileOutputStream(zip)){ //实际应用中, out 为 HttpServletResponse.getOutputStream ZipUtil.zip(out, Charset.defaultCharset(), false, null, new File(dir)); - } catch (Exception e) { - e.printStackTrace(); + } catch (IOException e) { + throw new IORuntimeException(e); } } + } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java index 95137a7a9..bab301ba0 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java @@ -12,7 +12,6 @@ import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.activation.FileTypeMap; import javax.mail.Address; -import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.SendFailedException; @@ -407,7 +406,7 @@ public class Mail { */ private MimeMessage buildMsg() throws MessagingException { final Charset charset = this.mailAccount.getCharset(); - final MimeMessage msg = new MimeMessage(getSession(this.useGlobalSession)); + final MimeMessage msg = new MimeMessage(getSession()); // 发件人 final String from = this.mailAccount.getFrom(); if (StrUtil.isEmpty(from)) { @@ -460,19 +459,10 @@ public class Mail { * 获取默认邮件会话
* 如果为全局单例的会话,则全局只允许一个邮件帐号,否则每次发送邮件会新建一个新的会话 * - * @param isSingleton 是否使用单例Session * @return 邮件会话 {@link Session} - * @since 4.0.2 */ - private Session getSession(boolean isSingleton) { - final MailAccount mailAccount = this.mailAccount; - Authenticator authenticator = null; - if (mailAccount.isAuth()) { - authenticator = new UserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass()); - } - - final Session session = isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) // - : Session.getInstance(mailAccount.getSmtpProps(), authenticator); + private Session getSession() { + final Session session = MailUtil.getSession(this.mailAccount, this.useGlobalSession); if(null != this.debugOutput){ session.setDebugOut(debugOutput); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java index 199c79368..33279de24 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java @@ -23,8 +23,10 @@ public class MailAccount implements Serializable { private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; private static final String SMTP_TIMEOUT = "mail.smtp.timeout"; + // SSL private static final String STARTTLS_ENABLE = "mail.smtp.starttls.enable"; private static final String SSL_ENABLE = "mail.smtp.ssl.enable"; + private static final String SSL_PROTOCOLS = "mail.smtp.ssl.protocols"; private static final String SOCKET_FACTORY = "mail.smtp.socketFactory.class"; private static final String SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback"; private static final String SOCKET_FACTORY_PORT = "smtp.socketFactory.port"; @@ -80,6 +82,12 @@ public class MailAccount implements Serializable { * 使用 SSL安全连接 */ private Boolean sslEnable; + + /** + * SSL协议,多个协议用空格分隔 + */ + private String sslProtocols; + /** * 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 */ @@ -356,6 +364,25 @@ public class MailAccount implements Serializable { return this; } + /** + * 获取SSL协议,多个协议用空格分隔 + * @return SSL协议,多个协议用空格分隔 + * @since 5.5.7 + */ + public String getSslProtocols() { + return sslProtocols; + } + + /** + * 设置SSL协议,多个协议用空格分隔 + * + * @param sslProtocols SSL协议,多个协议用空格分隔 + * @since 5.5.7 + */ + public void setSslProtocols(String sslProtocols) { + this.sslProtocols = sslProtocols; + } + /** * 获取指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 * @@ -479,6 +506,10 @@ public class MailAccount implements Serializable { p.put(SOCKET_FACTORY, socketFactoryClass); p.put(SOCKET_FACTORY_FALLBACK, String.valueOf(this.socketFactoryFallback)); p.put(SOCKET_FACTORY_PORT, String.valueOf(this.socketFactoryPort)); + // issue#IZN95@Gitee,在Linux下需自定义SSL协议版本 + if(StrUtil.isNotBlank(this.sslProtocols)){ + p.put(SSL_PROTOCOLS, this.sslProtocols); + } } return p; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java index 1af4c9491..eb0978f7a 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java @@ -5,6 +5,8 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; +import javax.mail.Authenticator; +import javax.mail.Session; import java.io.File; import java.io.InputStream; import java.util.Collection; @@ -346,6 +348,24 @@ public class MailUtil { 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 /**