123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- package com.ruoyi.common.utils.email;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.io.IoUtil;
- import cn.hutool.core.map.MapUtil;
- import cn.hutool.core.util.CharUtil;
- import cn.hutool.core.util.StrUtil;
- import cn.hutool.extra.mail.*;
- import com.ruoyi.common.utils.StringUtils;
- import com.ruoyi.common.utils.spring.SpringUtils;
- import lombok.AccessLevel;
- import lombok.NoArgsConstructor;
- import javax.mail.Authenticator;
- import javax.mail.Session;
- import java.io.File;
- import java.io.InputStream;
- import java.util.Collection;
- import java.util.List;
- import java.util.Map;
- /**
- * 邮件工具类
- */
- @NoArgsConstructor(access = AccessLevel.PRIVATE)
- public class MailUtils {
- private static final MailAccount ACCOUNT = SpringUtils.getBean(MailAccount.class);
- /**
- * 获取邮件发送实例
- */
- public static MailAccount getMailAccount() {
- return ACCOUNT;
- }
- /**
- * 获取邮件发送实例 (自定义发送人以及授权码)
- *
- * @param username 发送人
- * @param password 授权码
- */
- public static MailAccount getMailAccount(String username, String password) {
- ACCOUNT.setFrom(StringUtils.blankToDefault(username, ACCOUNT.getUser()));
- ACCOUNT.setUser(StringUtils.blankToDefault(username, ACCOUNT.getUser()));
- ACCOUNT.setPass(StringUtils.blankToDefault(password, ACCOUNT.getPass()));
- return ACCOUNT;
- }
- /**
- * 使用配置文件中设置的账户发送文本邮件,发送给单个或多个收件人<br>
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔
- *
- * @param to 收件人
- * @param subject 标题
- * @param content 正文
- * @param files 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String sendText(String to, String subject, String content, File... files) {
- return send(to, subject, content, false, files);
- }
- /**
- * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人<br>
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔
- *
- * @param to 收件人
- * @param subject 标题
- * @param content 正文
- * @param files 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String sendHtml(String to, String subject, String content, File... files) {
- return send(to, subject, content, true, files);
- }
- /**
- * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人<br>
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔
- *
- * @param to 收件人
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML
- * @param files 附件列表
- * @return message-id
- */
- public static String send(String to, String subject, String content, boolean isHtml, File... files) {
- return send(splitAddress(to), subject, content, isHtml, files);
- }
- /**
- * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人<br>
- * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔
- *
- * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔
- * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔
- * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML
- * @param files 附件列表
- * @return message-id
- * @since 4.0.3
- */
- public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) {
- return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files);
- }
- /**
- * 使用配置文件中设置的账户发送文本邮件,发送给多人
- *
- * @param tos 收件人列表
- * @param subject 标题
- * @param content 正文
- * @param files 附件列表
- * @return message-id
- */
- public static String sendText(Collection<String> tos, String subject, String content, File... files) {
- return send(tos, subject, content, false, files);
- }
- /**
- * 使用配置文件中设置的账户发送HTML邮件,发送给多人
- *
- * @param tos 收件人列表
- * @param subject 标题
- * @param content 正文
- * @param files 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String sendHtml(Collection<String> tos, String subject, String content, File... files) {
- return send(tos, subject, content, true, files);
- }
- /**
- * 使用配置文件中设置的账户发送邮件,发送给多人
- *
- * @param tos 收件人列表
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML
- * @param files 附件列表
- * @return message-id
- */
- public static String send(Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
- return send(tos, null, null, subject, content, isHtml, files);
- }
- /**
- * 使用配置文件中设置的账户发送邮件,发送给多人
- *
- * @param tos 收件人列表
- * @param ccs 抄送人列表,可以为null或空
- * @param bccs 密送人列表,可以为null或空
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML
- * @param files 附件列表
- * @return message-id
- * @since 4.0.3
- */
- public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
- return send(getMailAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files);
- }
- // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount
- /**
- * 发送邮件给多人
- *
- * @param mailAccount 邮件认证对象
- * @param to 收件人,多个收件人逗号或者分号隔开
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML格式
- * @param files 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) {
- return send(mailAccount, splitAddress(to), subject, content, isHtml, files);
- }
- /**
- * 发送邮件给多人
- *
- * @param mailAccount 邮件帐户信息
- * @param tos 收件人列表
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML格式
- * @param files 附件列表
- * @return message-id
- */
- public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content, boolean isHtml, File... files) {
- return send(mailAccount, tos, null, null, subject, content, isHtml, files);
- }
- /**
- * 发送邮件给多人
- *
- * @param mailAccount 邮件帐户信息
- * @param tos 收件人列表
- * @param ccs 抄送人列表,可以为null或空
- * @param bccs 密送人列表,可以为null或空
- * @param subject 标题
- * @param content 正文
- * @param isHtml 是否为HTML格式
- * @param files 附件列表
- * @return message-id
- * @since 4.0.3
- */
- public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, boolean isHtml, File... files) {
- return send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files);
- }
- /**
- * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人<br>
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔
- *
- * @param to 收件人
- * @param subject 标题
- * @param content 正文
- * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER
- * @param files 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String sendHtml(String to, String subject, String content, Map<String, InputStream> imageMap, File... files) {
- return send(to, subject, content, imageMap, true, files);
- }
- /**
- * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人<br>
- * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔
- *
- * @param to 收件人
- * @param subject 标题
- * @param content 正文
- * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER
- * @param isHtml 是否为HTML
- * @param files 附件列表
- * @return message-id
- */
- public static String send(String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
- return 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 附件列表
- * @return message-id
- * @since 4.0.3
- */
- public static String send(String to, String cc, String bcc, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
- return 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 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String sendHtml(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, File... files) {
- return send(tos, subject, content, imageMap, true, files);
- }
- /**
- * 使用配置文件中设置的账户发送邮件,发送给多人
- *
- * @param tos 收件人列表
- * @param subject 标题
- * @param content 正文
- * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER
- * @param isHtml 是否为HTML
- * @param files 附件列表
- * @return message-id
- */
- public static String send(Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
- return 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 附件列表
- * @return message-id
- * @since 4.0.3
- */
- public static String send(Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
- return send(getMailAccount(), 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 附件列表
- * @return message-id
- * @since 3.2.0
- */
- public static String send(MailAccount mailAccount, String to, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
- return 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 附件列表
- * @return message-id
- * @since 4.6.3
- */
- public static String send(MailAccount mailAccount, Collection<String> tos, String subject, String content, Map<String, InputStream> imageMap, boolean isHtml, File... files) {
- return 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 附件列表
- * @return message-id
- * @since 4.6.3
- */
- public static String send(MailAccount mailAccount, Collection<String> tos, Collection<String> ccs, Collection<String> bccs, String subject, String content, Map<String, InputStream> imageMap,
- boolean isHtml, File... files) {
- return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files);
- }
- /**
- * 根据配置文件,获取邮件客户端会话
- *
- * @param mailAccount 邮件账户配置
- * @param isSingleton 是否单例(全局共享会话)
- * @return {@link Session}
- * @since 5.5.7
- */
- public static Session getSession(MailAccount mailAccount, boolean isSingleton) {
- 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 start
- /**
- * 发送邮件给多人
- *
- * @param mailAccount 邮件帐户信息
- * @param useGlobalSession 是否全局共享Session
- * @param tos 收件人列表
- * @param ccs 抄送人列表,可以为null或空
- * @param bccs 密送人列表,可以为null或空
- * @param subject 标题
- * @param content 正文
- * @param imageMap 图片与占位符,占位符格式为cid:${cid}
- * @param isHtml 是否为HTML格式
- * @param files 附件列表
- * @return message-id
- * @since 4.6.3
- */
- private static String 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[0]));
- }
- // 可选密送人
- if (CollUtil.isNotEmpty(bccs)) {
- mail.setBccs(bccs.toArray(new String[0]));
- }
- mail.setTos(tos.toArray(new String[0]));
- mail.setTitle(subject);
- mail.setContent(content);
- mail.setHtml(isHtml);
- mail.setFiles(files);
- // 图片
- if (MapUtil.isNotEmpty(imageMap)) {
- for (Map.Entry<String, InputStream> entry : imageMap.entrySet()) {
- mail.addImage(entry.getKey(), entry.getValue());
- // 关闭流
- IoUtil.close(entry.getValue());
- }
- }
- return 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, CharUtil.COMMA)) {
- result = StrUtil.splitTrim(addresses, CharUtil.COMMA);
- } else if (StrUtil.contains(addresses, ';')) {
- result = StrUtil.splitTrim(addresses, ';');
- } else {
- result = CollUtil.newArrayList(addresses);
- }
- return result;
- }
- // ------------------------------------------------------------------------------------------------------------------------ Private method end
- }
|