This commit is contained in:
Looly
2025-10-24 15:36:05 +08:00
parent 408d3c3873
commit 1df82bb44a
2 changed files with 41 additions and 32 deletions

View File

@@ -17,10 +17,12 @@
package cn.hutool.v7.extra.mail;
import cn.hutool.v7.core.array.ArrayUtil;
import cn.hutool.v7.core.text.StrUtil;
import cn.hutool.v7.core.util.ObjUtil;
import jakarta.mail.internet.AddressException;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -29,6 +31,7 @@ import java.util.List;
/**
* 邮件内部工具类
*
* @author Looly
* @since 3.2.3
*/
@@ -39,12 +42,14 @@ public class InternalMailUtil {
* 单个字符串地址可以是多个地址合并的字符串
*
* @param addrStrs 地址数组
* @param charset 编码(主要用于中文用户名的编码)
* @param charset 编码(主要用于中文用户名的编码)
* @return 地址数组
* @since 4.0.3
*/
public static InternetAddress[] parseAddressFromStrs(final String[] addrStrs, final Charset charset) {
if (ArrayUtil.isEmpty(addrStrs)) return new InternetAddress[0];
if (ArrayUtil.isEmpty(addrStrs)) {
return new InternetAddress[0];
}
final List<InternetAddress> resultList = new ArrayList<>(addrStrs.length);
InternetAddress[] addrs;
for (final String addrStr : addrStrs) {
@@ -79,11 +84,14 @@ public class InternalMailUtil {
* 将一个地址字符串解析为多个地址<br>
* 地址间使用" "、","、";"分隔
*
* @param address 地址字符串
* @param address 地址字符串,如果为空,返回空数组
* @param charset 编码,{@code null}表示使用系统属性定义的编码或系统编码
* @return 地址列表
*/
public static InternetAddress[] parseAddress(final String address, final Charset charset) {
if (StrUtil.isBlank(address)) {
return new InternetAddress[0];
}
final InternetAddress[] addresses;
try {
addresses = InternetAddress.parse(address);
@@ -92,7 +100,7 @@ public class InternalMailUtil {
}
//编码用户名
if (ArrayUtil.isNotEmpty(addresses)) {
final String charsetStr = null == charset ? null : charset.name();
final String charsetStr = ObjUtil.apply(charset, Charset::name);
for (final InternetAddress internetAddress : addresses) {
try {
internetAddress.setPersonal(internetAddress.getPersonal(), charsetStr);
@@ -109,15 +117,17 @@ public class InternalMailUtil {
* 编码中文字符<br>
* 编码失败返回原字符串
*
* @param text 被编码的文本
* @param text 被编码的文本
* @param charset 编码
* @return 编码后的结果
*/
public static String encodeText(final String text, final Charset charset) {
try {
return MimeUtility.encodeText(text, charset.name(), null);
} catch (final UnsupportedEncodingException e) {
// ignore
if (StrUtil.isNotBlank(text)) {
try {
return MimeUtility.encodeText(text, charset.name(), null);
} catch (final UnsupportedEncodingException e) {
// ignore
}
}
return text;
}

View File

@@ -51,12 +51,12 @@ public class SMTPMessage extends MimeMessage {
/**
* 创建SMTP消息
*
* @param mailAccount 邮件账户
* @param mailAccount 邮件账户
* @param useGlobalSession 是否使用全局Session
* @param debugOutput 输出调试信息
* @param debugOutput 输出调试信息
* @return this
*/
public static SMTPMessage of(final MailAccount mailAccount, final boolean useGlobalSession, final PrintStream debugOutput){
public static SMTPMessage of(final MailAccount mailAccount, final boolean useGlobalSession, final PrintStream debugOutput) {
final Session session = MailUtil.getSession(mailAccount, useGlobalSession);
if (null != debugOutput) {
session.setDebugOut(debugOutput);
@@ -339,25 +339,24 @@ public class SMTPMessage extends MimeMessage {
}
}
/**
* 构建邮件信息主体
*
* @param content 内容, {@code null}则使用{@link StrUtil#EMPTY}替换
* @param charset 编码,{@code null}则使用{@link MimeUtility#getDefaultJavaCharset()}
* @param isHtml 是否为HTML
* @return 邮件信息主体
* @throws MessagingException 消息异常
*/
private Multipart buildContent(final String content, final Charset charset, final boolean isHtml) throws MessagingException {
final String charsetStr = null != charset ? charset.name() : MimeUtility.getDefaultJavaCharset();
// 内容如果是null会抛异常, 使用空字符串代替
final String contentStr = content == null ? StrUtil.EMPTY : content;
// 正文
final MimeBodyPart body = new MimeBodyPart();
body.setContent(contentStr, StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charsetStr));
addBodyPart(body, 0);
return this.multipart;
}
/**
* 构建邮件信息主体
*
* @param content 内容, {@code null}则使用{@link StrUtil#EMPTY}替换
* @param charset 编码,{@code null}则使用{@link MimeUtility#getDefaultJavaCharset()}
* @param isHtml 是否为HTML
* @return 邮件信息主体
* @throws MessagingException 消息异常
*/
private Multipart buildContent(final String content, final Charset charset, final boolean isHtml) throws MessagingException {
final String charsetStr = null != charset ? charset.name() : MimeUtility.getDefaultJavaCharset();
// 正文
final MimeBodyPart body = new MimeBodyPart();
// 内容如果是null会抛异常, 使用空字符串代替
body.setContent(StrUtil.emptyIfNull(content), StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charsetStr));
addBodyPart(body, 0);
return this.multipart;
}
/**
* 执行发送