定时邮件服务(发送考研词汇)
文章目录
一、简介
1、主要目的
把所有的考研单词存储到数据库中,每天定时在两个时间点,上午7:30、下午6:30,将属于当天的单词发送到指定的邮箱中。一个月一遍。一年12遍,我想再笨的人也会背下来的。
2、啰嗦的编写之路
其实,这个也是在各种的机缘巧合的情况下,最开始想写一个使用短信进行发送的。由于,大部分的都是需要自定义模板,然后更改其中的数字,才能进行发送的。对我来说这种的不实用;还有另一种,能完全满足我的使用,但是,其内部是由人工审核的短信。这样的话,成本就上升了,而且,它最低的购买量都不是我个人能承受的;当我在某一天看到了这个发送邮件的服务。茅塞顿开,这不是我正需要的吗;
3、当前版本简介
主要是用来定时从数据中查询出当前分类的数据,我在每个分类后面都有指定的天数。并且是按30天的循环进行存的;我会根据指定的分类(properties中导入)和当天的日期(内部代码自己获取),这两个参数进行查询数据库。把查询出来的数据,存到Lsit集合中,再将数据,转为邮件需要的HTML格式,再将从配置文件中获取的邮箱地址,进行遍历,每个都发送一次从获取到的数据,这样就完成了。
我把自己都说懵了。还是上图吧。
4、运用的技术
主要运用到了两个技术POI操作EXCEL表格、发送邮件;
5、小福利
如果,想要这个定时邮件服务的话,在下方评论区留下你的邮箱,我会定时给你发送这个邮件;
6、项目地址
二、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层
因为,我这里用的是逆向工程自动生成的代码,所以就不贴代码了,把我数据库的结构图放到了下面。