whycxzp
2023-11-01 9a4b149fc625a8284af1101329d60889b7ba9984
邮件发送失败处理
3个文件已修改
5个文件已添加
268 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/MailController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/listener/TaskListener.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/MailQueueMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/MailQueue.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BOMFeedbakService.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/MailQueueService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/MailService.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/task/MailQueueTask.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/MailController.java
@@ -11,8 +11,6 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.mail.MessagingException;
@RestController
@RequestMapping("mail")
@Api(tags = "邮件")
@@ -23,9 +21,8 @@
    @ApiOperation("发送邮件")
    @PostMapping("sendMail")
    public Response sendMail(@RequestBody MailDTO mailDTO) throws MessagingException {
        service.sendMail(mailDTO);
        return new Response().set(1,null,"发送完成");
    public Response sendMail(@RequestBody MailDTO mailDTO){
        return service.sendMail(mailDTO);
    }
}
src/main/java/com/whyc/listener/TaskListener.java
New file
@@ -0,0 +1,34 @@
package com.whyc.listener;
import com.whyc.task.MailQueueTask;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.Timer;
@WebListener
public class TaskListener implements ServletContextListener {
    /**一月执行一次*/
    public static final Long fourSeconds = 4*1000L;
    private Timer timer;
    @Autowired
    private MailQueueTask mailQueueTask;
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        timer = new Timer("Task定时任务",true);
        timer.schedule(mailQueueTask,0,fourSeconds);
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        timer.cancel();
    }
}
src/main/java/com/whyc/mapper/MailQueueMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.MailQueue;
public interface MailQueueMapper extends CustomMapper<MailQueue>{
}
src/main/java/com/whyc/pojo/MailQueue.java
New file
@@ -0,0 +1,73 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
@TableName("tb_mail_queue")
public class MailQueue {
    private Integer id;
    private String mails;
    private String title;
    private String content;
    private Long senderUserId;
    private String senderUserName;
    private Date createTime;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getMails() {
        return mails;
    }
    public void setMails(String mails) {
        this.mails = mails;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public Long getSenderUserId() {
        return senderUserId;
    }
    public void setSenderUserId(Long senderUserId) {
        this.senderUserId = senderUserId;
    }
    public String getSenderUserName() {
        return senderUserName;
    }
    public void setSenderUserName(String senderUserName) {
        this.senderUserName = senderUserName;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}
src/main/java/com/whyc/service/BOMFeedbakService.java
@@ -6,6 +6,7 @@
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.FileDirPath;
import com.whyc.dto.MailDTO;
import com.whyc.dto.Response;
import com.whyc.dto.ZipUtils;
import com.whyc.mapper.BOMFeedbakMapper;
@@ -14,7 +15,6 @@
import com.whyc.pojo.DocUser;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import com.whyc.util.MailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -33,7 +33,7 @@
    @Autowired(required = false)
    private BOMFeedbakMapper mapper;
    @Autowired
    private MailUtil mailUtil;
    private MailService mailService;
    @Resource
    private DocUserMapper userMapper;
@@ -248,9 +248,15 @@
            }
        }
        String subject = "Bom问题反馈-"+senderName;
        String subject = "【Bom问题反馈】-"+senderName;
        String content = feedback.getContent();
        mailUtil.sendMailBatch(senderName,receiverMailList,subject,content);
        MailDTO mailDTO = new MailDTO();
        mailDTO.setTitle(subject);
        mailDTO.setContent(content);
        mailDTO.setMailList(receiverMailList);
        mailService.sendMail(mailDTO);
        //mailUtil.sendMailBatch(senderName,receiverMailList,subject,content);
        return new Response().set(1,true,"反馈完成");
    }
    //根据文件路径下载
@@ -315,9 +321,14 @@
        }
        if(receiverMailList.size()>0) {
            String subject = "Bom问题反馈-" + senderName + ",并由" + appendUsername + "转发给您";
            String subject = "【Bom问题反馈】-" + senderName + ",由" + appendUsername + "转发给您";
            String content = feedback.getContent();
            mailUtil.sendMailBatch(senderName, receiverMailList, subject, content);
            MailDTO mailDTO = new MailDTO();
            mailDTO.setTitle(subject);
            mailDTO.setContent(content);
            mailDTO.setMailList(receiverMailList);
            mailService.sendMail(mailDTO);
            //mailUtil.sendMailBatch(senderName, receiverMailList, subject, content);
        }
        return new Response().setII(1,"追加反馈用户完成");
    }
