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

news/2024/7/21 6:47:29 标签: 定时任务, 邮件, 考研, excel

文章目录

    • 一、简介
      • 1、主要目的
      • 2、啰嗦的编写之路
      • 3、当前版本简介
      • 4、运用的技术
      • 5、小福利
      • 6、项目地址
    • 二、pom依赖
    • 三、properties配置文件
    • 四、定时任务
    • 五、将获取到的数据拼接为html
    • 六、查询出当天的数据
    • 七、发送邮件
    • 八、DAO层


一、简介

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层

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

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


http://www.niftyadmin.cn/n/1634907.html

相关文章

shell怎么查询oracle数据库,通过shell脚本查看数据库表空间使用情况

对于数据库中表空间查看&#xff0c;想必大家都有很多的脚本已经在用了&#xff0c;自己也啰嗦一下&#xff0c;分享一个通过shell脚本查看表空间使用情况的例子。脚本如下&#xff1a;sqlplus -s $DB_CONN_STR$SH_DB_SID <set echo off heading on underline on;column in…

oracle scn会重用吗,Oracle 11g 中的SCN多长时间增加一次

默认情况下,SCN多长时间递增一次呢&#xff0c;今天同事突然讨论这个问题&#xff0c;数据库版本如下&#xff1a;SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise E…

oracle undo_retention 设置,关于oracle的undo_retention

最近升级了两个数据库&#xff0c;从10.2.0.5到11.2.0。遇到了一个比较囧的问题&#xff0c;undo_retention的设置在两个版本都一样&#xff0c;表空间大小差不多&#xff0c;10.2.0.5里能闪回的时间可以超过1天&#xff0c;使用率比较高。但是11.2.0.3的使用率很少&#xff0c…

arcengine 读取oracle,在ARCENGINE下40万条数据的快速读取

在ARCENGINE下40万条数据的快速读取仿造ARCMAP下的属性表打开&#xff0c;读取某层40万条数据,要么内存耗尽&#xff0c;要么读取很慢。但在AECMAP下试了一下&#xff0c;速度不慢&#xff0c;不知为何??主要代码&#xff1a;//要素个数int k pFeatureLayer.FeatureClass.Fe…

镜像二叉树 PHP,PHP获取二叉树镜像的方法讲解

这篇文章主要介绍了PHP获取二叉树镜像的方法,涉及php使用队列针对二叉树进行翻转的相关操作技巧,需要的朋友可以参考下本文实例讲述了PHP获取二叉树镜像的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;问题操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像…

EntityFramework之数据库以及表基本创建(一)

前言 之前有学过EF一段时间那时EF才4.0似乎还不太稳定&#xff0c;而现在EF都已7.0版本&#xff0c;同时AspNet Identity都与此大有关联&#xff0c;看来是大势所趋于是开始学习EF&#xff0c;在学EF过程中也遇到一些小问题&#xff0c;特此录下&#xff0c;以备忘&#xff01;…

index.php文件作用,学习猿地-自研 PHP 框架 1.0_index.php 文件说明

index.php说明在服务上&#xff0c;PHP 引擎其实只执行了 index.php 这一个文件&#xff0c;index.php 可以抽象的看做是产品的最终型态&#xff0c;app 下的文件规定如何组装&#xff0c;system 下的文件提供基本的“组装零件”&#xff0c;最后拼装成一个完整的产品&#xff…

php表单的删除,php – 如何在在线表单中删除g-recaptcha-response?

检查循环外的g-recaptcha-response,每次迭代时都不需要检查它.然后检查$_POST变量的键不是g-recaptcha-response,然后再将其添加到消息中.$mailTo "$email_address";$mailSubject "$email_subject";$mailBody "The form values entered by the use…