add section for #IZN95

This commit is contained in:
Looly 2021-01-02 12:46:13 +08:00
parent 71177864be
commit 99f6fe8110
5 changed files with 61 additions and 15 deletions

View File

@ -9,6 +9,8 @@
* 【core 】 DynaBean.create增加重载方法pr#245@Gitee * 【core 】 DynaBean.create增加重载方法pr#245@Gitee
* 【core 】 IdcardUtil增加重载是否忽略大小写issue#1348@Github * 【core 】 IdcardUtil增加重载是否忽略大小写issue#1348@Github
* 【poi 】 SheetRidReader增加getRidByIndex方法issue#1342@Github * 【poi 】 SheetRidReader增加getRidByIndex方法issue#1342@Github
* 【extra 】 MailAccount增加sslProtocols配置项issue#IZN95@Gitee
* 【extra 】 MailUtil增加getSession方法
### Bug修复 ### Bug修复

View File

@ -1,6 +1,7 @@
package cn.hutool.core.util; package cn.hutool.core.util;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Console;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Ignore; import org.junit.Ignore;
@ -8,6 +9,7 @@ import org.junit.Test;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@ -102,8 +104,9 @@ public class ZipUtilTest {
try (OutputStream out = new FileOutputStream(zip)){ try (OutputStream out = new FileOutputStream(zip)){
//实际应用中, out HttpServletResponse.getOutputStream //实际应用中, out HttpServletResponse.getOutputStream
ZipUtil.zip(out, Charset.defaultCharset(), false, null, new File(dir)); ZipUtil.zip(out, Charset.defaultCharset(), false, null, new File(dir));
} catch (Exception e) { } catch (IOException e) {
e.printStackTrace(); throw new IORuntimeException(e);
} }
} }
} }

View File

@ -12,7 +12,6 @@ import javax.activation.DataSource;
import javax.activation.FileDataSource; import javax.activation.FileDataSource;
import javax.activation.FileTypeMap; import javax.activation.FileTypeMap;
import javax.mail.Address; import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.MessagingException; import javax.mail.MessagingException;
import javax.mail.Multipart; import javax.mail.Multipart;
import javax.mail.SendFailedException; import javax.mail.SendFailedException;
@ -407,7 +406,7 @@ public class Mail {
*/ */
private MimeMessage buildMsg() throws MessagingException { private MimeMessage buildMsg() throws MessagingException {
final Charset charset = this.mailAccount.getCharset(); 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(); final String from = this.mailAccount.getFrom();
if (StrUtil.isEmpty(from)) { if (StrUtil.isEmpty(from)) {
@ -460,19 +459,10 @@ public class Mail {
* 获取默认邮件会话<br> * 获取默认邮件会话<br>
* 如果为全局单例的会话则全局只允许一个邮件帐号否则每次发送邮件会新建一个新的会话 * 如果为全局单例的会话则全局只允许一个邮件帐号否则每次发送邮件会新建一个新的会话
* *
* @param isSingleton 是否使用单例Session
* @return 邮件会话 {@link Session} * @return 邮件会话 {@link Session}
* @since 4.0.2
*/ */
private Session getSession(boolean isSingleton) { private Session getSession() {
final MailAccount mailAccount = this.mailAccount; final Session session = MailUtil.getSession(this.mailAccount, this.useGlobalSession);
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);
if(null != this.debugOutput){ if(null != this.debugOutput){
session.setDebugOut(debugOutput); session.setDebugOut(debugOutput);

View File

@ -23,8 +23,10 @@ public class MailAccount implements Serializable {
private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout";
private static final String SMTP_TIMEOUT = "mail.smtp.timeout"; private static final String SMTP_TIMEOUT = "mail.smtp.timeout";
// SSL
private static final String STARTTLS_ENABLE = "mail.smtp.starttls.enable"; 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_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 = "mail.smtp.socketFactory.class";
private static final String SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback"; private static final String SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback";
private static final String SOCKET_FACTORY_PORT = "smtp.socketFactory.port"; private static final String SOCKET_FACTORY_PORT = "smtp.socketFactory.port";
@ -80,6 +82,12 @@ public class MailAccount implements Serializable {
* 使用 SSL安全连接 * 使用 SSL安全连接
*/ */
private Boolean sslEnable; private Boolean sslEnable;
/**
* SSL协议多个协议用空格分隔
*/
private String sslProtocols;
/** /**
* 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 * 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字
*/ */
@ -356,6 +364,25 @@ public class MailAccount implements Serializable {
return this; 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的套接字 * 获取指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字
* *
@ -479,6 +506,10 @@ public class MailAccount implements Serializable {
p.put(SOCKET_FACTORY, socketFactoryClass); p.put(SOCKET_FACTORY, socketFactoryClass);
p.put(SOCKET_FACTORY_FALLBACK, String.valueOf(this.socketFactoryFallback)); p.put(SOCKET_FACTORY_FALLBACK, String.valueOf(this.socketFactoryFallback));
p.put(SOCKET_FACTORY_PORT, String.valueOf(this.socketFactoryPort)); 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; return p;

View File

@ -5,6 +5,8 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import javax.mail.Authenticator;
import javax.mail.Session;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
@ -346,6 +348,24 @@ public class MailUtil {
return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, 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 // ------------------------------------------------------------------------------------------------------------------------ Private method start
/** /**