浏览代码

add section for #IZN95

Looly 5 年之前
父节点
当前提交
99f6fe8110

+ 2 - 0
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修复
 

+ 5 - 2
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);
 		}
 	}
+
 }

+ 3 - 13
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 {
 	 * 获取默认邮件会话<br>
 	 * 如果为全局单例的会话,则全局只允许一个邮件帐号,否则每次发送邮件会新建一个新的会话
 	 *
-	 * @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);

+ 31 - 0
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的套接字
 	 */
@@ -357,6 +365,25 @@ public class MailAccount implements Serializable {
 	}
 
 	/**
+	 * 获取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的套接字
 	 *
 	 * @return 指定实现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;

+ 20 - 0
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
 
 	/**