From 24f1f4c3e7ef61f1b7000a819677bc6e44cc7161 Mon Sep 17 00:00:00 2001 From: AlanScipio Date: Mon, 4 Mar 2024 16:44:58 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E9=82=AE=E4=BB=B6=E5=8F=91?= =?UTF-8?q?=E9=80=81=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/mail/SpringMailSender.java | 35 +-- .../com/ruoyi/system/config/MailConfig.java | 43 +++- .../controller/SysMailLogController.java | 27 ++- .../com/ruoyi/system/domain/SysMailLog.java | 106 ++------- .../com/ruoyi/system/domain/vo/MailVo.java | 48 ++++ .../system/service/ISysMailLogService.java | 14 +- .../service/impl/SysConfigServiceImpl.java | 5 + .../service/impl/SysMailLogServiceImpl.java | 164 +++++++++++++- .../ruoyi/system/mapper/SysMailLogMapper.xml | 26 ++- ruoyi-ui/src/api/system/mailLog.js | 49 ++-- .../src/components/FpFileUpload/index.vue | 24 +- ruoyi-ui/src/views/system/mailLog/index.vue | 209 ++++++++++++------ ruoyi-ui/src/views/wms/InvTransHis/index.vue | 1 - ruoyi-ui/src/views/wms/ItemInfo/index.vue | 3 + sql/ry-cloud-ryas.sql | 25 +-- 15 files changed, 522 insertions(+), 257 deletions(-) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MailVo.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/mail/SpringMailSender.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/mail/SpringMailSender.java index 0a3e6d50..1bfbbf25 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/mail/SpringMailSender.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/mail/SpringMailSender.java @@ -53,6 +53,17 @@ public class SpringMailSender implements MailSender { //超时设置 mailProperties.setProperty("mail.smtp.connectiontimeout", timeout + "");//与邮件服务器建立连接的超时 mailProperties.setProperty("mail.smtp.writetimeout", timeout + "");//邮件发送时间限制 + javaMailSender.setDefaultEncoding("UTF-8"); + System.setProperty("mail.mime.splitlongparameters", "false"); //注意:不截断base64编码后的长附件名 + //设置认证信息 + setAuthInfo(javaMailSender, account, mailProperties); + return javaMailSender; + } + + private void setAuthInfo(JavaMailSenderImpl executor, MailSendAccount account, Properties mailProperties) { + if (mailProperties == null) { + mailProperties = executor.getJavaMailProperties(); + } if (account.isSslFlag()) { //开启ssl System.out.println("****** enable ssl for mail send ******"); @@ -61,18 +72,14 @@ public class SpringMailSender implements MailSender { mailProperties.setProperty("mail.smtp.ssl.enable", "true"); } else { System.out.println("****** disable ssl for mail send ******"); - javaMailSender.setPort(account.getPort()); + executor.setPort(account.getPort() == null ? 25 : account.getPort()); } - javaMailSender.setJavaMailProperties(mailProperties); - javaMailSender.setHost(account.getHost()); - javaMailSender.setUsername(account.getUsername()); - javaMailSender.setPassword(account.getPassword()); - javaMailSender.setDefaultEncoding("UTF-8"); - System.setProperty("mail.mime.splitlongparameters", "false"); //注意:不截断base64编码后的长附件名 - return javaMailSender; + executor.setJavaMailProperties(mailProperties); + executor.setHost(account.getHost()); + executor.setUsername(account.getUsername()); + executor.setPassword(account.getPassword()); } - /** * 创建邮件信息 * @@ -90,13 +97,13 @@ public class SpringMailSender implements MailSender { //创建发送MIME邮件的工具类 MimeMessageHelper messageHelper = getMimeMessageHelper(form, mimeMessage, headInfo); //设置正文多媒体信息 - if (inLineMap != null) { + if (inLineMap != null && !inLineMap.isEmpty()) { for (Map.Entry inLine : inLineMap.entrySet()) { messageHelper.addInline(inLine.getKey(), inLine.getValue()); } } //添加附件 - if (attachments != null) { + if (attachments != null && !attachments.isEmpty()) { for (Map.Entry entry : attachments.entrySet()) { String fileName = entry.getKey(); File file = entry.getValue(); @@ -111,9 +118,8 @@ public class SpringMailSender implements MailSender { //发件人 if (form.getFrom() == null || form.getFrom().isEmpty()) { form.setFrom(senderAccount.getUsername()); - } else { - form.setFrom(form.getFrom()); } + messageHelper.setFrom(form.getFrom()); //收件人 这里的参数可以是多个收件人,用英文分号分割 messageHelper.setTo(headInfo.getTo().split(ADDRESS_SPLIT)); //抄送 这里的参数可以是多个抄送人,用英文分号分割 @@ -125,6 +131,8 @@ public class SpringMailSender implements MailSender { //邮件正文 if (form.getContent() != null && !form.getContent().isEmpty()) { messageHelper.setText(form.getContent(), form.isHtml()); + } else { + messageHelper.setText(""); } return messageHelper; } @@ -160,6 +168,7 @@ public class SpringMailSender implements MailSender { public void resetSenderAccount(MailSendAccount senderAccount) { checkAccount(senderAccount); this.senderAccount = senderAccount; + setAuthInfo(executor, senderAccount, null); } private void checkAccount(MailSendAccount account) { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/MailConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/MailConfig.java index 964bb075..2f86e9f7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/MailConfig.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/config/MailConfig.java @@ -4,11 +4,14 @@ import com.ruoyi.common.core.mail.MailSendAccount; import com.ruoyi.common.core.mail.MailSender; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.utils.SysConfigUtils; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.io.File; + /** * 邮件配置 * @@ -28,6 +31,12 @@ public class MailConfig { @Value("${spring.mail.password:#{null}}") private String password; + @Getter + private File attachmentsSavedDir; + + private MailSender mailSender; + + @Bean public MailSender mailSender() { MailSendAccount account = new MailSendAccount(); @@ -38,11 +47,27 @@ public class MailConfig { account.setUsername(username); account.setPassword(password); + getFromCache(account); + mailSender = MailSender.build(account, true); + log.info("Mail configuration has been initialized. smtpHost: [{}], smtpPort: [{}], username: [{}]", account.getHost(), account.getPort(), account.getUsername()); + + return mailSender; + } + + /** + * 从缓存中获取邮件配置 + */ + @SuppressWarnings("ResultOfMethodCallIgnored") + private void getFromCache(MailSendAccount account) { + if (account == null) { + throw new IllegalArgumentException("MailSendAccount is null"); + } // 加载数据库中的邮件配置(会缓存到redis中,并覆盖前面的配置) String hostCache = SysConfigUtils.getConfigCache("sys.mail.smtpHost"); String portCache = SysConfigUtils.getConfigCache("sys.mail.smtpPort"); String usernameCache = SysConfigUtils.getConfigCache("sys.mail.username"); String passwordCache = SysConfigUtils.getConfigCache("sys.mail.password"); + String attachmentsSavedPath = SysConfigUtils.getConfigCache("sys.mail.attachmentsSavedPath"); if (StringUtils.isNotBlank(hostCache) && StringUtils.isNotBlank(portCache)) { account.setHost(hostCache); account.setPort(Integer.parseInt(portCache)); @@ -52,13 +77,27 @@ public class MailConfig { if (StringUtils.isNotBlank(passwordCache)) { account.setPassword(passwordCache); } + if (StringUtils.isNotBlank(attachmentsSavedPath)) { + attachmentsSavedDir = new File(attachmentsSavedPath); + if (!attachmentsSavedDir.exists()) { + log.info("Mail attachments saved directory does not exist. Create a new one: [{}]", attachmentsSavedDir.getAbsolutePath()); + attachmentsSavedDir.mkdirs(); + } + } } else { log.warn("Mail configuration from database table 'sys_config' is empty. Use the configuration from application.yaml instead."); } account.setSslFlag(account.getPassword() != null && !account.getPassword().isEmpty()); - log.info("Mail configuration has been initialized. smtpHost: [{}], smtpPort: [{}], username: [{}]", account.getHost(), account.getPort(), account.getUsername()); - return MailSender.build(account, true); + } + + /** + * 刷新缓存里的邮件配置 + */ + public void refreshCache() { + MailSendAccount account = mailSender.getSenderAccount(); + getFromCache(account); + mailSender.resetSenderAccount(account); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMailLogController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMailLogController.java index 127d5b71..10083209 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMailLogController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMailLogController.java @@ -1,6 +1,5 @@ package com.ruoyi.system.controller; -import com.ruoyi.common.core.mail.MailMessage; import com.ruoyi.common.core.mail.MailSendResult; import com.ruoyi.common.core.utils.poi.ExcelUtil; import com.ruoyi.common.core.web.controller.BaseController; @@ -10,6 +9,7 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.system.domain.SysMailLog; +import com.ruoyi.system.domain.vo.MailVo; import com.ruoyi.system.service.ISysMailLogService; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -61,14 +61,24 @@ public class SysMailLogController extends BaseController { return success(sysMailLogService.selectSysMailLogByMailLogId(mailLogId)); } + /** + * 删除邮件发送日志 + */ + @RequiresPermissions("system:mailLog:remove") + @Log(title = "邮件发送日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{mailLogIds}") + public AjaxResult remove(@PathVariable Long[] mailLogIds) { + return toAjax(sysMailLogService.deleteSysMailLogByMailLogIds(mailLogIds)); + } + /** * 临时邮件发送 */ @RequiresPermissions("system:mailLog:send") @Log(title = "临时邮件发送", businessType = BusinessType.OTHER) @PostMapping("/sendTemporality") - public AjaxResult sendTemporality(@RequestBody MailMessage message) { - MailSendResult result = sysMailLogService.sendTempMail(message); + public AjaxResult sendTemporality(MailVo mailVo) { + MailSendResult result = sysMailLogService.sendSimpleMail(mailVo); if (result.isSuccess()) { return success(); } else { @@ -77,12 +87,11 @@ public class SysMailLogController extends BaseController { } /** - * 删除邮件发送日志 + * 获取邮件发送者信息 */ - @RequiresPermissions("system:mailLog:remove") - @Log(title = "邮件发送日志", businessType = BusinessType.DELETE) - @DeleteMapping("/{mailLogIds}") - public AjaxResult remove(@PathVariable Long[] mailLogIds) { - return toAjax(sysMailLogService.deleteSysMailLogByMailLogIds(mailLogIds)); + @RequiresPermissions("system:mailLog:query") + @GetMapping(value = "/getMailSenderInfo") + public AjaxResult getMailSenderInfo() { + return success(sysMailLogService.getMailSenderInfo()); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMailLog.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMailLog.java index 2617a932..e3db7618 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMailLog.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMailLog.java @@ -1,9 +1,10 @@ package com.ruoyi.system.domain; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.core.annotation.Excel; import com.ruoyi.common.core.web.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import java.io.Serial; @@ -13,10 +14,22 @@ import java.io.Serial; * @author ryas * created on 2024-03-01 */ +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +@Data public class SysMailLog extends BaseEntity { @Serial private static final long serialVersionUID = 1L; + //==================== ↓↓↓↓↓↓ 非表字段 ↓↓↓↓↓↓ ==================== + + /** + * 创建者用户名 + */ + private String createByName; + + //==================== ↓↓↓↓↓↓ 表字段 ↓↓↓↓↓↓ ==================== + /** * 日志主键 */ @@ -70,93 +83,4 @@ public class SysMailLog extends BaseEntity { @Excel(name = "消耗时间(ms)") private Long costTime; - public void setMailLogId(Long mailLogId) { - this.mailLogId = mailLogId; - } - - public Long getMailLogId() { - return mailLogId; - } - - public void setStatus(Long status) { - this.status = status; - } - - public Long getStatus() { - return status; - } - - public void setBusinessType(String businessType) { - this.businessType = businessType; - } - - public String getBusinessType() { - return businessType; - } - - public void setFrom(String from) { - this.from = from; - } - - public String getFrom() { - return from; - } - - public void setTo(String to) { - this.to = to; - } - - public String getTo() { - return to; - } - - public void setCc(String cc) { - this.cc = cc; - } - - public String getCc() { - return cc; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public String getSubject() { - return subject; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public String getMsg() { - return msg; - } - - public void setCostTime(Long costTime) { - this.costTime = costTime; - } - - public Long getCostTime() { - return costTime; - } - - @Override - public String toString() { - return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) - .append("mailLogId", getMailLogId()) - .append("status", getStatus()) - .append("businessType", getBusinessType()) - .append("from", getFrom()) - .append("to", getTo()) - .append("cc", getCc()) - .append("subject", getSubject()) - .append("msg", getMsg()) - .append("createTime", getCreateTime()) - .append("createBy", getCreateBy()) - .append("costTime", getCostTime()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MailVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MailVo.java new file mode 100644 index 00000000..67f051a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MailVo.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.domain.vo; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Alan Scipio + * created on 2024/3/4 + */ +@Data +public class MailVo { + + /** + * 业务类型 + */ + private String businessType; + + /** + * 发送人 + */ + private String from; + + /** + * 接收人 + */ + private String to; + + /** + * 抄送人 + */ + private String cc; + + /** + * 邮件主题 + */ + private String subject; + + /** + * 邮件内容 + */ + private String content; + + /** + * 附件 + */ + private MultipartFile[] attachments; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMailLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMailLogService.java index 74bc684b..c04cfad4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMailLogService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMailLogService.java @@ -1,8 +1,9 @@ package com.ruoyi.system.service; -import com.ruoyi.common.core.mail.MailMessage; +import com.ruoyi.common.core.mail.MailSendAccount; import com.ruoyi.common.core.mail.MailSendResult; import com.ruoyi.system.domain.SysMailLog; +import com.ruoyi.system.domain.vo.MailVo; import java.util.List; @@ -62,10 +63,15 @@ public interface ISysMailLogService { int deleteSysMailLogByMailLogId(Long mailLogId); /** - * 发送临时邮件 + * 发送邮件 - 简易版 * - * @param message 邮件内容 + * @param mailVo 邮件内容 * @return 结果 */ - MailSendResult sendTempMail(MailMessage message); + MailSendResult sendSimpleMail(MailVo mailVo); + + /** + * 获取邮件发送账户信息 + */ + MailSendAccount getMailSenderInfo(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index 718b277a..692a5f11 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -6,6 +6,7 @@ import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.system.config.MailConfig; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.service.ISysConfigService; @@ -29,6 +30,9 @@ public class SysConfigServiceImpl implements ISysConfigService { @Resource private RedisService redisService; + @Resource + private MailConfig mailConfig; + /** * 项目启动时,初始化参数到缓存 */ @@ -167,6 +171,7 @@ public class SysConfigServiceImpl implements ISysConfigService { public void resetConfigCache() { clearConfigCache(); loadingConfigCache(); + mailConfig.refreshCache(); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMailLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMailLogServiceImpl.java index 3c767a95..5b9f6717 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMailLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMailLogServiceImpl.java @@ -1,17 +1,29 @@ package com.ruoyi.system.service.impl; import com.ruoyi.common.core.mail.MailMessage; +import com.ruoyi.common.core.mail.MailSendAccount; import com.ruoyi.common.core.mail.MailSendResult; import com.ruoyi.common.core.mail.MailSender; import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.uuid.snowflake.SnowFlakeIdGenerator; +import com.ruoyi.system.config.MailConfig; import com.ruoyi.system.domain.SysMailLog; +import com.ruoyi.system.domain.vo.MailVo; import com.ruoyi.system.mapper.SysMailLogMapper; import com.ruoyi.system.service.ISysMailLogService; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.mail.MailSendException; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * 邮件发送日志Service业务层处理 @@ -19,6 +31,7 @@ import java.util.List; * @author ryas * created on 2024-03-01 */ +@Slf4j @Service public class SysMailLogServiceImpl implements ISysMailLogService { @@ -28,6 +41,9 @@ public class SysMailLogServiceImpl implements ISysMailLogService { @Resource private MailSender mailSender; + @Resource + private MailConfig mailConfig; + /** * 查询邮件发送日志 * @@ -62,6 +78,9 @@ public class SysMailLogServiceImpl implements ISysMailLogService { if (sysMailLog.getMailLogId() == null) { sysMailLog.setMailLogId(SnowFlakeIdGenerator.nextIdLong()); } + if (StringUtils.isNotBlank(sysMailLog.getMsg()) && sysMailLog.getMsg().length() > 500) { + sysMailLog.setMsg(sysMailLog.getMsg().substring(0, 500)); + } return sysMailLogMapper.insertSysMailLog(sysMailLog); } @@ -73,6 +92,9 @@ public class SysMailLogServiceImpl implements ISysMailLogService { */ @Override public int updateSysMailLog(SysMailLog sysMailLog) { + if (StringUtils.isNotBlank(sysMailLog.getMsg()) && sysMailLog.getMsg().length() > 500) { + sysMailLog.setMsg(sysMailLog.getMsg().substring(0, 500)); + } return sysMailLogMapper.updateSysMailLog(sysMailLog); } @@ -99,14 +121,146 @@ public class SysMailLogServiceImpl implements ISysMailLogService { } /** - * 发送临时邮件 + * 发送邮件 - 简易版 * - * @param message 邮件内容 + * @param mailVo 邮件内容 * @return 结果 */ @Override - public MailSendResult sendTempMail(MailMessage message) { - //TODO 待完成 - return null; + public MailSendResult sendSimpleMail(MailVo mailVo) { + // 参数校验 + if (StringUtils.isBlank(mailVo.getTo())) { + return MailSendResult.failure("收件人不能为空"); + } + if (StringUtils.isBlank(mailVo.getSubject())) { + return MailSendResult.failure("邮件主题不能为空"); + } + long startTime = System.currentTimeMillis(); + // 保存附件 + List attachments; + try { + attachments = saveAttachments(mailVo.getAttachments()); + } catch (Exception e) { + log.error("Failed to save mail attachments", e); + return MailSendResult.failure("Failed to save attachments! " + e); + } + // 发送邮件 + MailMessage mailMessage = new MailMessage() + .setFrom(mailVo.getFrom()) + .setTo(mailVo.getTo()) + .setCc(mailVo.getCc()) + .setSubject(mailVo.getSubject()) + .setContent(mailVo.getContent()) + .addAttachments(attachments); + MailSendResult result = mailSender.sendMail(mailMessage); + handleMailSendError(result); + // 记录邮件发送日志 + addMailLog(mailVo, result, startTime); + return result; + } + + /** + * 记录邮件发送日志 + * + * @param mailVo 邮件内容 + * @param result 发送结果 + * @param startTime 发送开始时间 + */ + private void addMailLog(MailVo mailVo, MailSendResult result, Long startTime) { + SysMailLog mailLog = new SysMailLog(); + mailLog.setBusinessType(mailVo.getBusinessType()); + mailLog.setFrom(mailVo.getFrom()); + mailLog.setTo(mailVo.getTo()); + mailLog.setCc(mailVo.getCc()); + mailLog.setSubject(mailVo.getSubject()); + mailLog.setCostTime(System.currentTimeMillis() - startTime); + if (result.isSuccess()) { + mailLog.setStatus(1L); + mailLog.setMsg("Send successfully"); + } else { + mailLog.setStatus(2L); + mailLog.setMsg(result.getErrMsg()); + } + int affectedRows = insertSysMailLog(mailLog); + if (affectedRows == 0) { + log.error("Failed to record mail log: {}", mailLog); + } else { + log.info("Mail send successfully, mailLogId: {}", mailLog.getMailLogId()); + } + } + + /** + * 保存附件 + *

+ * 路径:配置的根路径+年份+月份+文件名,同名文件会覆盖 + */ + @SuppressWarnings("ResultOfMethodCallIgnored") + private List saveAttachments(MultipartFile[] attachments) throws IOException { + List files = new ArrayList<>(); + if (attachments != null) { + File rootDir = mailConfig.getAttachmentsSavedDir(); + LocalDate nowDate = LocalDate.now(); + File savedDir = new File(rootDir, nowDate.getYear() + File.separator + nowDate.getMonthValue()); + for (MultipartFile attachment : attachments) { + try { + File file = new File(savedDir, Objects.requireNonNull(attachment.getOriginalFilename())); + if (!savedDir.exists()) { + savedDir.mkdirs(); + } + if (file.exists()) { + // 删除已存在的同名附件 + log.warn("Mail attachment file already exists, delete it: [{}]", file.getAbsolutePath()); + file.delete(); + } + attachment.transferTo(file); + log.info("Mail attachment saved to server locally: [{}]", file.getAbsolutePath()); + files.add(file); + } catch (IOException e) { + // 删除已保存的附件 + for (File f : files) { + f.delete(); + } + throw e; + } + } + } + return files; + } + + /** + * 进一步处理邮件发送异常 + */ + private void handleMailSendError(MailSendResult result) { + Throwable e = result.getErrObj(); + if (e == null) { + return; + } + log.error("Failed to send mail", e); + String msg = e.getMessage(); + if (e instanceof MailSendException) { + if (msg != null && msg.toLowerCase().startsWith("mail server connection failed")) { + result.setErrMsg("邮件服务器连接失败! 请检查邮件服务器地址和端口是否正确"); + } else if (msg != null && msg.toLowerCase().startsWith("mail server authentication failed")) { + result.setErrMsg("邮件服务器认证失败! 请检查配置的用户名和密码是否正确"); + } else { + result.setErrMsg("邮件发送失败: " + msg); + } + } else { + result.setErrMsg("邮件发送失败,未知异常: " + msg); + } + } + + /** + * 获取邮件发送账户信息 + */ + @Override + public MailSendAccount getMailSenderInfo() { + MailSendAccount result = new MailSendAccount(); + MailSendAccount senderAccount = mailSender.getSenderAccount(); + result.setHost(senderAccount.getHost()); + result.setPort(senderAccount.getPort()); + result.setUsername(senderAccount.getUsername()); + result.setSslFlag(senderAccount.isSslFlag()); + return result; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/com/ruoyi/system/mapper/SysMailLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/com/ruoyi/system/mapper/SysMailLogMapper.xml index 7a1fd426..dbe2a741 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/com/ruoyi/system/mapper/SysMailLogMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/com/ruoyi/system/mapper/SysMailLogMapper.xml @@ -15,6 +15,7 @@ + @@ -36,13 +37,28 @@ diff --git a/ruoyi-ui/src/api/system/mailLog.js b/ruoyi-ui/src/api/system/mailLog.js index ef2ae6ba..eb8c5d69 100644 --- a/ruoyi-ui/src/api/system/mailLog.js +++ b/ruoyi-ui/src/api/system/mailLog.js @@ -1,35 +1,38 @@ -import request from '@/utils/request' +import request, { upload } from '@/utils/request' // 查询邮件发送日志列表 export function listMailLog(query) { - return request({ - url: '/system/mailLog/list', - method: 'get', - params: query - }) + return request({ + url: '/system/mailLog/list', + method: 'get', + params: query + }) } // 查询邮件发送日志详细 export function getMailLog(mailLogId) { - return request({ - url: '/system/mailLog/' + mailLogId, - method: 'get' - }) -} - -// TODO 临时邮件发送 -export function sendTemporality(data) { - return request({ - url: '/system/mailLog/sendTemporality', - method: 'post', - data: data - }) + return request({ + url: '/system/mailLog/' + mailLogId, + method: 'get' + }) } // 删除邮件发送日志 export function delMailLog(mailLogId) { - return request({ - url: '/system/mailLog/' + mailLogId, - method: 'delete' - }) + return request({ + url: '/system/mailLog/' + mailLogId, + method: 'delete' + }) +} + +export function getMailSenderInfo() { + return request({ + url: '/system/mailLog/getMailSenderInfo', + method: 'get' + }) +} + +// 临时邮件发送 +export function sendTemporality(data, files) { + return upload('/system/mailLog/sendTemporality', files, data) } diff --git a/ruoyi-ui/src/components/FpFileUpload/index.vue b/ruoyi-ui/src/components/FpFileUpload/index.vue index 8afc10ad..8df9d8fe 100644 --- a/ruoyi-ui/src/components/FpFileUpload/index.vue +++ b/ruoyi-ui/src/components/FpFileUpload/index.vue @@ -53,11 +53,6 @@ const {proxy} = getCurrentInstance(); const emit = defineEmits(); const props = defineProps({ - // 文件数量限制 - limit: { - type: Number, - default: 5, - }, // 单个文件大小限制 fileSize: { type: String, @@ -102,16 +97,6 @@ const props = defineProps({ }, }); -defineExpose({ - pond, - getFiles, - getFile, - addFile, - addFiles, - removeFile, - removeFiles, -}); - // 初始化 function handleInit() { // console.info('pond.value', pond.value) @@ -157,6 +142,15 @@ function removeFiles() { pond.value.removeFiles(); } +defineExpose({ + getFiles, + getFile, + addFile, + addFiles, + removeFile, + removeFiles, +}); + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-ui/src/views/wms/InvTransHis/index.vue b/ruoyi-ui/src/views/wms/InvTransHis/index.vue index 0c8b3d02..ed0f2b20 100644 --- a/ruoyi-ui/src/views/wms/InvTransHis/index.vue +++ b/ruoyi-ui/src/views/wms/InvTransHis/index.vue @@ -108,7 +108,6 @@