邮件发送的群发逻辑

版权声明:本文版权归个人所有 https://blog.csdn.net/qq_42469726/article/details/82901355

在实际项目中,如果发送邮件,是不可能从数据库中查出一条然后发一条的,因为数据量太庞大了,系统会崩溃,惯用的逻辑就是想把需要发送的全部消息全部查询出来,放到一个list中,这个属于一条,比如说我需要给用户发送一个邮件,但是这个邮件的内容可能涉及到多个模块的数据,所以我们这个时候可以把那些内容都写死(相当于做一个模板,然后在里面填充数据就可以),模块之间谁调用谁的,最后用list把本次邮件全给弄起来,然后用一个map存起来,map的id可以是邮箱号,value为这些拼装好的数据,把这些封装成一个类,谁需要调用谁用,岂不美哉?调用邮件接口只需要三个参数(一个是邮箱号,一个是邮件内容,一个是链接数据库的密钥(该密钥在一个项目中是固定的,可以用枚举在配置文件中做成一个常量,直接引用就可以))然后发送就ok了,

还有一点就是写完代码如何在不上线的情况下测试,考虑到邮箱发送都是定时发送的,所以需要在原来代码上的定时器上做手脚,定时任务一般卸载service中,这个时候只需要把原来的定时任务取消掉 然后加上一个@Scheduled(fixedRate = 5000),意思是每五秒执行一次,然后debug运行整个项目(注意:这里不能在里面加上main方法,因为这个定时任务可能需要用到其他接口的数据,而main方法只是从当前的方法的头部开始执行,如果这个方法不是最开始的方法,那么就会报空指针错误,亲自踩过的坑),打断点看参数就可以了。

/**

 *@Description:邮件群发逻辑

 *@Author: wuyongfei

 *@Date: 2018/9/07 12:05

 */

@Slf4j

@Component

public class MailTask {

 

    

    @Autowired

private AutoMailService autoMailService;

 

    @Value("${mail.receiver}")

    private String receiver;

 

    @Value("${spring.profiles.active}")

    private String Envir;

 

    @Scheduled(cron = "0 30 08 ? * MON-SAT")

    public void autoMailTask() {

        if (!("prod").equals(Envir)){

            return;

        }

        log.info("autoMailTask!!!");

        //构造一个方法类

        MailEntity mailEntity = new MailEntity();

        mailEntity.setMailType(MailTypeEnum.EVERYDAY_EIGHT.name());

        mailEntity.setSubject("每日数据");

        mailEntity.setContent("每日数据");

        List<String> receiverList = Arrays.asList(receiver.split(","));

        mailEntity.setReceivers(receiverList);

 

        AttachmentEntity entity6 = new AttachmentEntity();

        entity6.setSql(AutoMailSql.EveryDayProfit.replaceAll("\\n", " "));

        entity6.setFileName("逐日盈亏");

        entity6.setTemplate("jdbcTemplate");

 

        AttachmentEntity entity1 = new AttachmentEntity();

        entity1.setSql(AutoMailSql.OrderSql);

        entity1.setFileName("平台客户订单");

        entity1.setTemplate("jdbcTemplate");

 

        AttachmentEntity entity2 = new AttachmentEntity();

        entity2.setSql(AutoMailSql.MarginSql);

        entity2.setFileName("保证金");

        entity2.setTemplate("jdbcTemplate");

 

        AttachmentEntity entity3 = new AttachmentEntity();

        entity3.setSql(AutoMailSql.RechargeSql);

        entity3.setFileName("客户充值");

        entity3.setTemplate("jdbcTemplate");

 

        AttachmentEntity entity4 = new AttachmentEntity();

        entity4.setSql(AutoMailSql.PingCang);

        entity4.setFileName("客户平仓");

        entity4.setTemplate("jdbcTemplate");

 

        AttachmentEntity entity5 = new AttachmentEntity();

        entity5.setSql(AutoMailSql.WithDraw);

        entity5.setFileName("客户提现");

        entity5.setTemplate("jdbcTemplate");

        //放入List<AttachmentEntity>中

        List<AttachmentEntity> attachmentEntityList = new ArrayList<>();

        attachmentEntityList.add(entity6);

        attachmentEntityList.add(entity1);

        attachmentEntityList.add(entity2);

        attachmentEntityList.add(entity3);

        attachmentEntityList.add(entity4);

        attachmentEntityList.add(entity5);

        //把List<AttachmentEntity>放入目标类中//这个目标类中有需要的邮箱号和邮件内容

        mailEntity.setAttach(attachmentEntityList);//获得数据库连接的参数

 

        autoMailService.send(mailEntity, MessageTypeEnum.MIME_MESSAGE);//调用接口进行发送

    }

猜你喜欢

转载自blog.csdn.net/qq_42469726/article/details/82901355