diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java index a8c40b08..0c69a6bd 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java @@ -24,6 +24,11 @@ public class MessageDTO implements Serializable { */ protected String toUser; + /* + * 用户名-Email + * */ + protected Map userEmail; + /** * 发送给所有人 */ diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java index d465b421..2b716902 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/email/EmailServiceManager.java @@ -1,6 +1,7 @@ package org.jeecg.common.email; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.google.common.collect.Lists; import com.sun.mail.imap.IMAPStore; @@ -14,6 +15,7 @@ import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; import javax.mail.*; +import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; @@ -152,7 +154,44 @@ public class EmailServiceManager { } /** - * 发送邮件 + * 发送邮件 单发 + */ + public void sendMailToOne(MessageDTO messageDTO) throws MessagingException { + // 邮箱连接属性 + Properties props = new Properties(); + props.put("mail.transport.protocol", "smtp"); + props.put("mail.smtp.host", email.getEmailServerAddress()); + props.put("mail.smtp.port", email.getPort()); + props.put("mail.smtp.auth", "true"); + /*props.put("mail.smtp.socketFactory.port", email.getPort()); + props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");*/ + + Session session = Session.getInstance(props); + + String toUser = messageDTO.getToUser(); + + Message message = new MimeMessage(session); + // 邮件发送方(邮箱必须真实有效) + message.setFrom(new InternetAddress(email.getUsername())); + // 设置主题 + message.setSubject(messageDTO.getTitle()); + // 设置正文 + message.setText(messageDTO.getContent()); + // 设置收件地址 + message.setRecipient(Message.RecipientType.TO, + new InternetAddress(toUser)); + + // 发送邮件 + Transport transport = session.getTransport(); + transport.connect(email.getUsername(),email.getPassword()); + transport.sendMessage(message, message.getAllRecipients()); + + // 关闭资源 + transport.close(); + } + + /** + * 发送邮件 群发 */ public void sendMail(MessageDTO messageDTO){ // 邮箱连接属性 diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/Demo.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/Demo.java new file mode 100644 index 00000000..e18df39f --- /dev/null +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/Demo.java @@ -0,0 +1,79 @@ +package org.jeecg.modules; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.sun.mail.imap.IMAPFolder; +import com.sun.mail.imap.IMAPStore; + +import javax.mail.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class Demo { + + /*public static void main(String[] args) { + String host = "imap.163.com"; + String username = "nzyone@163.com"; + String password = "NHFYZPXSPBKZUXTJ"; + + try { + // 创建连接属性 + Properties props = new Properties(); + props.setProperty("mail.store.protocol", "imap"); + props.put("mail.imap.port", "143"); + // props.put("mail.imap.ssl.enable", "true"); + + Map IAM = new HashMap(); + //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。 + IAM.put("name","liuyang"); + IAM.put("version","1.0.0"); + IAM.put("vendor","myclient"); + IAM.put("support-email","nzyone@163.com"); + Session session = Session.getInstance(props); + IMAPStore store = (IMAPStore) session.getStore("imap"); + + // 创建会话 + //Session session = Session.getInstance(props); + + // 创建IMAP存储对象并连接到服务器 + //Store store = session.getStore("imap"); + store.connect(host, username, password); + + store.id(IAM); + + Quota[] quotas = store.getQuota("INBOX"); + + // 打开收件箱 + //IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX"); + //inbox.open(Folder.READ_ONLY); + + // 获取邮箱容量信息 + //Quota[] quotas = inbox.getQuota(); + + for (Quota quota : quotas) { + Quota.Resource[] resources = quota.resources; + + for (Quota.Resource res : resources) { + long usage = res.usage; + long limit = res.limit; + + System.out.println("Resource: " + res); + System.out.println("Usage: " + usage); + System.out.println("Limit: " + limit); + } + } + + // 关闭连接 + // inbox.close(false); + store.close(); + } catch (Exception e) { + e.printStackTrace(); + } + }*/ + + public static void main(String[] args) { + double a = 4.148059e+03; + } +} diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java index add1619a..8fd27499 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmLogController.java @@ -2,13 +2,22 @@ package org.jeecg.modules.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.email.EmailServiceManager; +import org.jeecg.common.util.SpringContextUtils; import org.jeecg.modules.base.entity.postgre.AlarmLog; +import org.jeecg.modules.base.entity.postgre.SysEmail; import org.jeecg.modules.service.IAlarmLogService; import org.jeecg.modules.base.bizVo.AlarmVo; +import org.jeecg.modules.service.ISysEmailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.mail.MessagingException; + +import static org.jeecg.common.email.EmailServiceManager.getInstance; + @RestController @RequestMapping("alarmLog") @Api(value = "报警日志服务", tags = "报警日志服务") diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/CalculateConcService.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/CalculateConcService.java index f56bedb2..1936c1a0 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/CalculateConcService.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/CalculateConcService.java @@ -10,5 +10,5 @@ public interface CalculateConcService { boolean calcAndSave(); - Map calculate(List concDtos, BigDecimal index); + Map calculate(List concDtos, BigDecimal index); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/SendMessage.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/SendMessage.java index 0e167df2..fad9098b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/SendMessage.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/SendMessage.java @@ -1,6 +1,7 @@ package org.jeecg.modules.message; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.config.mqtoken.UserTokenContext; @@ -69,8 +70,11 @@ public class SendMessage { } else if (way.equals(YJ.getValue())) {// 2.推送邮箱 String toEmail = contact.get(Email); if (StrUtil.isNotBlank(toEmail)){ - messageDTO.setToUser(toEmail); + // messageDTO.setToUser(toEmail); messageDTO.setType(YJ.getType()); + Map userEmail = new HashMap<>(contact); + MapUtil.removeAny(userEmail, Sms, Email, System); + messageDTO.setUserEmail(userEmail); sysBaseAPI.sendTemplateMessage(messageDTO); } } else if (way.equals(SMS.getValue())) {// 3.推送短信 @@ -103,6 +107,9 @@ public class SendMessage { .filter(user -> StrUtil.isNotBlank(user.getEmail())) .map(SysUser::getEmail) .collect(Collectors.joining(comma)); + // 用户名-邮箱Map + Map userEmail = sysUsers.stream() + .collect(Collectors.toMap(SysUser::getUsername, SysUser::getEmail)); // 手机号码 String phoneList = sysUsers.stream() .filter(user -> StrUtil.isNotBlank(user.getPhone())) @@ -112,6 +119,7 @@ public class SendMessage { result.put(System,usernameList); result.put(Email,emailList); result.put(Sms,phoneList); + result.putAll(userEmail); return result; } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailPushMsgHandle.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailPushMsgHandle.java index 1012df2b..b6a9fd45 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailPushMsgHandle.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailPushMsgHandle.java @@ -1,5 +1,7 @@ package org.jeecg.modules.message.handle.impl; +import cn.hutool.core.util.StrUtil; +import com.sun.mail.smtp.SMTPAddressFailedException; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.email.EmailServiceManager; @@ -10,6 +12,11 @@ import org.jeecg.modules.message.service.ISysMessageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.mail.MessagingException; +import javax.mail.SendFailedException; +import java.util.List; +import java.util.Map; + import static org.jeecg.common.email.EmailServiceManager.getInstance; /** @@ -26,16 +33,45 @@ public class EmailPushMsgHandle implements ISendMsgHandle { @Autowired private ISysMessageService sysMessageService; + @Autowired + private SystemSendMsgHandle systemSendMsg; + @Override public void sendMessage(MessageDTO messageDTO) { // 获取邮件发送服务器信息 SysEmail sysEmail = abnormalAlarmClient.getSender().getResult(); - // 初始化邮件服务 EmailServiceManager emailService = getInstance(); emailService.init(sysEmail); - // 发送邮件 - emailService.sendMail(messageDTO); + // 单独给每个用户发送邮件 + /*String toUser = messageDTO.getToUser(); + List toUsers = StrUtil.splitTrim(toUser, ",");*/ + String title = messageDTO.getTitle(); + String context = messageDTO.getContent(); + String alarmTitle = "邮件发送失败提醒"; + String alarmContext = "系统给您发送的邮件[标题:"+ title + + ", 内容:" + context + "]发送失败,失败原因:"; + // 循环给每一个用户发送邮件 + for (Map.Entry userEmails : messageDTO.getUserEmail().entrySet()) { + String username = userEmails.getKey(); + String email = userEmails.getValue(); + try { + messageDTO.setToUser(email); + emailService.sendMailToOne(messageDTO); + } catch (MessagingException e) { + if (e instanceof SMTPAddressFailedException) { // 无效的电子邮箱异常 + alarmContext += "无效的电子邮箱 " + email; + } else if (e instanceof SendFailedException) { // 邮件发送失败异常 + alarmContext += e.getMessage(); + } + // 邮件发送失败 给用户发送站内提示消息 + MessageDTO sysMsg = new MessageDTO(); + sysMsg.setToUser(username); + sysMsg.setTitle(alarmTitle); + sysMsg.setContent(alarmContext); + systemSendMsg.sendMessage(sysMsg); + } + } sysMessageService.add(messageDTO); }