charset null use default

This commit is contained in:
Looly 2021-10-24 20:10:19 +08:00
parent d571567c52
commit 7abb318e31
4 changed files with 44 additions and 23 deletions

View File

@ -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修复

View File

@ -17,11 +17,11 @@ import java.util.List;
* @since 3.2.3
*/
public class InternalMailUtil {
/**
* 将多个字符串邮件地址转为{@link InternetAddress}列表<br>
* 单个字符串地址可以是多个地址合并的字符串
*
*
* @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 {
/**
* 将一个地址字符串解析为多个地址<br>
* 地址间使用" "","";"分隔
*
*
* @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 {
/**
* 编码中文字符<br>
* 编码失败返回原字符串
*
*
* @param text 被编码的文本
* @param charset 编码
* @return 编码后的结果

View File

@ -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<MimeMessage> {
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<MimeMessage> {
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<MimeMessage> {
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<MimeMessage> {
/**
* 构建邮件信息主体
*
* @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<MimeMessage> {
private Session getSession() {
final Session session = MailUtil.getSession(this.mailAccount, this.useGlobalSession);
if(null != this.debugOutput){
if (null != this.debugOutput) {
session.setDebugOut(debugOutput);
}

View File

@ -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}并设置
* <pre>
* System.setProperty("mail.mime.charset", charset);
* </pre>
*
* @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国内邮箱附件不支持切分的附件名<br>
* 注意此项为全局设置此项会调用
* <pre>
* System.setProperty("mail.mime.splitlongparameters", true)
* </pre>
*
* @param splitlongparameters 对于超长参数是否切分为多份
*/
@ -345,11 +355,17 @@ public class MailAccount implements Serializable {
* @since 5.7.16
*/
public boolean isEncodefilename() {
return encodefilename;
}
/**
* 设置对于文件名是否使用{@link #charset}编码
* 设置对于文件名是否使用{@link #charset}编码此选项不会修改全局配置<br>
* 如果此选项设置为{@code false}则是否编码取决于两个系统属性
* <ul>
* <li>mail.mime.encodefilename 是否编码附件文件名</li>
* <li>mail.mime.charset 编码文件名的编码</li>
* </ul>
*
* @param encodefilename 对于文件名是否使用{@link #charset}编码
* @since 5.7.16
@ -400,6 +416,7 @@ public class MailAccount implements Serializable {
/**
* 获取SSL协议多个协议用空格分隔
*
* @return SSL协议多个协议用空格分隔
* @since 5.5.7
*/