Merge branch 'v4-dev' of github.com:looly/hutool into v4-dev

This commit is contained in:
Looly 2019-08-20 11:35:05 +08:00
commit ef6214a303
2 changed files with 770 additions and 590 deletions

View File

@ -1,8 +1,11 @@
package cn.hutool.extra.mail; package cn.hutool.extra.mail;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Date; import java.util.Date;
import java.util.Map;
import javax.activation.DataHandler; import javax.activation.DataHandler;
import javax.activation.DataSource; import javax.activation.DataSource;
@ -16,6 +19,7 @@ import javax.mail.Transport;
import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -46,6 +50,8 @@ public class Mail {
private boolean isHtml; private boolean isHtml;
/** 附件列表 */ /** 附件列表 */
private DataSource[] attachments; private DataSource[] attachments;
/** 图片列表 */
private Map<String, InputStream> imageMap;
/** 是否使用全局会话默认为false */ /** 是否使用全局会话默认为false */
private boolean useGlobalSession = false; private boolean useGlobalSession = false;
@ -211,6 +217,18 @@ public class Mail {
return this; return this;
} }
/**
* 设置图片图片的键对应到邮件模板中的占位字符串
*
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
*/
public Mail setImageMap(Map<String, InputStream> imageMap) {
if (imageMap != null && imageMap.size() > 0) {
this.imageMap = imageMap;
}
return this;
}
/** /**
* 设置字符集编码 * 设置字符集编码
* *
@ -329,6 +347,22 @@ public class Mail {
} }
} }
// 图片
for (Map.Entry<String, InputStream> entry : imageMap.entrySet()) {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource ds;
try {
ds = new ByteArrayDataSource(entry.getValue(), "image/jpeg");
} catch (IOException e) {
throw new MailException(e);
}
messageBodyPart.setDataHandler(new DataHandler(ds));
messageBodyPart.setHeader("Content-ID", String.format("<%s>", entry.getKey()));
// add it
mainPart.addBodyPart(messageBodyPart);
}
return mainPart; return mainPart;
} }

View File

@ -1,8 +1,10 @@
package cn.hutool.extra.mail; package cn.hutool.extra.mail;
import java.io.File; import java.io.File;
import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -14,7 +16,6 @@ import cn.hutool.core.util.StrUtil;
* @since 3.1.2 * @since 3.1.2
*/ */
public class MailUtil { public class MailUtil {
/** /**
* 使用配置文件中设置的账户发送文本邮件发送给单个或多个收件人<br> * 使用配置文件中设置的账户发送文本邮件发送给单个或多个收件人<br>
* 多个收件人可以使用逗号,分隔也可以通过分号;分隔 * 多个收件人可以使用逗号,分隔也可以通过分号;分隔
@ -125,7 +126,7 @@ public class MailUtil {
* @since 4.0.3 * @since 4.0.3
*/ */
public static void send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) { public static void send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, isHtml, files); send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files);
} }
//------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount //------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
@ -172,7 +173,150 @@ public class MailUtil {
* @since 4.0.3 * @since 4.0.3
*/ */
public static void send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) { public static void send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
send(mailAccount, false, tos, ccs, bccs, subject, content, isHtml, files); send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送HTML邮件发送给单个或多个收件人<br>
* 多个收件人可以使用逗号,分隔也可以通过分号;分隔
*
* @param to 收件人
* @param subject 标题
* @param content 正文
* @param files 附件列表
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @since 3.2.0
*/
public static void sendHtml(String to, String subject, String content, Map<String, InputStream> imageMap, File... files) {
send(to, subject, content, imageMap, true, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br>
* 多个收件人可以使用逗号,分隔也可以通过分号;分隔
*
* @param to 收件人
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML
* @param files 附件列表
*/
public static void send(String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(splitAddress(to), subject, content, imageMap, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br>
* 多个收件人抄送人密送人可以使用逗号,分隔也可以通过分号;分隔
*
* @param to 收件人可以使用逗号,分隔也可以通过分号;分隔
* @param cc 抄送人可以使用逗号,分隔也可以通过分号;分隔
* @param bcc 密送人可以使用逗号,分隔也可以通过分号;分隔
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML
* @param files 附件列表
* @since 4.0.3
*/
public static void send(String to, String cc, String bcc, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送HTML邮件发送给多人
*
* @param tos 收件人列表
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param files 附件列表
* @since 3.2.0
*/
public static void sendHtml(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, File... files) {
send(tos, subject, content, imageMap, true, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送给多人
*
* @param tos 收件人列表
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML
* @param files 附件列表
*/
public static void send(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(tos, null, null, subject, content, imageMap, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送给多人
*
* @param tos 收件人列表
* @param ccs 抄送人列表可以为null或空
* @param bccs 密送人列表可以为null或空
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML
* @param files 附件列表
* @since 4.0.3
*/
public static void send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
}
//------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
/**
* 发送邮件给多人
*
* @param mailAccount 邮件认证对象
* @param to 收件人多个收件人逗号或者分号隔开
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML格式
* @param files 附件列表
* @since 3.2.0
*/
public static void send(MailAccount mailAccount, String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files);
}
/**
* 发送邮件给多人
*
* @param mailAccount 邮件帐户信息
* @param tos 收件人列表
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML格式
* @param files 附件列表
*/
public static void send(MailAccount mailAccount, Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files);
}
/**
* 发送邮件给多人
*
* @param mailAccount 邮件帐户信息
* @param tos 收件人列表
* @param ccs 抄送人列表可以为null或空
* @param bccs 密送人列表可以为null或空
* @param subject 标题
* @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML格式
* @param files 附件列表
* @since 4.0.3
*/
public static void send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
} }
//------------------------------------------------------------------------------------------------------------------------ Private method start //------------------------------------------------------------------------------------------------------------------------ Private method start
@ -186,11 +330,12 @@ public class MailUtil {
* @param bccs 密送人列表可以为null或空 * @param bccs 密送人列表可以为null或空
* @param subject 标题 * @param subject 标题
* @param content 正文 * @param content 正文
* @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param isHtml 是否为HTML格式 * @param isHtml 是否为HTML格式
* @param files 附件列表 * @param files 附件列表
* @since 4.0.3 * @since 4.0.3
*/ */
private static void send(MailAccount mailAccount, boolean useGlobalSession, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) { private static void send(MailAccount mailAccount, boolean useGlobalSession, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
final Mail mail = Mail.create(mailAccount).setUseGlobalSession(useGlobalSession); final Mail mail = Mail.create(mailAccount).setUseGlobalSession(useGlobalSession);
//可选抄送人 //可选抄送人
@ -207,6 +352,7 @@ public class MailUtil {
mail.setContent(content); mail.setContent(content);
mail.setHtml(isHtml); mail.setHtml(isHtml);
mail.setFiles(files); mail.setFiles(files);
mail.setImageMap(imageMap);
mail.send(); mail.send();
} }