src/main/java/com/whyc/service/MailQueueService.java
New file
@@ -0,0 +1,28 @@
package com.whyc.service;
import com.whyc.mapper.MailQueueMapper;
import com.whyc.pojo.MailQueue;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class MailQueueService {
    @Resource
    private MailQueueMapper mapper;
    public void add(MailQueue queue) {
        mapper.insert(queue);
    }
    public List<MailQueue> getList() {
        return mapper.selectList(null);
    }
    public void deleteById(Integer id) {
        mapper.deleteById(id);
    }
}
src/main/java/com/whyc/service/MailService.java
@@ -2,6 +2,8 @@
import com.whyc.constant.UserOperation;
import com.whyc.dto.MailDTO;
import com.whyc.dto.Response;
import com.whyc.pojo.MailQueue;
import com.whyc.util.ActionUtil;
import com.whyc.util.MailUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +11,9 @@
import org.springframework.transaction.annotation.Transactional;
import javax.mail.MessagingException;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@Service
@@ -20,23 +25,59 @@
    @Autowired
    private DocLogService logService;
    @Autowired
    private MailQueueService mailQueueService;
    @Transactional
    public void sendMail(MailDTO mailDTO) throws MessagingException {
    public Response sendMail(MailDTO mailDTO) {
        Long uId = ActionUtil.getUser().getId();
        String name=ActionUtil.getUser().getName();
        mailUtil.sendMailBatch(name,mailDTO.getMailList(),mailDTO.getTitle(),mailDTO.getContent());
        //日志
        StringBuilder mailUserStr = new StringBuilder();
        List<String> mailList = mailDTO.getMailList();
        for (int i = 0; i < mailList.size(); i++) {
            if(i==0){
                mailUserStr.append(mailList.get(i));
            }else{
                mailUserStr.append(","+mailList.get(i));
            }
        }
        try {
            mailUtil.sendMailBatch(name,mailDTO.getMailList(),mailDTO.getTitle(),mailDTO.getContent());
        String msgDetail = "发送给邮箱"+mailUserStr+",标题为:"+mailDTO.getTitle()+",内容为:"+mailDTO.getContent();
        logService.record(uId,name, UserOperation.TYPE_SEND_MAIL.getType(),"邮件发送",msgDetail);
            //日志
            List<String> mailList = mailDTO.getMailList();
            for (int i = 0; i < mailList.size(); i++) {
                if(i==0){
                    mailUserStr.append(mailList.get(i));
                }else{
                    mailUserStr.append(","+mailList.get(i));
                }
            }
            String msgDetail = "发送给邮箱" + mailUserStr + ",标题为:" + mailDTO.getTitle() + ",内容为:" + mailDTO.getContent();
            logService.record(uId, name, UserOperation.TYPE_SEND_MAIL.getType(), "邮件发送", msgDetail);
            return new Response().set(1,true,"发送完成");
        } catch (MessagingException ex) { //邮件发送异常,存入数据库待重新发送列表
            MailQueue queue = new MailQueue();
            queue.setMails(mailUserStr.toString());
            queue.setTitle(mailDTO.getTitle());
            queue.setContent(mailDTO.getContent());
            queue.setCreateTime(new Date());
            queue.setSenderUserId(uId);
            queue.setSenderUserName(name);
            mailQueueService.add(queue);
            return new Response().set(1,false,"发送失败,网络异常,网络恢复后自动延时发送");
        }
    }
    public void sendQueueMail(MailQueue queue) {
        Long uId = queue.getSenderUserId();
        String name = queue.getSenderUserName();
        String mails = queue.getMails();
        String[] mailSplits = mails.split(",");
        List<String> mailList = new LinkedList<>(Arrays.asList(mailSplits));
        try{
            mailUtil.sendMailBatch(name,mailList,queue.getTitle(),queue.getContent());
            //删除 数据库邮件队列表中 已被发送的邮件记录
            mailQueueService.deleteById(queue.getId());
            //日志
            String msgDetail = "发送给邮箱" + mails + ",标题为:" + queue.getTitle() + ",内容为:" + queue.getContent();
            logService.record(uId, name, UserOperation.TYPE_SEND_MAIL.getType(), "邮件发送", msgDetail);
        } catch (MessagingException ex) { //邮件发送异常
            //System.out.println("邮件发送异常,后续会持续发送直到成功");
        }
    }
}
src/main/java/com/whyc/task/MailQueueTask.java
New file
@@ -0,0 +1,30 @@
package com.whyc.task;
import com.whyc.pojo.MailQueue;
import com.whyc.service.MailQueueService;
import com.whyc.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.TimerTask;
@Component
public class MailQueueTask extends TimerTask {
    @Autowired
    private MailQueueService mailQueueService;
    @Autowired
    private MailService mailService;
    @Override
    public void run() {
        //查询邮件队列中的待发送列表
        List<MailQueue> sendingList = mailQueueService.getList();
        //发送邮件
        for (MailQueue queue : sendingList) {
            mailService.sendQueueMail(queue);
        }
    }
}