定时邮件服务(发送考研词汇)


一、简介

1、主要目的

把所有的考研单词存储到数据库中,每天定时在两个时间点,上午7:30、下午6:30,将属于当天的单词发送到指定的邮箱中。一个月一遍。一年12遍,我想再笨的人也会背下来的。

2、啰嗦的编写之路

其实,这个也是在各种的机缘巧合的情况下,最开始想写一个使用短信进行发送的。由于,大部分的都是需要自定义模板,然后更改其中的数字,才能进行发送的。对我来说这种的不实用;还有另一种,能完全满足我的使用,但是,其内部是由人工审核的短信。这样的话,成本就上升了,而且,它最低的购买量都不是我个人能承受的;当我在某一天看到了这个发送邮件的服务。茅塞顿开,这不是我正需要的吗;

3、当前版本简介

主要是用来定时从数据中查询出当前分类的数据,我在每个分类后面都有指定的天数。并且是按30天的循环进行存的;我会根据指定的分类(properties中导入)和当天的日期(内部代码自己获取),这两个参数进行查询数据库。把查询出来的数据,存到Lsit集合中,再将数据,转为邮件需要的HTML格式,再将从配置文件中获取的邮箱地址,进行遍历,每个都发送一次从获取到的数据,这样就完成了。
我把自己都说懵了。还是上图吧。

在这里插入图片描述

4、运用的技术

主要运用到了两个技术POI操作EXCEL表格、发送邮件;

5、小福利

如果,想要这个定时邮件服务的话,在下方评论区留下你的邮箱,我会定时给你发送这个邮件;

6、项目地址

Github 地址

二、pom依赖

这里只写出了邮件和EXCEL表格的依赖,像一些MySQL数据的连接的依赖和JDBCh这类的都没有标出来

   <!--邮件服务-->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-mail</artifactId>
   </dependency>
   <!--EXCEL表格操作-->
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi</artifactId>
       <version>3.8</version>
   </dependency>

三、properties配置文件

主要有两部分,

1:邮件的账号和密码:;、

2:发送邮件的数据分类,接收地址,发送的时间,是否开启;

支持单个和多个邮箱地址
里面的账号和密码如何获取,可以看我另一篇文章,里面有写到如何配置一个邮箱的账号密码

#邮件服务信息(QQ邮箱)
spring.mail.host= smtp.qq.com
spring.mail.username=2104558668@qq.com
spring.mail.password=rvetdcjnhzbfbigd
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.starttls.enable=true
spring.mail.properties.mail.starttls.required=true

#邮件服务定时任务
#发送的分类
emailCategory=3
sendEmail.host=2104558668@qq.com,2104558668@qq.com
sendEmailTime1=true
interval.sendEmail=0 30 18 * * ?
sendEmailTime2=true
interva2.sendEmail=0 30 7 * * ?

四、定时任务

定时执行的任务,为下面类的入口

import com.lydms.service.WordEmailService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
@EnableScheduling
public class EmailIterval {

    private final static Logger logger = LogManager.getLogger(EmailIterval.class);

    @Autowired
    private WordEmailService emailService;


//    定时时间1
    @Value(value = "${sendEmailTime1}")
    private boolean send1;
//    定时时间2
    @Value(value = "${sendEmailTime2}")
    private boolean send2;
//  邮箱地址
    @Value(value = "${sendEmail.host}")
    private String email;


    /**
     * 定时时间1,发送邮件
     */
    @Scheduled(cron = "${interval.sendEmail}")
    public void intervalSms1() {
        timeLog();
        if (send1) {
            sendEmail(email);
        }else {
            logger.info("此时间点不发送邮件");
        }
    }


    /**
     * 定时时间2,发送邮件
     */
    @Scheduled(cron = "${interva2.sendEmail}")
    public void intervalSms2() {
        timeLog();
        if (send2) {
            sendEmail(email);
        }
        logger.info("此时间点不发送邮件");
    }


    /**
     * 定时发送 邮件
     * @param email    邮箱号
     */
    private void sendEmail(String email) {
//        获取当天的内容的Html格式文件
        String htmlEmailByDay = emailService.getHtmlEmailByDay(null);

        String[] splitEmail = email.split(",");

        for (String onceEmail : splitEmail) {
            emailService.sendHtmlMail(onceEmail,"定时英语学习",htmlEmailByDay);
        }
    }

  
    /**
     * 打印当前时间
     */
    private void timeLog() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String format1 = format.format(date);
        logger.info(format1 + " 发送邮件,邮件地址为:{}", email);
    }
}

五、将获取到的数据拼接为html

