根据生日定时发送生日祝福邮件
需求
根据不同的生日日期,在生日当天发送一个祝福邮件,这是需要做到两个事情
- 定时,根据生日定时到每年的那一天
- 发送邮件
定时发送
要想做到定时发送,这时就需要一个定时任务调度的工具,这里使用的是Quartz
Quartz是一个定时任务调度框架,主要包含三个部分,Schedule(调度器)、
JobDetail(任务)CronTrigger(触发器)
- Scheduler
调度器主要是调度调度规则,在规则下启动任务
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
- CronTrigger
触发器中可以设置任务的触发规则
主要属性:
startNow():设置起始时间为即时启动
**withSchedule:**设置任务的执行规律和执行次数
withIntervalInSecos() :每隔多长时间执行,时间单位是秒
repeatForever():持续循环执行,直到结束
endAt: 触发器的结束时间
因为使用的是CronTrigger,所以时间表达式按照cron的规则
依次为(秒 分 时 日 月 星期 (年(可选)))
特殊符号:
**,**并列
- 区间,范围
/ 间隔,从起始点间隔多长时间
***** 任意值
**?**不确定值SimpleTrigger trigger = TriggerBuilder.newTrigger()trigger.startNow();trigger.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1) //每秒执行一次.repeatForever());trigger.endAt(new Date(120,8,3,12,45,0))
- JobDetial
创建新任务要实现Job接口,重写execute方法
public class Myjob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// System.out.println("执行方法");}
}
最后要将任务和触发器交给调度器调度
Trigger trigger = triggerBuilder.build();//将任务交给触发器JobDetail job =JobBuilder.newJob(Myjob.class).build();//将触发器交给调度器scheduler.scheduleJob(job,trigger);//启动调度器scheduler.start();
配置式
调度器:ScheduleFacrotyBean
任务:JobDetailFactoryBean
触发器:CronTriggerFactoryBean
<!--配置任务--><bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="name" value="myjob"/><property name="group" value="mygroup"/><property name="jobClass" value="quartz.MyJob3"/></bean><!--配置调度规则--><bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail"/><property name="cronExpression" value="* * * * * ?"/></bean><!--配置调度器--><bean name="" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger"></ref></list></property></bean>
注解式
要使用注解,首先要扫描目标文件,获取注解解析器
<context:component-scan base-package="quartz"/><task:annotation-driven/>
使用@Schedule注解
发送邮件
导入相关的jar包:
想要发送邮件,首先要有一个邮件平台 比如腾讯、新浪,并且要开启邮箱的授权码,获得授权码之后才能进行自动转发
public static void sendMessage() throws MessagingException {//设置邮箱服务器类型String host = "smtp.qq.com";//设置第三方登录使用验证码String auth = "xxxxxxxxx";//设置发件人Stirng form="xxxxx@qq.com";//设置收件人String to="xxxxxx@qq.com";//获取本地系统参数Properties properties=System.getProperties();//设置邮件服务器地址properties.setProperty("mail.smtp.host",host);//告诉邮件客户端,本次请求是需要认证的properties.put("mail.smtp.auth", "true");//获取邮件服务器连接Session session=Session.getDefaultInstance(properties, new Authenticator() {@Overridepublic PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from,auth);}});//组装邮件内容MimeMessage message = new MimeMessage(session);//发送人message.setFrom(new InternetAddress(from));//接收人message.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress(to));//邮件主题message.setSubject(subject);//邮件内容message.setText(context);//发送邮件Transport.send(message);System.out.println("发送成功");}
实现
分别实现了定时任务调度和自动转发邮件之后,就可以将自动转发当做一个Job,通过CronTrigger的表达式设置生日,进行定时转发
这里采用配置式,方便对任务的分组和批量管理
将自动发送邮件作为任务
public class MyJob3 implements Job{@Autowiredprivate UserDao userDao;@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {Calendar calendar=Calendar.getInstance();int birth_year=calendar.get(Calendar.YEAR);int birth_month=calendar.get(Calendar.MONTH)+1;int birth_day=calendar.get(Calendar.DAY_OF_MONTH);User u=new User();u.setBirth_year(birth_year);u.setBirth_month(birth_month);u.setBirth_day(birth_day);List<User> users = userDao.selectUserByBirthday(u);for (User user : users) {String from ="xxxxxxxx@qq.com";String to=user.getEmail();String subject="生日祝福";String context="今天是您"+(birth_year-user.getBirth_year()+1)+"的生日,祝你生日快乐";try {SendMessage.sendMessage(from,to,subject,context);} catch (MessagingException e) {e.printStackTrace();}}}
}//调用SendMessage方法
public class SendMessage{public static void sendMessage(String from,String to,String subject,String context) throws MessagingException {//设置邮箱服务器类型String host = "smtp.qq.com";//设置第三方登录使用验证码String auth = "xxxxxxxxxxx";//获取本地系统参数Properties properties=System.getProperties();//设置邮件服务器地址properties.setProperty("mail.smtp.host",host);//告诉邮件客户端,本次请求是需要认证的properties.put("mail.smtp.auth", "true");//获取邮件服务器连接Session session=Session.getDefaultInstance(properties, new Authenticator() {@Overridepublic PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from,auth);}});//组装邮件内容MimeMessage message = new MimeMessage(session);//发送人message.setFrom(new InternetAddress(from));//接收人message.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress(to));//邮件主题message.setSubject(subject);//邮件内容message.setText(context);//发送邮件Transport.send(message);System.out.println("发送成功");}}
配置文件
因为生日是从数据库中读取的,使用到了ssm框架进行整合
在spring配置文件中配置定时任务调度
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:task="http://www.springframework.org/schema/task"xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://mybatis.org/schema/mybatis-springhttp://mybatis.org/schema/mybatis-spring.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--配置任务--><bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="name" value="myjob"/><property name="group" value="mygroup"/><property name="jobClass" value="quartz.MyJob3"/></bean><!--配置调度规则--><bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail"/><property name="cronExpression" value="0 0 6 * * ?"/></bean><!--配置调度器--><bean name="" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger"></ref></list></property></bean>
<!-- 配置数据库配置文件--><context:property-placeholder location="classpath:jdbc.properties"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${url}"/><property name="username" value="${jdbc.userName}"/><property name="password" value="${password}"/></bean><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath*:Dao/*.xml"/></bean><mybatis:scan base-package="Dao"/>
</beans>
为了方便对任务调度器的管理,可以根据任务的分组和命名进行管理和批量操作,可以在Controller层,通过页面请求
对Schedule进行操作
停止
Schedule.pauseJob()
scheduler.pauseJob(JobKey.jobKey("jobName","groupName"))
重新开始
Schedule.resumeJob()
scheduler.resumeJon(JobKey.jobKey("jobName","groupName"))
删除
Schedule.deleteJob()
scheduler.deleteJob(JobKey.jobKey("jobName","groupName"))
问题:
在数据库映射数据时,数据库的生日字段使用的是data类型的存储方式,在映射的过程中可能会出现下面的错误
异常:
原因:Druid版本低,造成字段映射失败,主要是德鲁伊不支持该类型的字段映射
解决:
更新德鲁伊的版本,下载对应的映射包
或者将生日字段分开;
在设置日期是可以使用Calendar获取设置时间:
Calendar calendar=Calendar.getInstance();//获取int型的年份int birth_year=calendar.get(Calendar.YEAR);//获取int型的月份(0-11)int birth_month=calendar.get(Calendar.MONTH)+1;//获取对应月份的日(自动区分日期)int birth_day=calendar.get(Calendar.DAY_OF_MONTH);
根据生日定时发送生日祝福邮件相关推荐
- python数据分析天气预报论文_Python定时发送天气预报邮件
用python爬虫爬到的天气预报,使用smtplib和email模块可以发送到邮箱,使用schedule模块可以定时发送.以下是代码- #导入模块 import requests from bs4 i ...
- Python每天定时发送监控邮件
不管是在信贷领域还是支付领域,作为一个风控人员,我们都需要对部署的策略模型进行监控,信贷领域可能还需要对客户的逾期表现进行监控.这时,如果我们能用python自动连接数据库,对策略.模型.贷后表现等数 ...
- 企业员工生日批量发送祝福邮件的方式
这里写自定义目录标题 如何才能批量自动发送祝福邮件 outlook+vba+excel(流行) 如何才能批量自动发送祝福邮件 这个功能网上一般都是outlook+vba和excel表格的方式,创建自动 ...
- linux定时发送远程邮件,实用技巧:Linux操作系统下定时发送邮件
有时候需要在某个时候通知别人或自己做某件事情,对于一些天天读邮件的人来说,发个邮件最保险.这一点在Linux下用at配合mail很容易做到. at命令可以在某个时间运行某个程序,而mail可以以命令行 ...
- 在 Lotus Notes 中设置邮件定时发送的方法及代理功能介绍
孙 茂伟, 测试工程师, IBM 孙茂伟在北京科技大学获得工学学士.工学硕士学位,现于 IBM CDL ECM FileNet EForms TEAM 从事自动化测试相关工作. 简介: 本文将向广大 ...
- 简化日常工作系列之四 ---- 定时发送带附件的工作汇报邮件
很久没有更新博客了,从6月初开始接手了公司项目组的管理工作(我只是个脚本仔,2333),一直忙于各种开发计划和统筹安排,手里也积攒了一些实践. 简化日常工作其中有一项是给相关工作伙伴或者上级发送每日( ...
- 泛微OA发送内部邮件教程【E9版本】
泛微OA发送内部邮件教程 1.发布泛微邮件的WebService接口 2.使用eclipse根据wsdl生成客户端 3.接口重写问题 4.使用kettle定时发送内部邮件 1.发布泛微邮件的WebSe ...
- java怎么发qq邮件_java代码如何发送QQ邮件
近来想写一个qq之间互相发送邮件的工具.奈何一直报错服务错误: org.apache.commons.mail.EmailException: Sending the email to the fol ...
- 简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)
实现功能主要技术点: Listener(监听器) 使用Java发送邮件(JavaMail的使用) 代码示例 创建web工程,写一个监听器监听ServletContext对象的创建(创建时机:启动服务器 ...
最新文章
- 利用C语言实现顺序表
- 【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源
- 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...
- 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码
- Netty 的 内存池 是如何实现的
- 居民安装光伏系统常会碰壁 怎么样做才能少走弯路?
- mysql查看和修改密码策略
- 装饰器设计模式(模拟咖啡)
- ipad iphone开发_如何通过Chromecast观看iPhone / iPad视频?
- 员工考勤iPhone客户端1.0版简介
- Android——打包篇:Android Studio将代码打包成jar包
- / 和 /* 的区别
- Linux笔记之Docker安装,基于Debian 11(bullseye)
- 网络栈主要结构介绍(socket、sock、sk_buff,etc)
- 公有云历史故障汇总(2017-2021 阿里云/腾讯云/AWS厂商)
- python在煤矿的用途-矿用非金属制品检测前处理方法研究
- 作为一名新晋码农,以下是我个人的工作心得,希望能帮到刚步入编程殿堂和使用vue-cli和ant-design-vue UI组件库的童鞋们
- 中国三维激光扫描仪市场趋势报告、技术动态创新及市场预测
- java 日志存储方案_Java 日志缓存机制的实现
- 绿化版Java11的环境配置与Python调用Java