Java定时发送邮件
背景
甲方爸爸:新接入业务在国庆以及军运会期间需要每天巡检业务并发送邮件告知具体情况!
我司:没问题。
甲方爸爸:假期也要发噢。
我司:没问题(。。。)。
刚开始计划指定几个同事轮流发送,业务只要不被攻击一般是没有问题的。但是想一想休息日还要处理工作上的事情(非紧急的)就不爽,近几年一直在做前端的事情,后台碰的少,毕竟也接触过,所以决定搞一个定时发送邮件的程序,遂上网查找资料。
邮件类选择
在网上大致上看了下,目前有两种方案:
- MimeMessage
String title = createTitle();
String text = createText();
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from, passwd);
}
});
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(title);
message.setText(text);
System.out.println(text);
Transport.send(message);
} catch(Exception e) {
e.printStackTrace();
}
- SimpleMail
mail.setHostName(host);
mail.setAuthentication(user, passwd);
mail.setFrom(user);
mail.setCharset("UTF-8");
mail.setSubject(title);
mail.setSSLOnConnect(true);
mail.setMsg(content);
mail.addTo(to);
mail.send();
在本地重构代码并进行了测试,都是正常发送和接收,个人觉得SimpleMail看起来更加简洁,所以邮件类就选它了
定时器
网上搜索一大堆,具体就不一一介绍了,我用的是Quartz
Quartz 设计有三个核心类,分别是
- Scheduler 调度器
调度器就相当于一个容器,装载着任务和触发器。该类是一个接口,代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中, 两者在Scheduler中拥有各自的组及名称, 组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail - Job任务
定义需要执行的任务。该类是一个接口,只定义一个方法execute(JobExecutionContext context),在实现类的execute方法中编写所需要定时执行的Job(任务),JobExecutionContext类提供了调度应用的一些信息。Job运行时的信息保存在JobDataMap实例中 - Trigger 触发器
负责设置调度策略。该类是一个接口,描述触发job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的15:00~16:00执行调度等
开发测试
发送者邮箱必须开启客户端POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,具体可以在邮箱设置页进行设置,密码使用授权码
- 创建SendMail类,将发送邮件逻辑代码进行封装
public class SendMail implements Job {
private static String user = "11111111@qq.com";
private static String passwd = "passwd";//授权码
private static String to = "22222@qq.com";
private static String host = "smtp.qq.com";
public static void sendMailForSmtp(String title, String content, String[] tos, String[] ccs) throws EmailException {
SimpleEmail mail = new SimpleEmail();
// 设置邮箱服务器信息
mail.setHostName(host);
// 设置密码验证器passwd为授权码
mail.setAuthentication(user, passwd);
// 设置邮件发送者
mail.setFrom(user);
// 设置邮件编码
mail.setCharset("UTF-8");
// 设置邮件主题
mail.setSubject(title);
//SSL方式
mail.setSSLOnConnect(true);
// 设置邮件内容
// mail.setMsg(content);
// 设置邮件接收者
// mail.addTo(to);
mail.addTo(tos);
mail.addCc(ccs);
// 发送邮件
MimeMultipart multipart = new MimeMultipart();
//邮件正文
BodyPart contentPart = new MimeBodyPart();
try {
contentPart.setContent(content, "text/html;charset=utf-8");
multipart.addBodyPart(contentPart);
//邮件附件
BodyPart attachmentPart = new MimeBodyPart();
File file = new File("C:\\lutong\\20190918002.log");
FileDataSource source = new FileDataSource(file);
attachmentPart.setDataHandler(new DataHandler(source));
attachmentPart.setFileName(MimeUtility.encodeWord(file.getName()));
multipart.addBodyPart(attachmentPart);
mail.setContent(multipart);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
System.out.println(JsonUtil.toJson(mail));
mail.send();
System.out.println("mail send success!");
}
@Override
public void execute(JobExecutionContext var1) throws JobExecutionException {
// TODO Auto-generated method stub
//多个接收者
String[] tos = {"11111@qq.com","2222@qq.com"};
//多个抄送者
String[] ccs = {"33333@qq.com","44444@qq.com"};
try {
SendMail.sendMailForSmtp("title", "hello <br> ccy", tos, ccs);
} catch (EmailException e) {
e.printStackTrace();
}
}
}
- 创建CronTrigger,定时发送任务
public class CronTrigger {
public static void main(String[] args){
//初始化job
JobDetail job = JobBuilder.newJob(SendMail.class)// 创建 jobDetail 实例,绑定 Job 实现类
.withIdentity("ccy", "group1")//指明job名称、所在组名称
.build();
//定义规则
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("ccy", "group1")//triggel名称、组
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))//每隔5s执行
.build();
Scheduler scheduler = null;
try {
scheduler = new StdSchedulerFactory().getScheduler();
System.out.println("start job...");
//把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
//启动
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
测试结果
后记
技术沟通群欢迎加入
如果对笔者感兴趣也欢迎你加我好友一起讨论技术,夸夸白
本人微信gm4118679254
Java定时发送邮件的更多相关文章
- java实现qq邮箱每天定时发送邮件
本周四的时候去学校的某机构值班,主要工作是帮老师送文件,干一些杂活.那天没有什么活儿,于是想起用Java实现发送邮件和接收邮件的功能.前几天接触过一点quartz框架,用来实现定时开始任务的功能.于是 ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- Android 发送邮件以及定时发送邮件的实现
本文以腾讯企业邮箱为例,展示如何发送邮件 及相关问题 选择腾讯企业邮箱是因为腾讯企业邮箱一般都是开启了smtp服务 项目地址:https://gitee.com/bimingcong/MySendE ...
- VBS实现定时发送邮件
原理:建立CDO.Message对象,设置好参数后直接Send就可以了 代码如下: NameSpace = "http://schemas.microsoft.com/cdo/configu ...
- JAVA定时执行任务,每天定时几点钟执行任务
JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: package com.pcitc.time; import j ...
- python (18)在linux中如何实现定时发送邮件
最近要用到,定时发送邮件功能: 如何定时,当然要用到linux中crontab了 如下的代码能够定时发送邮件 #!/usr/bin/env python # -*- coding=utf-8 -*- ...
- odoo定时发送邮件
采购订单延迟或者存在部分到货的情况,定时发送邮件给相关人员 包含,采购订单明细,订单数量,已到货数量,未到货数量 <?xml version="1.0" encoding=& ...
- Java学习笔记 -- Java定时调度工具Timer类
1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...
- Spring Boot 揭秘与实战(七) 实用技术篇 - Java Mail 发送邮件
文章目录 1. Spring Boot 集成 Java Mail 2. 单元测试 3. 源代码 Spring 对 Java Mail 有很好的支持.因此,Spring Boot 也提供了自动配置的支持 ...
随机推荐
- 如何调教你的博客Episode2——移动端支持和UI美化
这个系列的文章是我在搭建博客园博客时所经历的过程. 在上一期如何调教你的博客Episode1——修改整体样式中,我们通过添加CSS样式,修改了页面的总体布局.但将文章发出之后,博客的布局就出现问题了: ...
- Yii 三表关联 角色表、角色权限连接表、权限表
Yii 三表关联 角色表.角色权限连接表.权限表 角色表 role----------------id 唯一序号name 角色名称---------------- 角色权限连接表 lp-------- ...
- 前端表格数据导出excel
使用tableExport.js导出bootstrap-table表格成excel并且支持中文 1. 下载tableExport.js https://github.com/hhurz/tableEx ...
- 盘一盘 NIO (一)—— Buffer源码解析
Buffer是个啥? Buffer 即缓冲区,用来暂存输入输出数据的区域.Buffer对象是一份固定数量的数据的容器,实质上是一个数组.但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问, ...
- Discuz! ML远程代码执行(CVE-2019-13956)
Discuz! ML远程代码执行(CVE-2019-13956) 一.漏洞描述 该漏洞存在discuz ml(多国语言版)中,cookie中的language可控并且没有严格过滤,导致可以远程代码执行 ...
- count(*) count(1) count(column)的区别
count(1)中的1并不是指第一个column: count(*)和count(1)一样,包括对值为NULL的统计: count(column)不包括对值为NULL的统计,这里的column指的不是 ...
- 随笔编号-16 MySQL查看表及索引大小方法
目标:阿里云OS数据库DMS,单个主库最大存储空间为2T.最近公司业务扩展很快,一天数据量达到7.9G左右.要求备份清理历史数据,备份到其他磁盘. 准备: 如果想知道MySQL数据库中每个表占用的空间 ...
- js循环(while循环,do while循环,for循环)相关知识点及练习
08.循环 1.循环! 循环的作用: 简化代码,处理重复执行的代码 遍历数组.json对象.节点集合 2.while循环 语法: while(循环的条件){ 循环体 } 3.循环的五大要素 循环变量 ...
- 设计模式(C#)——08组合模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 游戏通常包含许多视图.主视图中显示角色.有一个子视图,显示玩家的积分.有一个子视图,显示游戏中剩下的时间. ...
- Nginx入门(一):在centos上安装nginx
CenterOS7安装Nginx =================== 参考:https://www.xuliangwei.com/bgx/972.html nginx官网下载地址:http://n ...