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


一、简介

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层

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

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
定时自动发送邮件服务使用说明 该软件运行环境需要.Net 3.5支持,Win7系统上可以直接运行. 主要功能可以定时自动发送邮件,发送程序做成服务形式,用户无需登录, 只要电脑是开启状态,就会自动执行发送邮件. 包含的文件, 1.AutoSendMail.exe --设置程序 2.AutoSendMail_Log.txt --存放日志的文本文件. 可自动生成 3.AutoSendMail_Setting.xml --配置文件 4.AutoSendMailService.exe --服务程序 5.InstallUtil.exe --微软的安装服务必须程序 6.tasks.mdb --Access数据库文件,用于存放邮箱内容. 可更改文件 7.安装服务.bat 8.使用说明.txt 9.卸载服务.bat 安装步骤: 第一步:安装服务 运行“安装服务.bat”文件。(需要管理员权限) 第二步:修改配置文件 修改好配置文件AutoSendMail_Setting.xml。确保Access数据库连接正确,每个任务的发送时点,和邮件信息。 每次修改配置文件必需重新启动服务才生效。 第三步:启动服务 a.从服务管理控制台启动服务,运行services.msc命令打开控制台。 b.通过设置程序启动服务。(需要管理员权限) 如果删除服务,则运行“卸载服务.bat”。 接口定义: 每个任务需要在指定的Access数据库里设置一个视图或表,用于存放邮件信息, 字段格式: 第一字段:ID 自动编号 第二字段:收件人 文本类型 第三字段:抄送人 文本类型 第四字段:主题 文本类型 第五字段:内容 备注类型 第六字段:发送次数 数字类型 备注:程序通过ID查找记录,来更新发送次数的值。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ha_lydms

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值