一、定时器用法:

1.1先导入jar包

 <!--spring整合其他文件时要用的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!--定时任务-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>

1.2然后创建spring和quartz的整合配置文件  applicationContext-quartz.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--1.Job作业-->
<bean id="app01" class="com.ujy.jobs.JobApp01"></bean>
<!--JobDetail-->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="app01"/>
<property name="targetMethod" value="printSomething"/>
</bean>
<!-- 3.配置Trigger触发器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="jobDetail" />
<!-- 10 seconds -->
<property name="startDelay" value="10000" />
<!-- repeat every 50 seconds -->
<property name="repeatInterval" value="5000" />
</bean>
<!-- 4.石英触发器:-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!-- run every morning at 6 AM -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean> <!-- 4.配置scheduler 容器-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- <ref bean="simpleTrigger" />-->
<ref bean="cronTrigger"/>
</list>
</property>
</bean> </beans>

1.3创建一个包,包中创建一个类,类中创建一个方法。就是用来执行的方法。

public class JobApp01 {
public void printSomething(){
System.out.println("您好啊!。。。");
}
}

然后写main方法进行加载 。  因为石英触发器 底层使用的多线程,所以不能使用测试类进行测试。

public class QuartzTest {
//quartz底层是使用了多线程 ,不能使用测试方法。
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-quartz.xml");
// context.getBean(AppTest.class);
}
}

1.4 石英触发器表达式的用法:

cronExpression表达式:
1.基本格式[用空格分开的六位或者七位组成的表达式]
按顺序依次为
①秒(0~59)
②分钟(0~59)
③小时(0~23)
④天(月)(0~30,但是你需要考虑你月的天数)
⑤月【day of month】(0~11)
⑥天(星期)【day of week】(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
⑦年份(1970-2099)
设置方式:
①、指定具体值:5
②、连续区间:9-12
③、有间隔的区间:8-18/4
斜杠后面为间隔跨度
④、具体值的列表

通配符:
[1]*:表示在取值范围内的所有时间点都执行调度任务
例如:用*指定秒,表示每秒都执行任务;用*指定星期表示一周内的每一天都执行任务
[2]/:用于表示时间间隔
例如:用*/5指定秒,表示每隔5秒执行一次任务。
[3]?:仅用于day-of-month字段或day-of-week字段,表示不指定值。由于某个月的几号和星期几很难统一
成同一天。所以为了避免冲突,这两个字段必须有一个字段设置为?

每一天 9点24分 23,26,27分别执行该定时任务

示例:
表达式 说明
=========================================================================
秒 分 时 日 月 星期 年

0 19 9 * * ? 每天9点19分触发
0 15 10 ? * * 每天上午10:15触发
0 15 10 * * ? 每天上午10:15触发
0 15 10 * * ? * 每天上午10:15触发
0 15 10 * * ? 2005 2005年每天上午10:15触发

二、发送email的技术:JavaMail

2.1导入jar包:

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>

2.2 配置spring发送Email的配置文件

<!-- 1.发送Email 的类对象-->
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- 配置邮箱账号 -->
<property name="username" value="15294818079@163.com"/>
<!-- 这个不是邮箱密码,而是配置 授权码-->
<property name="password" value="123abc"></property>
<!-- 设置编码格式 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 配置smtp服务器-->
<property name="host" value="smtp.163.com"></property> <!-- 邮箱服务器属性设置 -->
<property name="javaMailProperties">
<props>
<!-- 邮箱服务器是否支持验证 -->
<prop key="mail.smtp.auth">true</prop>
<!-- 邮箱服务器连接超时时间 毫秒-->
<prop key="mail.smtp.timeout">300000</prop>
</props>
</property>
</bean>

然后在controller层编写

package com.ujy.info.controller;

import com.ujy.emp.pojo.Employee;
import com.ujy.emp.service.ArchiveService;
import com.ujy.info.pojo.Email;
import com.ujy.info.service.EmailService;
import com.ujy.jobs.EmailJob;
import org.apache.commons.io.IOUtils;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileOutputStream; import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID; @Controller
@RequestMapping("/email")
public class EmailController { @Autowired
private JavaMailSenderImpl javaMailSender; @Autowired
private ArchiveService archiveService; @Autowired
private EmailService emailService; @RequestMapping(value = "saveInfo",method = RequestMethod.POST)
public String saveInfo(Email email, MultipartFile file, HttpSession session){
//通过员工的id 拿到档案表里面的邮箱 。 员工表的emp_fk对应着archives表的emp_fk
String emailAddress = archiveService.getEmailByEid(email.getEmpFk());
//下面的这些 就是把上传的文件 保存到本地服务器。
ServletContext servletContext = session.getServletContext();
String realPath = servletContext.getRealPath("/upload");
File directory = new File(realPath); if(!directory.exists()){
directory.mkdirs();
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "")+file.getOriginalFilename();
//将上传的文件保存在本地服务器里面 ,目录 和文件中间应有一个斜杠
try {
//file.transferTo(new File(realPath+"\\"+fileName)); //第一种方式
// System.out.println(realPath+"\\"+fileName);
// 第二种方式将输入流的东西 直接转到输出流中
IOUtils.copy(file.getInputStream(),new FileOutputStream(new File(realPath+"\\"+fileName))); email.setPath(fileName); //这个文件就有路径 ,然后保存到邮件路径里面 --------------------------------------------------------
//下面使用定时发送邮件 发送定时任务四个组件。 //2创建JobDetail对象,指定对象的任务名称、组名 通过newJob把job作业传过来,这样当我们访问这个方法时,会自动调用EmailJob下的execute这个方法。
//withIdentitytity 就是起个名字 ,然后分个组
JobDetail jobDetail = JobBuilder.newJob(EmailJob.class).withIdentity("job1", "group1").build(); JobDataMap jobDataMap = jobDetail.getJobDataMap(); //通过这个方法,把email 传给发送邮件的job作业,进行定时发送。
jobDataMap.put("email",email);
jobDataMap.put("javaMailSender",javaMailSender);
jobDataMap.put("emailAddress",emailAddress);
jobDataMap.put("file",file);
jobDataMap.put("fileAddress",realPath+"/"+fileName);
//获取当前时间
// Long startTime = new Date().getTime()+180000L; //模拟3分钟后发送
Date time = new Date(); //模拟一个当前时间 让它立马发送 //3创建SimpleTrigger对象,指定对象名称、组名 设置任务重复执行间隔时间,重复执行次数 启动时间 通过TriggerBuilder.newTrigger()就可以得到trigger对象。
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(time).build();
//4创建任务管理器Scheduler对象
Scheduler sched= StdSchedulerFactory.getDefaultScheduler();
jobDataMap.put("sched",sched);
//为Scheduler对象新增JOB以及对应的SimpleTrigger
//用schedule把jobDetail 和trigger管理起来
sched.scheduleJob(jobDetail, trigger);
//启动定时任务管理器
sched.start();
//保存到数据库中一份 。
Employee emp = (Employee) session.getAttribute("loginUser");
String ename = emp.getEname();
email.setEname(ename); emailService.saveInfo(email);
} catch (Exception e) {
e.printStackTrace();
}
return "message";
}
}

然后编写 发送邮件  进行发送

public class EmailJob implements Job {

    @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//通过getMergedJobDataMap() 得到controller层传过来的邮件 进行定时发送。 JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
Email email = (Email) mergedJobDataMap.get("email");
JavaMailSenderImpl javaMailSender= (JavaMailSenderImpl)mergedJobDataMap.get("javaMailSender"); MultipartFile file = (MultipartFile) mergedJobDataMap.get("file");
String emailAddress = (String)mergedJobDataMap.get("emailAddress");
String fileAddress = (String) mergedJobDataMap.get("fileAddress");
Scheduler sched = (Scheduler) mergedJobDataMap.get("sched");
try{
//1.得到邮件对象
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
//发送人邮箱,要和容器中 的邮箱保持一致
helper.setFrom("15225283291@163.com");
helper.setTo(emailAddress);
helper.setSubject(email.getTitle());
helper.setText(email.getContent(),true); // is= new InputStreamResource(file.getInputStream()); 以流的方式取出那个邮件
FileSystemResource fileSystemResource = new FileSystemResource(new File(fileAddress));
helper.addAttachment(file.getOriginalFilename(), fileSystemResource);
javaMailSender.send(mimeMessage);
System.out.println("邮件发送成功!");
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {
if (!sched.isShutdown())
sched.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
} } }

定时器,定时发邮件JavaMail的更多相关文章

  1. Python简单程序爬取天气信息,定时发邮件给朋友【高薪必学】

    前段时间看到了这个博客.https://blog.csdn.net/weixin_45081575/article/details/102886718.他用了request模块,这不巧了么,正好我刚用 ...

  2. Outlook如何定时发邮件

    http://jingyan.baidu.com/article/c843ea0b63e15377931e4a0e.html 更多文章: Outlook定时发送邮件问题-http://blog.sin ...

  3. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  4. 【知识积累】JavaMail实现发邮件功能

    一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...

  5. Java - JavaMail - 利用 JavaMail 发邮件的 小demo

    1. 概述 面试的时候, 被问到一些乱七八糟的运维知识 虽然我不是干运维的, 但是最后却告诉我专业知识深度不够, 感觉很难受 又回到了一个烦人的问题 工作没有深度的情况下, 你该如何的提升自己, 并且 ...

  6. 【Raspberry Pi】定时运行python程序读温湿度传感器数据&发邮件

    1.定时执行脚本 http://tech.it168.com/a2011/0707/1214/000001214830_all.shtml /sbin/service crond start //启动 ...

  7. Python 爬取1688货源重量,自动发邮件到指定邮箱(qq),设置定时运行程序

    1 # -*- coding: utf-8 -*- 2 # @Time : 2020/7/6 13:46 3 # @Author : Chunfang 4 # @Email : 3470959534@ ...

  8. Java实现发邮件功能---网易邮箱

    目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...

  9. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

随机推荐

  1. R list和data frame 排序

    pathway_name = rownames(g1) tm <- list('P-value' = c(), 'Pathway_name' = c()) :dim(g1)[]){ result ...

  2. KNN算法之KD树

    KD树算法是先对数据集进行建模,然后搜索最近邻,最后一步是预测. KD树中的K指的是样本特征的维数. 一.KD树的建立 m个样本n维特征,计算n个特征的方差,取方差最大的第k维特征作为根节点.选择第k ...

  3. Nginx 作为代理服务与负载均衡

    代理服务 代理一代为办理(代理理财.代理收货等等) 代理区别 区别在于代理的对象不一样 正向代理代理的对象是客户端 反向代理代理的对象是服务端 反向代理配置 server { listen 80; s ...

  4. django-rest-swagger 使用【转】

    转自:https://www.cnblogs.com/delav/p/10242017.html Swagger是一个API开发者的工具框架,用于生成.描述.调用和可视化RESTful风格的Web服务 ...

  5. es之Source字段和store字段

    PUT /website/blog/ { "title" : "elasticsearchshi是是什么", "author" : &quo ...

  6. SQLSTATE[HY000] [2002] No such file or directory

    正常的解决办法.. 只需将laravel配置文件中的host 127.0.0.1改成localhost就可以: 'mysql' => array(            'driver'    ...

  7. docker-dnsmasq使用

    docker-dnsmasq支持通过web页面配置域名映射,镜像地址:https://hub.docker.com/r/jpillora/dnsmasq 使用步骤如下: 1.在Docker宿主上创建 ...

  8. [转] python关于ctypes使用char指针与bytes相互转换的问题

    最近研究人脸识别,需要用python调用so动态库,涉及到c/c++中的指针字符串转Python的bytes对象的问题. 按照ctypes的文档,直观方式是先创建对应的类型数组,再将指针取地址一一赋值 ...

  9. fedora如何使用themes主题?

    DBus: 是一个 local 的IPC 进程间通信机制 如果是(一对一) 多对多的通信, 则DBUS 后台充当了一个路由器的角色. ibus: 是包含: python gtk dbus的 scim- ...

  10. 测开之路一百一十三:bootstrap媒体对象

    实现效果,左边是图片或者其他媒体,右边是对应的描述 引入bootstrap和jquery标签 class="media" 数量多一些看着就会很规整 <!DOCTYPE htm ...