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,354 +1,388 @@
package cn.hutool.extra.mail; package cn.hutool.extra.mail;
import java.io.File; import java.io.File;
import java.nio.charset.Charset; import java.io.IOException;
import java.util.Date; import java.io.InputStream;
import java.nio.charset.Charset;
import javax.activation.DataHandler; import java.util.Date;
import javax.activation.DataSource; import java.util.Map;
import javax.activation.FileDataSource;
import javax.mail.Authenticator; import javax.activation.DataHandler;
import javax.mail.BodyPart; import javax.activation.DataSource;
import javax.mail.MessagingException; import javax.activation.FileDataSource;
import javax.mail.Multipart; import javax.mail.Authenticator;
import javax.mail.Session; import javax.mail.BodyPart;
import javax.mail.Transport; import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart; import javax.mail.Multipart;
import javax.mail.internet.MimeMessage; import javax.mail.Session;
import javax.mail.internet.MimeMultipart; import javax.mail.Transport;
import javax.mail.internet.MimeBodyPart;
import cn.hutool.core.util.ArrayUtil; import javax.mail.internet.MimeMessage;
import cn.hutool.core.util.StrUtil; import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
/**
* 邮件发送客户端 import cn.hutool.core.util.ArrayUtil;
* import cn.hutool.core.util.StrUtil;
* @author looly
* @since 3.2.0 /**
*/ * 邮件发送客户端
public class Mail { *
* @author looly
/** 邮箱帐户信息以及一些客户端配置信息 */ * @since 3.2.0
private MailAccount mailAccount; */
/** 收件人列表 */ public class Mail {
private String[] tos;
/** 抄送人列表carbon copy */ /** 邮箱帐户信息以及一些客户端配置信息 */
private String[] ccs; private MailAccount mailAccount;
/** 密送人列表blind carbon copy */ /** 收件人列表 */
private String[] bccs; private String[] tos;
/** 回复地址(reply-to) */ /** 抄送人列表carbon copy */
private String[] reply; private String[] ccs;
/** 标题 */ /** 密送人列表blind carbon copy */
private String title; private String[] bccs;
/** 内容 */ /** 回复地址(reply-to) */
private String content; private String[] reply;
/** 是否为HTML */ /** 标题 */
private boolean isHtml; private String title;
/** 附件列表 */ /** 内容 */
private DataSource[] attachments; private String content;
/** 是否使用全局会话默认为false */ /** 是否为HTML */
private boolean useGlobalSession = false; private boolean isHtml;
/** 附件列表 */
/** private DataSource[] attachments;
* 创建邮件客户端 /** 图片列表 */
* private Map<String, InputStream> imageMap;
* @param mailAccount 邮件帐号 /** 是否使用全局会话默认为false */
* @return {@link Mail} private boolean useGlobalSession = false;
*/
public static Mail create(MailAccount mailAccount) { /**
return new Mail(mailAccount); * 创建邮件客户端
} *
* @param mailAccount 邮件帐号
/** * @return {@link Mail}
* 创建邮件客户端使用全局邮件帐户 */
* public static Mail create(MailAccount mailAccount) {
* @return {@link Mail} return new Mail(mailAccount);
*/ }
public static Mail create() {
return new Mail(); /**
} * 创建邮件客户端使用全局邮件帐户
*
// --------------------------------------------------------------- Constructor start * @return {@link Mail}
/** */
* 构造使用全局邮件帐户 public static Mail create() {
*/ return new Mail();
public Mail() { }
this(GlobalMailAccount.INSTANCE.getAccount());
} // --------------------------------------------------------------- Constructor start
/**
/** * 构造使用全局邮件帐户
* 构造 */
* public Mail() {
* @param mailAccount 邮件帐户如果为null使用默认配置文件的全局邮件配置 this(GlobalMailAccount.INSTANCE.getAccount());
*/ }
public Mail(MailAccount mailAccount) {
mailAccount = (null != mailAccount) ? mailAccount : GlobalMailAccount.INSTANCE.getAccount(); /**
this.mailAccount = mailAccount.defaultIfEmpty(); * 构造
} *
// --------------------------------------------------------------- Constructor end * @param mailAccount 邮件帐户如果为null使用默认配置文件的全局邮件配置
*/
// --------------------------------------------------------------- Getters and Setters start public Mail(MailAccount mailAccount) {
/** mailAccount = (null != mailAccount) ? mailAccount : GlobalMailAccount.INSTANCE.getAccount();
* 设置收件人 this.mailAccount = mailAccount.defaultIfEmpty();
* }
* @param tos 收件人列表 // --------------------------------------------------------------- Constructor end
* @return this
* @see #setTos(String...) // --------------------------------------------------------------- Getters and Setters start
*/ /**
public Mail to(String... tos) { * 设置收件人
return setTos(tos); *
} * @param tos 收件人列表
* @return this
/** * @see #setTos(String...)
* 设置多个收件人 */
* public Mail to(String... tos) {
* @param tos 收件人列表 return setTos(tos);
* @return this }
*/
public Mail setTos(String... tos) { /**
this.tos = tos; * 设置多个收件人
return this; *
} * @param tos 收件人列表
* @return this
/** */
* 设置多个抄送人carbon copy public Mail setTos(String... tos) {
* this.tos = tos;
* @param ccs 抄送人列表 return this;
* @return this }
* @since 4.0.3
*/ /**
public Mail setCcs(String... ccs) { * 设置多个抄送人carbon copy
this.ccs = ccs; *
return this; * @param ccs 抄送人列表
} * @return this
* @since 4.0.3
/** */
* 设置多个密送人blind carbon copy public Mail setCcs(String... ccs) {
* this.ccs = ccs;
* @param bccs 密送人列表 return this;
* @return this }
* @since 4.0.3
*/ /**
public Mail setBccs(String... bccs) { * 设置多个密送人blind carbon copy
this.bccs = bccs; *
return this; * @param bccs 密送人列表
} * @return this
* @since 4.0.3
/** */
* 设置多个回复地址(reply-to) public Mail setBccs(String... bccs) {
* this.bccs = bccs;
* @param reply 回复地址(reply-to)列表 return this;
* @return this }
* @since 4.6.0
*/ /**
public Mail setReply(String... reply) { * 设置多个回复地址(reply-to)
this.reply = reply; *
return this; * @param reply 回复地址(reply-to)列表
} * @return this
* @since 4.6.0
/** */
* 设置标题 public Mail setReply(String... reply) {
* this.reply = reply;
* @param title 标题 return this;
* @return this }
*/
public Mail setTitle(String title) { /**
this.title = title; * 设置标题
return this; *
} * @param title 标题
* @return this
/** */
* 设置正文 public Mail setTitle(String title) {
* this.title = title;
* @param content 正文 return this;
* @return this }
*/
public Mail setContent(String content) { /**
this.content = content; * 设置正文
return this; *
} * @param content 正文
* @return this
/** */
* 设置是否是HTML public Mail setContent(String content) {
* this.content = content;
* @param isHtml 是否为HTML return this;
* @return this }
*/
public Mail setHtml(boolean isHtml) { /**
this.isHtml = isHtml; * 设置是否是HTML
return this; *
} * @param isHtml 是否为HTML
* @return this
/** */
* 设置文件类型附件 public Mail setHtml(boolean isHtml) {
* this.isHtml = isHtml;
* @param files 附件文件列表 return this;
* @return this }
*/
public Mail setFiles(File... files) { /**
if(ArrayUtil.isEmpty(files)) { * 设置文件类型附件
return this; *
} * @param files 附件文件列表
* @return this
final DataSource[] attachments = new DataSource[files.length]; */
for (int i = 0; i < files.length; i++) { public Mail setFiles(File... files) {
attachments[i] = new FileDataSource(files[i]); if(ArrayUtil.isEmpty(files)) {
} return this;
return setAttachments(attachments); }
}
final DataSource[] attachments = new DataSource[files.length];
/** for (int i = 0; i < files.length; i++) {
* 设置附件附件使用{@link DataSource} 形式表示可以使用{@link FileDataSource}包装文件表示文件附件 attachments[i] = new FileDataSource(files[i]);
* }
* @param attachments 附件列表 return setAttachments(attachments);
* @return this }
* @since 4.0.9
*/ /**
public Mail setAttachments(DataSource... attachments) { * 设置附件附件使用{@link DataSource} 形式表示可以使用{@link FileDataSource}包装文件表示文件附件
if(ArrayUtil.isNotEmpty(attachments)) { *
this.attachments = attachments; * @param attachments 附件列表
} * @return this
return this; * @since 4.0.9
} */
public Mail setAttachments(DataSource... attachments) {
/** if(ArrayUtil.isNotEmpty(attachments)) {
* 设置字符集编码 this.attachments = attachments;
* }
* @param charset 字符集编码 return this;
* @return this }
* @see MailAccount#setCharset(Charset)
*/ /**
public Mail setCharset(Charset charset) { * 设置图片图片的键对应到邮件模板中的占位字符串
this.mailAccount.setCharset(charset); *
return this; * @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
} */
public Mail setImageMap(Map<String, InputStream> imageMap) {
/** if (imageMap != null && imageMap.size() > 0) {
* 设置是否使用全局会话默认为true this.imageMap = imageMap;
* }
* @param isUseGlobalSession 是否使用全局会话默认为true return this;
* @return this }
* @since 4.0.2
*/ /**
public Mail setUseGlobalSession(boolean isUseGlobalSession) { * 设置字符集编码
this.useGlobalSession = isUseGlobalSession; *
return this; * @param charset 字符集编码
} * @return this
// --------------------------------------------------------------- Getters and Setters end * @see MailAccount#setCharset(Charset)
*/
/** public Mail setCharset(Charset charset) {
* 发送 this.mailAccount.setCharset(charset);
* return this;
* @return this }
* @throws MailException 邮件发送异常
*/ /**
public Mail send() throws MailException { * 设置是否使用全局会话默认为true
try { *
return doSend(); * @param isUseGlobalSession 是否使用全局会话默认为true
} catch (MessagingException e) { * @return this
throw new MailException(e); * @since 4.0.2
} */
} public Mail setUseGlobalSession(boolean isUseGlobalSession) {
this.useGlobalSession = isUseGlobalSession;
// --------------------------------------------------------------- Private method start return this;
/** }
* 执行发送 // --------------------------------------------------------------- Getters and Setters end
*
* @return this /**
* @throws MessagingException 发送异常 * 发送
*/ *
private Mail doSend() throws MessagingException { * @return this
Transport.send(buildMsg()); * @throws MailException 邮件发送异常
return this; */
} public Mail send() throws MailException {
try {
/** return doSend();
* 构建消息 } catch (MessagingException e) {
* throw new MailException(e);
* @return {@link MimeMessage}消息 }
* @throws MessagingException 消息异常 }
*/
private MimeMessage buildMsg() throws MessagingException { // --------------------------------------------------------------- Private method start
final Charset charset = this.mailAccount.getCharset(); /**
final MimeMessage msg = new MimeMessage(getSession(this.useGlobalSession)); * 执行发送
// 发件人 *
final String from = this.mailAccount.getFrom(); * @return this
if (StrUtil.isEmpty(from)) { * @throws MessagingException 发送异常
// 用户未提供发送方则从Session中自动获取 */
msg.setFrom(); private Mail doSend() throws MessagingException {
} else { Transport.send(buildMsg());
msg.setFrom(InternalMailUtil.parseFirstAddress(from, charset)); return this;
} }
// 标题
msg.setSubject(this.title, charset.name()); /**
// 发送时间 * 构建消息
msg.setSentDate(new Date()); *
// 内容和附件 * @return {@link MimeMessage}消息
msg.setContent(buildContent(charset)); * @throws MessagingException 消息异常
// 收件人 */
msg.setRecipients(MimeMessage.RecipientType.TO, InternalMailUtil.parseAddressFromStrs(this.tos, charset)); private MimeMessage buildMsg() throws MessagingException {
// 抄送人 final Charset charset = this.mailAccount.getCharset();
if (ArrayUtil.isNotEmpty(this.ccs)) { final MimeMessage msg = new MimeMessage(getSession(this.useGlobalSession));
msg.setRecipients(MimeMessage.RecipientType.CC, InternalMailUtil.parseAddressFromStrs(this.ccs, charset)); // 发件人
} final String from = this.mailAccount.getFrom();
// 密送人 if (StrUtil.isEmpty(from)) {
if (ArrayUtil.isNotEmpty(this.bccs)) { // 用户未提供发送方则从Session中自动获取
msg.setRecipients(MimeMessage.RecipientType.BCC, InternalMailUtil.parseAddressFromStrs(this.bccs, charset)); msg.setFrom();
} } else {
// 回复地址(reply-to) msg.setFrom(InternalMailUtil.parseFirstAddress(from, charset));
if (ArrayUtil.isNotEmpty(this.reply)) { }
msg.setReplyTo(InternalMailUtil.parseAddressFromStrs(this.reply, charset)); // 标题
} msg.setSubject(this.title, charset.name());
// 发送时间
return msg; msg.setSentDate(new Date());
} // 内容和附件
msg.setContent(buildContent(charset));
/** // 收件人
* 构建邮件信息主体 msg.setRecipients(MimeMessage.RecipientType.TO, InternalMailUtil.parseAddressFromStrs(this.tos, charset));
* // 抄送人
* @param charset 编码 if (ArrayUtil.isNotEmpty(this.ccs)) {
* @return 邮件信息主体 msg.setRecipients(MimeMessage.RecipientType.CC, InternalMailUtil.parseAddressFromStrs(this.ccs, charset));
* @throws MessagingException 消息异常 }
*/ // 密送人
private Multipart buildContent(Charset charset) throws MessagingException { if (ArrayUtil.isNotEmpty(this.bccs)) {
final Multipart mainPart = new MimeMultipart(); msg.setRecipients(MimeMessage.RecipientType.BCC, InternalMailUtil.parseAddressFromStrs(this.bccs, charset));
}
// 正文 // 回复地址(reply-to)
final BodyPart body = new MimeBodyPart(); if (ArrayUtil.isNotEmpty(this.reply)) {
body.setContent(content, StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charset)); msg.setReplyTo(InternalMailUtil.parseAddressFromStrs(this.reply, charset));
mainPart.addBodyPart(body); }
// 附件 return msg;
if (ArrayUtil.isNotEmpty(this.attachments)) { }
BodyPart bodyPart;
for (DataSource attachment : attachments) { /**
bodyPart = new MimeBodyPart(); * 构建邮件信息主体
bodyPart.setDataHandler(new DataHandler(attachment)); *
bodyPart.setFileName(InternalMailUtil.encodeText(attachment.getName(), charset)); * @param charset 编码
mainPart.addBodyPart(bodyPart); * @return 邮件信息主体
} * @throws MessagingException 消息异常
} */
private Multipart buildContent(Charset charset) throws MessagingException {
return mainPart; final Multipart mainPart = new MimeMultipart();
}
// 正文
/** final BodyPart body = new MimeBodyPart();
* 获取默认邮件会话<br> body.setContent(content, StrUtil.format("text/{}; charset={}", isHtml ? "html" : "plain", charset));
* 如果为全局单例的会话则全局只允许一个邮件帐号否则每次发送邮件会新建一个新的会话 mainPart.addBodyPart(body);
*
* @param isSingleton 是否使用单例Session // 附件
* @return 邮件会话 {@link Session} if (ArrayUtil.isNotEmpty(this.attachments)) {
* @since 4.0.2 BodyPart bodyPart;
*/ for (DataSource attachment : attachments) {
private Session getSession(boolean isSingleton) { bodyPart = new MimeBodyPart();
final MailAccount mailAccount = this.mailAccount; bodyPart.setDataHandler(new DataHandler(attachment));
Authenticator authenticator = null; bodyPart.setFileName(InternalMailUtil.encodeText(attachment.getName(), charset));
if (mailAccount.isAuth()) { mainPart.addBodyPart(bodyPart);
authenticator = new UserPassAuthenticator(mailAccount.getUser(), mailAccount.getPass()); }
} }
return isSingleton ? Session.getDefaultInstance(mailAccount.getSmtpProps(), authenticator) // // 图片
: Session.getInstance(mailAccount.getSmtpProps(), authenticator); for (Map.Entry<String, InputStream> entry : imageMap.entrySet()) {
} BodyPart messageBodyPart = new MimeBodyPart();
// --------------------------------------------------------------- Private method end 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;
}
/**
* 获取默认邮件会话<br>
* 如果为全局单例的会话则全局只允许一个邮件帐号否则每次发送邮件会新建一个新的会话
*
* @param isSingleton 是否使用单例Session
* @return 邮件会话 {@link Session}
* @since 4.0.2
*/
private Session getSession(boolean isSingleton) {
final MailAccount mailAccount = this.mailAccount;
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 end
}

View File

@ -1,236 +1,382 @@
package cn.hutool.extra.mail; package cn.hutool.extra.mail;
import java.io.File; import java.io.File;
import java.util.Collection; import java.io.InputStream;
import java.util.List; import java.util.Collection;
import java.util.List;
import cn.hutool.core.collection.CollUtil; import java.util.Map;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.collection.CollUtil;
/** import cn.hutool.core.util.StrUtil;
* 邮件工具类基于javax.mail封装
* /**
* @author looly * 邮件工具类基于javax.mail封装
* @since 3.1.2 *
*/ * @author looly
public class MailUtil { * @since 3.1.2
*/
/** public class MailUtil {
* 使用配置文件中设置的账户发送文本邮件发送给单个或多个收件人<br> /**
* 多个收件人可以使用逗号,分隔也可以通过分号;分隔 * 使用配置文件中设置的账户发送文本邮件发送给单个或多个收件人<br>
* * 多个收件人可以使用逗号,分隔也可以通过分号;分隔
* @param to 收件人 *
* @param subject 标题 * @param to 收件人
* @param content 正文 * @param subject 标题
* @param files 附件列表 * @param content 正文
* @since 3.2.0 * @param files 附件列表
*/ * @since 3.2.0
public static void sendText(String to, String subject, String content, File... files) { */
send(to, subject, content, false, files); public static void sendText(String to, String subject, String content, File... files) {
} send(to, subject, content, false, files);
}
/**
* 使用配置文件中设置的账户发送HTML邮件发送给单个或多个收件人<br> /**
* 多个收件人可以使用逗号,分隔也可以通过分号;分隔 * 使用配置文件中设置的账户发送HTML邮件发送给单个或多个收件人<br>
* * 多个收件人可以使用逗号,分隔也可以通过分号;分隔
* @param to 收件人 *
* @param subject 标题 * @param to 收件人
* @param content 正文 * @param subject 标题
* @param files 附件列表 * @param content 正文
* @since 3.2.0 * @param files 附件列表
*/ * @since 3.2.0
public static void sendHtml(String to, String subject, String content, File... files) { */
send(to, subject, content, true, files); public static void sendHtml(String to, String subject, String content, File... files) {
} send(to, subject, content, true, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br> /**
* 多个收件人可以使用逗号,分隔也可以通过分号;分隔 * 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br>
* * 多个收件人可以使用逗号,分隔也可以通过分号;分隔
* @param to 收件人 *
* @param subject 标题 * @param to 收件人
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML
*/ * @param files 附件列表
public static void send(String to, String subject, String content, boolean isHtml, File... files) { */
send(splitAddress(to), subject, content, isHtml, files); public static void send(String to, String subject, String content, boolean isHtml, File... files) {
} send(splitAddress(to), subject, content, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br> /**
* 多个收件人抄送人密送人可以使用逗号,分隔也可以通过分号;分隔 * 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br>
* * 多个收件人抄送人密送人可以使用逗号,分隔也可以通过分号;分隔
* @param to 收件人可以使用逗号,分隔也可以通过分号;分隔 *
* @param cc 抄送人可以使用逗号,分隔也可以通过分号;分隔 * @param to 收件人可以使用逗号,分隔也可以通过分号;分隔
* @param bcc 密送人可以使用逗号,分隔也可以通过分号;分隔 * @param cc 抄送人可以使用逗号,分隔也可以通过分号;分隔
* @param subject 标题 * @param bcc 密送人可以使用逗号,分隔也可以通过分号;分隔
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML
* @since 4.0.3 * @param files 附件列表
*/ * @since 4.0.3
public static void send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) { */
send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files); public static void send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) {
} send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送文本邮件发送给多人 /**
* * 使用配置文件中设置的账户发送文本邮件发送给多人
* @param tos 收件人列表 *
* @param subject 标题 * @param tos 收件人列表
* @param content 正文 * @param subject 标题
* @param files 附件列表 * @param content 正文
*/ * @param files 附件列表
public static void sendText(Collection<String> tos, String subject, String content, File... files) { */
send(tos, subject, content, false, files); public static void sendText(Collection<String> tos, String subject, String content, File... files) {
} send(tos, subject, content, false, files);
}
/**
* 使用配置文件中设置的账户发送HTML邮件发送给多人 /**
* * 使用配置文件中设置的账户发送HTML邮件发送给多人
* @param tos 收件人列表 *
* @param subject 标题 * @param tos 收件人列表
* @param content 正文 * @param subject 标题
* @param files 附件列表 * @param content 正文
* @since 3.2.0 * @param files 附件列表
*/ * @since 3.2.0
public static void sendHtml(Collection<String> tos, String subject, String content, File... files) { */
send(tos, subject, content, true, files); public static void sendHtml(Collection<String> tos, String subject, String content, File... files) {
} send(tos, subject, content, true, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送给多人 /**
* * 使用配置文件中设置的账户发送邮件发送给多人
* @param tos 收件人列表 *
* @param subject 标题 * @param tos 收件人列表
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML
*/ * @param files 附件列表
public static void send(Collection<String> tos, String subject, String content, boolean isHtml, File... files) { */
send(tos, null, null, subject, content, isHtml, files); public static void send(Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
} send(tos, null, null, subject, content, isHtml, files);
}
/**
* 使用配置文件中设置的账户发送邮件发送给多人 /**
* * 使用配置文件中设置的账户发送邮件发送给多人
* @param tos 收件人列表 *
* @param ccs 抄送人列表可以为null或空 * @param tos 收件人列表
* @param bccs 密送人列表可以为null或空 * @param ccs 抄送人列表可以为null或空
* @param subject 标题 * @param bccs 密送人列表可以为null或空
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML
* @since 4.0.3 * @param files 附件列表
*/ * @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) { */
send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, isHtml, 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, null, isHtml, files);
}
//------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
/** //------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
* 发送邮件给多人 /**
* * 发送邮件给多人
* @param mailAccount 邮件认证对象 *
* @param to 收件人多个收件人逗号或者分号隔开 * @param mailAccount 邮件认证对象
* @param subject 标题 * @param to 收件人多个收件人逗号或者分号隔开
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML格式 * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML格式
* @since 3.2.0 * @param files 附件列表
*/ * @since 3.2.0
public static void send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) { */
send(mailAccount, splitAddress(to), subject, content, isHtml, files); public static void send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) {
} send(mailAccount, splitAddress(to), subject, content, isHtml, files);
}
/**
* 发送邮件给多人 /**
* * 发送邮件给多人
* @param mailAccount 邮件帐户信息 *
* @param tos 收件人列表 * @param mailAccount 邮件帐户信息
* @param subject 标题 * @param tos 收件人列表
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML格式 * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML格式
*/ * @param files 附件列表
public static void send(MailAccount mailAccount, Collection<String> tos, String subject, String content, boolean isHtml, File... files) { */
send(mailAccount, tos, null, null, subject, content, isHtml, files); public static void send(MailAccount mailAccount, Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
} send(mailAccount, tos, null, null, subject, content, isHtml, files);
}
/**
* 发送邮件给多人 /**
* * 发送邮件给多人
* @param mailAccount 邮件帐户信息 *
* @param tos 收件人列表 * @param mailAccount 邮件帐户信息
* @param ccs 抄送人列表可以为null或空 * @param tos 收件人列表
* @param bccs 密送人列表可以为null或空 * @param ccs 抄送人列表可以为null或空
* @param subject 标题 * @param bccs 密送人列表可以为null或空
* @param content 正文 * @param subject 标题
* @param isHtml 是否为HTML格式 * @param content 正文
* @param files 附件列表 * @param isHtml 是否为HTML格式
* @since 4.0.3 * @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, boolean isHtml, File... files) { */
send(mailAccount, false, tos, ccs, bccs, subject, content, isHtml, 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, null, isHtml, files);
}
//------------------------------------------------------------------------------------------------------------------------ Private method start
/** /**
* 发送邮件给多人 * 使用配置文件中设置的账户发送HTML邮件发送给单个或多个收件人<br>
* * 多个收件人可以使用逗号,分隔也可以通过分号;分隔
* @param mailAccount 邮件帐户信息 *
* @param useGlobalSession 是否全局共享Session * @param to 收件人
* @param tos 收件人列表 * @param subject 标题
* @param ccs 抄送人列表可以为null或空 * @param content 正文
* @param bccs 密送人列表可以为null或空 * @param files 附件列表
* @param subject 标题 * @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
* @param content 正文 * @since 3.2.0
* @param isHtml 是否为HTML格式 */
* @param files 附件列表 public static void sendHtml(String to, String subject, String content, Map<String, InputStream> imageMap, File... files) {
* @since 4.0.3 send(to, subject, content, imageMap, true, files);
*/ }
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) {
final Mail mail = Mail.create(mailAccount).setUseGlobalSession(useGlobalSession); /**
* 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br>
//可选抄送人 * 多个收件人可以使用逗号,分隔也可以通过分号;分隔
if(CollUtil.isNotEmpty(ccs)) { *
mail.setCcs(ccs.toArray(new String[ccs.size()])); * @param to 收件人
} * @param subject 标题
//可选密送人 * @param content 正文
if(CollUtil.isNotEmpty(bccs)) { * @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
mail.setBccs(bccs.toArray(new String[bccs.size()])); * @param isHtml 是否为HTML
} * @param files 附件列表
*/
mail.setTos(tos.toArray(new String[tos.size()])); public static void send(String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
mail.setTitle(subject); send(splitAddress(to), subject, content, imageMap, isHtml, files);
mail.setContent(content); }
mail.setHtml(isHtml);
mail.setFiles(files); /**
* 使用配置文件中设置的账户发送邮件发送单个或多个收件人<br>
mail.send(); * 多个收件人抄送人密送人可以使用逗号,分隔也可以通过分号;分隔
} *
* @param to 收件人可以使用逗号,分隔也可以通过分号;分隔
/** * @param cc 抄送人可以使用逗号,分隔也可以通过分号;分隔
* 将多个联系人转为列表分隔符为逗号或者分号 * @param bcc 密送人可以使用逗号,分隔也可以通过分号;分隔
* * @param subject 标题
* @param addresses 多个联系人如果为空返回null * @param content 正文
* @return 联系人列表 * @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
*/ * @param isHtml 是否为HTML
private static List<String> splitAddress(String addresses){ * @param files 附件列表
if(StrUtil.isBlank(addresses)) { * @since 4.0.3
return null; */
} 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);
List<String> result; }
if(StrUtil.contains(addresses, ',')) {
result = StrUtil.splitTrim(addresses, ','); /**
}else if(StrUtil.contains(addresses, ';')) { * 使用配置文件中设置的账户发送HTML邮件发送给多人
result = StrUtil.splitTrim(addresses, ';'); *
}else { * @param tos 收件人列表
result = CollUtil.newArrayList(addresses); * @param subject 标题
} * @param content 正文
return result; * @param imageMap 图片与占位符占位符格式为cid:$IMAGE_PLACEHOLDER
} * @param files 附件列表
//------------------------------------------------------------------------------------------------------------------------ Private method end * @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
/**
* 发送邮件给多人
*
* @param mailAccount 邮件帐户信息
* @param useGlobalSession 是否全局共享Session
* @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
*/
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);
//可选抄送人
if(CollUtil.isNotEmpty(ccs)) {
mail.setCcs(ccs.toArray(new String[ccs.size()]));
}
//可选密送人
if(CollUtil.isNotEmpty(bccs)) {
mail.setBccs(bccs.toArray(new String[bccs.size()]));
}
mail.setTos(tos.toArray(new String[tos.size()]));
mail.setTitle(subject);
mail.setContent(content);
mail.setHtml(isHtml);
mail.setFiles(files);
mail.setImageMap(imageMap);
mail.send();
}
/**
* 将多个联系人转为列表分隔符为逗号或者分号
*
* @param addresses 多个联系人如果为空返回null
* @return 联系人列表
*/
private static List<String> splitAddress(String addresses){
if(StrUtil.isBlank(addresses)) {
return null;
}
List<String> result;
if(StrUtil.contains(addresses, ',')) {
result = StrUtil.splitTrim(addresses, ',');
}else if(StrUtil.contains(addresses, ';')) {
result = StrUtil.splitTrim(addresses, ';');
}else {
result = CollUtil.newArrayList(addresses);
}
return result;
}
//------------------------------------------------------------------------------------------------------------------------ Private method end
}