需求

根据不同的生日日期,在生日当天发送一个祝福邮件,这是需要做到两个事情

  1. 定时,根据生日定时到每年的那一天
  2. 发送邮件

定时发送

要想做到定时发送,这时就需要一个定时任务调度的工具,这里使用的是Quartz
Quartz是一个定时任务调度框架,主要包含三个部分,Schedule(调度器)、
JobDetail(任务)CronTrigger(触发器)

  1. Scheduler
    调度器主要是调度调度规则,在规则下启动任务
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  1. 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))         
  2. 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版本低,造成字段映射失败,主要是德鲁伊不支持该类型的字段映射
解决:

  1. 更新德鲁伊的版本,下载对应的映射包

  2. 或者将生日字段分开;

    在设置日期是可以使用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);

根据生日定时发送生日祝福邮件相关推荐

  1. python数据分析天气预报论文_Python定时发送天气预报邮件

    用python爬虫爬到的天气预报,使用smtplib和email模块可以发送到邮箱,使用schedule模块可以定时发送.以下是代码- #导入模块 import requests from bs4 i ...

  2. Python每天定时发送监控邮件

    不管是在信贷领域还是支付领域,作为一个风控人员,我们都需要对部署的策略模型进行监控,信贷领域可能还需要对客户的逾期表现进行监控.这时,如果我们能用python自动连接数据库,对策略.模型.贷后表现等数 ...

  3. 企业员工生日批量发送祝福邮件的方式

    这里写自定义目录标题 如何才能批量自动发送祝福邮件 outlook+vba+excel(流行) 如何才能批量自动发送祝福邮件 这个功能网上一般都是outlook+vba和excel表格的方式,创建自动 ...

  4. linux定时发送远程邮件,实用技巧:Linux操作系统下定时发送邮件

    有时候需要在某个时候通知别人或自己做某件事情,对于一些天天读邮件的人来说,发个邮件最保险.这一点在Linux下用at配合mail很容易做到. at命令可以在某个时间运行某个程序,而mail可以以命令行 ...

  5. 在 Lotus Notes 中设置邮件定时发送的方法及代理功能介绍

    孙 茂伟, 测试工程师, IBM 孙茂伟在北京科技大学获得工学学士.工学硕士学位,现于 IBM CDL ECM FileNet EForms TEAM 从事自动化测试相关工作. 简介: 本文将向广大 ...

  6. 简化日常工作系列之四 ---- 定时发送带附件的工作汇报邮件

    很久没有更新博客了,从6月初开始接手了公司项目组的管理工作(我只是个脚本仔,2333),一直忙于各种开发计划和统筹安排,手里也积攒了一些实践. 简化日常工作其中有一项是给相关工作伙伴或者上级发送每日( ...

  7. 泛微OA发送内部邮件教程【E9版本】

    泛微OA发送内部邮件教程 1.发布泛微邮件的WebService接口 2.使用eclipse根据wsdl生成客户端 3.接口重写问题 4.使用kettle定时发送内部邮件 1.发布泛微邮件的WebSe ...

  8. java怎么发qq邮件_java代码如何发送QQ邮件

    近来想写一个qq之间互相发送邮件的工具.奈何一直报错服务错误: org.apache.commons.mail.EmailException: Sending the email to the fol ...

  9. 简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)

    实现功能主要技术点: Listener(监听器) 使用Java发送邮件(JavaMail的使用) 代码示例 创建web工程,写一个监听器监听ServletContext对象的创建(创建时机:启动服务器 ...

最新文章

  1. 利用C语言实现顺序表
  2. 【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源
  3. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...
  4. 吴恩达《机器学习》学习笔记八——逻辑回归(多分类)代码
  5. Netty 的 内存池 是如何实现的
  6. 居民安装光伏系统常会碰壁 怎么样做才能少走弯路?
  7. mysql查看和修改密码策略
  8. 装饰器设计模式(模拟咖啡)
  9. ipad iphone开发_如何通过Chromecast观看iPhone / iPad视频?
  10. 员工考勤iPhone客户端1.0版简介
  11. Android——打包篇:Android Studio将代码打包成jar包
  12. / 和 /* 的区别
  13. Linux笔记之Docker安装,基于Debian 11(bullseye)
  14. 网络栈主要结构介绍(socket、sock、sk_buff,etc)
  15. 公有云历史故障汇总(2017-2021 阿里云/腾讯云/AWS厂商)
  16. python在煤矿的用途-矿用非金属制品检测前处理方法研究
  17. 作为一名新晋码农,以下是我个人的工作心得,希望能帮到刚步入编程殿堂和使用vue-cli和ant-design-vue UI组件库的童鞋们
  18. 中国三维激光扫描仪市场趋势报告、技术动态创新及市场预测
  19. java 日志存储方案_Java 日志缓存机制的实现
  20. 绿化版Java11的环境配置与Python调用Java

热门文章

  1. C语言控制台程序添加图标(基于GCC编译器)
  2. kinect使用手册
  3. 从零开始(温故而知新)
  4. VS2013+Ceres编译教程 Win7系统
  5. Libre密聊——致力于私密聊天的用心APP
  6. Win7用户文件夹转移
  7. 软件配置 | ios系统Clion下载、安装、配置环境
  8. Linux主机安全加固方法使用开源软件fail2ban防护主机
  9. MATLAB的学习——基本操作和矩阵操作
  10. 如何将宿主机工作文件夹映射到vmware虚拟机内