import com.lydms.pojo.English;
import com.lydms.service.WordEmailService;
import com.lydms.service.WordSelectService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class WordEmailServiceImpl implements WordEmailService {
tar -zxvf /da/jdk-8u181-linux-x64.tar.gz  -C /usr/local/java

    private final Logger logger = LoggerFactory.getLogger(WordEmailServiceImpl.class);
/usr/local/java/jdk1.8.0_181
    @Autowired
    private WordSelectService wordSelectService;
tar -xvf /da/MySQL-5.5.49-1.linux2.6.x86_64.rpm-bundle.tar -C /usr/local/mysql/

    /**
     * 查询指定分类天数的数据(不传返回当天数据)
     *
     * @param day
     * @return Html类型的当天数据
     */
    @Override
    public String getHtmlEmailByDay(String day) {

//        查询出指定天数的数据
        List<English> en = wordSelectService.selectToday(day);
//        将查询出来的结果拼接为HTML格式
        String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><font color=\"red\">少一些功利主义的追求!多一些不问为什么的坚持!</font><table border=\"1\"><tr><th>英文</th><th>标准注解</th><th>代码中注解</th></tr>";
        String prime = "";
        for (int i = 0; i < en.size(); i++) {
            English selectRsult = en.get(i);
            String center = "<tr><td>Id</td><td>English</td><td>Chinese</td><td>CodeChinese</td></tr>";
            String english = selectRsult.getEnglish();
            String chinese = selectRsult.getChinese();
            if (chinese == null) {
                chinese = "";
            }
            String codeChinese = selectRsult.getCodechinese();
            if (codeChinese == null) {
                codeChinese = "";
            }
            String one = center.replaceFirst("Id", String.valueOf(i+1));
            String two = one.replaceFirst("English", english);
            String three = two.replaceFirst("Chinese", chinese);
            String result = three.replaceFirst("CodeChinese", codeChinese);
            prime = prime + result;
        }
        String end = "</table></body></html>";
//        最后拼接结果
        String html = start + prime + end;

        logger.info("拼接后的Html格式文件内容为:{}", html);
        return html;
    }
}

六、查询出当天的数据

import com.lydms.dao.EnglishDao;
import com.lydms.pojo.English;
import com.lydms.pojo.EnglishQuery;
import com.lydms.pojo.EnglishQuery.Criteria;
import com.lydms.service.WordSelectService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service
public class WordSelectServiceImpl implements WordSelectService {
    private static final Logger logger = LogManager.getLogger(WordSelectServiceImpl.class);

    @Autowired
    private EnglishDao englishDao;

//  	配置文件注入查询的分类
    @Value(value = "${emailCategory}")
    private int emailCategory;


    /**
     * 查询分类2,指定天的数据(未发则发送今天的数据)
     *
     * @param day
     * @return
     */
    @Override
    public List<English> selectToday(String day) {
        logger.info("查询分类{}的日期为:{}", emailCategory, day);
//        获取查询的天数
        if (day == null) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd");
            Date date = new Date();
            day = sdf.format(date);
        }
        int now = Integer.parseInt(day);
//        查询当前数据
        EnglishQuery query = new EnglishQuery();
        Criteria criteria = query.createCriteria();
        criteria.andCategoryEqualTo(emailCategory);
        criteria.andDayEqualTo(now);
        List<English> englishList = englishDao.selectByExample(query);
        logger.info("查询出来的结果为:{}", englishList.toString());
        return englishList;
    }
}

七、发送邮件

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.internet.MimeMessage;

@Service
public class WwordEmailServiceImpl implements WordEmailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender sender;

    @Value("${spring.mail.username}")
    private String formMail;

    
    /**
     * 发送带Html格式邮件
     *
     * @param toMail    email地址
     * @param subject   邮件的名称
     * @param content   html邮件的内容
     */
    public void sendHtmlMail(String toMail, String subject, String content) {
        
//        1、封装发送的信息
        MimeMessage mimeMessage = sender.createMimeMessage();
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setTo(toMail);
            mimeMessageHelper.setFrom(formMail);
            mimeMessageHelper.setText(content, true);
            mimeMessageHelper.setSubject(subject);
            
//            2、发送邮件
            sender.send(mimeMessage);
            logger.info("发送给" + toMail + "html邮件已经发送。 简介:" + subject);
        } catch (Exception e) {
            logger.info("发送给" + toMail + "html send mail error subject:" + subject);
            e.printStackTrace();
        }
    }
}

八、DAO层

因为,我这里用的是逆向工程自动生成的代码,所以就不贴代码了,把我数据库的结构图放到了下面。

在这里插入图片描述
在这里插入图片描述

posted @ 2019-12-28 16:03  ah_lydms  阅读(157)  评论(0编辑  收藏  举报