在实际项目中,如果发送邮件,是不可能从数据库中查出一条然后发一条的,因为数据量太庞大了,系统会崩溃,惯用的逻辑就是想把需要发送的全部消息全部查询出来,放到一个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);//调用接口进行发送 } |