定时器,定时发邮件JavaMail
一、定时器用法:
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的更多相关文章
- Python简单程序爬取天气信息,定时发邮件给朋友【高薪必学】
前段时间看到了这个博客.https://blog.csdn.net/weixin_45081575/article/details/102886718.他用了request模块,这不巧了么,正好我刚用 ...
- Outlook如何定时发邮件
http://jingyan.baidu.com/article/c843ea0b63e15377931e4a0e.html 更多文章: Outlook定时发送邮件问题-http://blog.sin ...
- SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享
SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...
- 【知识积累】JavaMail实现发邮件功能
一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...
- Java - JavaMail - 利用 JavaMail 发邮件的 小demo
1. 概述 面试的时候, 被问到一些乱七八糟的运维知识 虽然我不是干运维的, 但是最后却告诉我专业知识深度不够, 感觉很难受 又回到了一个烦人的问题 工作没有深度的情况下, 你该如何的提升自己, 并且 ...
- 【Raspberry Pi】定时运行python程序读温湿度传感器数据&发邮件
1.定时执行脚本 http://tech.it168.com/a2011/0707/1214/000001214830_all.shtml /sbin/service crond start //启动 ...
- Python 爬取1688货源重量,自动发邮件到指定邮箱(qq),设置定时运行程序
1 # -*- coding: utf-8 -*- 2 # @Time : 2020/7/6 13:46 3 # @Author : Chunfang 4 # @Email : 3470959534@ ...
- Java实现发邮件功能---网易邮箱
目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...
随机推荐
- Apache简介
1.什么是Apache 注:Apache是目前使用最广泛的Web服务器软件. 2.发展历史 注:客户端mosaic程序是Netscape浏览器的前身,后来演变成mozilla浏览器,即我们使用的Fir ...
- 货币系统 Money Systems
母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,,, 或 ,, 和 100的单位面值组成的. 母牛想知道有 ...
- CF 480 B Long Jumps (map标记)
题目链接:http://codeforces.com/contest/480/problem/B 题目描述: Long Jumps Valery is a PE teacher at a ...
- 数据库为什么使用B+树而不是B树
B树和B+树的区别主要有两点: 在B树中,你可以将键和值存放在内部节点和叶子节点,但在B+树中,内部节点都是键,没有值.叶子节点同时存放键和值 B+树的叶子节点有一条链相连,而B+树的叶子节点各自独立 ...
- postgresql中实现oracle SYS_CONNECT_BY_PATH
oracle: select sys_connect_by_path(t2.ID, '/') as PATH, t1.id from HTD_DEVICETYPE_RELATI ...
- python常用包官网
Pandas http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.reset_index.html?high ...
- vmware14克隆后UUID相同的解决方法
查看网卡 UUID值 [root@localhost network-scripts]# nmcli connection showNAME UUID TYPE DEVICE ens33 cf228d ...
- 【SD系列】SAP 创建销售订单-用外部给号的方法步骤
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 创建销售订单-用外部给号的方 ...
- 实验报告2&&第四周课程总结
实验报告: 写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String类型的.要求该类 ...
- Java实验报告(一)&&第三周学习总结
实验报告(一) 1. 打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 源代码: public class Main { p ...