From 7abb318e31666c8e4af1a50fdbe0b19bff011988 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 24 Oct 2021 20:10:19 +0800 Subject: [PATCH] charset null use default --- CHANGELOG.md | 3 +- .../hutool/extra/mail/InternalMailUtil.java | 19 ++++++------ .../main/java/cn/hutool/extra/mail/Mail.java | 14 +++++---- .../cn/hutool/extra/mail/MailAccount.java | 31 ++++++++++++++----- 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c76c83e7..364fd5545 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,13 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.16 (2021-10-23) +# 5.7.16 (2021-10-24) ### 🐣新特性 * 【core 】 增加DateTime.toLocalDateTime * 【core 】 CharSequenceUtil增加normalize方法(pr#444@Gitee) * 【core 】 MailAccount增加setEncodefilename()方法,可选是否编码附件的文件名(issue#I4F160@Gitee) +* 【core 】 MailAccount中charset增加null时的默认规则 ### 🐞Bug修复 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java index a4e015cf3..64eddb20a 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java @@ -17,11 +17,11 @@ import java.util.List; * @since 3.2.3 */ public class InternalMailUtil { - + /** * 将多个字符串邮件地址转为{@link InternetAddress}列表
* 单个字符串地址可以是多个地址合并的字符串 - * + * * @param addrStrs 地址数组 * @param charset 编码(主要用于中文用户名的编码) * @return 地址数组 @@ -38,12 +38,12 @@ public class InternalMailUtil { } return resultList.toArray(new InternetAddress[0]); } - + /** * 解析第一个地址 - * + * * @param address 地址字符串 - * @param charset 编码 + * @param charset 编码,{@code null}表示使用系统属性定义的编码或系统编码 * @return 地址列表 */ public static InternetAddress parseFirstAddress(String address, Charset charset) { @@ -61,9 +61,9 @@ public class InternalMailUtil { /** * 将一个地址字符串解析为多个地址
* 地址间使用" "、","、";"分隔 - * + * * @param address 地址字符串 - * @param charset 编码 + * @param charset 编码,{@code null}表示使用系统属性定义的编码或系统编码 * @return 地址列表 */ public static InternetAddress[] parseAddress(String address, Charset charset) { @@ -75,9 +75,10 @@ public class InternalMailUtil { } //编码用户名 if (ArrayUtil.isNotEmpty(addresses)) { + final String charsetStr = null == charset ? null : charset.name(); for (InternetAddress internetAddress : addresses) { try { - internetAddress.setPersonal(internetAddress.getPersonal(), charset.name()); + internetAddress.setPersonal(internetAddress.getPersonal(), charsetStr); } catch (UnsupportedEncodingException e) { throw new MailException(e); } @@ -90,7 +91,7 @@ public class InternalMailUtil { /** * 编码中文字符
* 编码失败返回原字符串 - * + * * @param text 被编码的文本 * @param charset 编码 * @return 编码后的结果 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 e4ce322c9..2d71b2dcc 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 @@ -21,6 +21,7 @@ import javax.mail.Transport; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimeUtility; import javax.mail.util.ByteArrayDataSource; import java.io.File; import java.io.IOException; @@ -264,7 +265,7 @@ public class Mail implements Builder { bodyPart = new MimeBodyPart(); bodyPart.setDataHandler(new DataHandler(attachment)); nameEncoded = attachment.getName(); - if(this.mailAccount.isEncodefilename()){ + if (this.mailAccount.isEncodefilename()) { nameEncoded = InternalMailUtil.encodeText(nameEncoded, charset); } // 普通附件文件名 @@ -388,7 +389,7 @@ public class Mail implements Builder { try { return doSend(); } catch (MessagingException e) { - if(e instanceof SendFailedException){ + if (e instanceof SendFailedException) { // 当地址无效时,显示更加详细的无效地址信息 final Address[] invalidAddresses = ((SendFailedException) e).getInvalidAddresses(); final String msg = StrUtil.format("Invalid Addresses: {}", ArrayUtil.toString(invalidAddresses)); @@ -430,7 +431,7 @@ public class Mail implements Builder { msg.setFrom(InternalMailUtil.parseFirstAddress(from, charset)); } // 标题 - msg.setSubject(this.title, charset.name()); + msg.setSubject(this.title, (null == charset) ? null : charset.name()); // 发送时间 msg.setSentDate(new Date()); // 内容和附件 @@ -456,14 +457,15 @@ public class Mail implements Builder { /** * 构建邮件信息主体 * - * @param charset 编码 + * @param charset 编码,{@code null}则使用{@link MimeUtility#getDefaultJavaCharset()} * @return 邮件信息主体 * @throws MessagingException 消息异常 */ private Multipart buildContent(Charset charset) throws MessagingException { + final String charsetStr = null != charset ? charset.name() : MimeUtility.getDefaultJavaCharset(); // 正文 final MimeBodyPart body = new MimeBodyPart(); - body.setContent(content, StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charset)); + body.setContent(content, StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charsetStr)); this.multipart.addBodyPart(body); return this.multipart; @@ -478,7 +480,7 @@ public class Mail implements Builder { private Session getSession() { final Session session = MailUtil.getSession(this.mailAccount, this.useGlobalSession); - if(null != this.debugOutput){ + 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 8ea8aed62..6cff1777d 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 @@ -34,10 +34,13 @@ public class MailAccount implements Serializable { private static final String SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback"; private static final String SOCKET_FACTORY_PORT = "smtp.socketFactory.port"; + // System Properties + private static final String SPLIT_LONG_PARAMS = "mail.mime.splitlongparameters"; + //private static final String ENCODE_FILE_NAME = "mail.mime.encodefilename"; + //private static final String CHARSET = "mail.mime.charset"; + // 其他 private static final String MAIL_DEBUG = "mail.debug"; - private static final String SPLIT_LONG_PARAMS = "mail.mime.splitlongparameters"; - // private static final String ENCODE_FILE_NAME = "mail.mime.encodefilename"; public static final String[] MAIL_SETTING_PATHS = new String[]{"config/mail.setting", "config/mailAccount.setting", "mail.setting"}; @@ -303,16 +306,19 @@ public class MailAccount implements Serializable { /** * 获取字符集编码 * - * @return 编码 + * @return 编码,可能为{@code null} */ public Charset getCharset() { return charset; } /** - * 设置字符集编码 + * 设置字符集编码,此选项不会修改全局配置,若修改全局配置,请设置此项为{@code null}并设置: + *
+	 * 	System.setProperty("mail.mime.charset", charset);
+	 * 
* - * @param charset 字符集编码 + * @param charset 字符集编码,{@code null} 则表示使用全局设置的默认编码,全局编码为mail.mime.charset系统属性 * @return this */ public MailAccount setCharset(Charset charset) { @@ -330,7 +336,11 @@ public class MailAccount implements Serializable { } /** - * 设置对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名) + * 设置对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名)
+ * 注意此项为全局设置,此项会调用 + *
+	 * System.setProperty("mail.mime.splitlongparameters", true)
+	 * 
* * @param splitlongparameters 对于超长参数是否切分为多份 */ @@ -345,11 +355,17 @@ public class MailAccount implements Serializable { * @since 5.7.16 */ public boolean isEncodefilename() { + return encodefilename; } /** - * 设置对于文件名是否使用{@link #charset}编码 + * 设置对于文件名是否使用{@link #charset}编码,此选项不会修改全局配置
+ * 如果此选项设置为{@code false},则是否编码取决于两个系统属性: + *
    + *
  • mail.mime.encodefilename 是否编码附件文件名
  • + *
  • mail.mime.charset 编码文件名的编码
  • + *
* * @param encodefilename 对于文件名是否使用{@link #charset}编码 * @since 5.7.16 @@ -400,6 +416,7 @@ public class MailAccount implements Serializable { /** * 获取SSL协议,多个协议用空格分隔 + * * @return SSL协议,多个协议用空格分隔 * @since 5.5.7 */