本周四的时候去学校的某机构值班,主要工作是帮老师送文件,干一些杂活。那天没有什么活儿,于是想起用Java实现发送邮件和接收邮件的功能。前几天接触过一点quartz框架,用来实现定时开始任务的功能。于是,这里把他们结合起来了,实现定时发送邮件,向暗恋的女神表白的用处(yiyin)。

我没有研究过quartz框架,这里主要是从实用的角度讲一下。在使用时,需要编写任务类和触发器类两部分的代码。任务类是你想实现的功能部分,需要实现Job接口。触发器类设置任务的定时执行时间。
在java实现email中,发件箱使用qq邮箱,可能每个人都一个qq邮箱。还有,在这里不得不感叹Java强大的类库,还有众多Java工作者的贡献。
 
 
任务类的代码:
 import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.lang.InterruptedException;
import java.util.Random;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class MailJob implements Job
{
public void execute(JobExecutionContext context)
throws JobExecutionException {
//收件人,标题和文本内容
String to = "#######@126.com";//填写你要发给谁
String title = createTitle();
String text = createText();
//设置属性
Properties props = new Properties();
//QQ邮箱发件的服务器和端口
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "25");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//填写你的qq邮箱用户名和密码
return new PasswordAuthentication("*******@qq.com", "###***%%%");
}
});
MimeMessage message = new MimeMessage(session);
//这里用flag来标记是否发件成功(有时候会连不上服务器),
//如果没有,继续发送,直到发送成功为止。
int flag = 0;
{
try {
      //设置发件人,收件人,主题和文本内容,并发送
message.setFrom(new InternetAddress("*******@qq.com"));//填写你自己的qq邮箱,和上面相同
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(title);
message.setText(text);
System.out.println("Preparing sending mail...");
System.out.println(text);
Transport.send(message);
flag = 1;
System.out.println("message sent successfully");
} catch(Exception e) {
flag = 0;
}
} while(flag == 0);
}
//下面的两个方法,用来随机组合标题和文本内容。文本内容由四部分随机组合。
//产生标题
public String createTitle() {
String[] titles = {"love", "I love you", "Miss you", "My baby"};
Random randT = new Random(System.currentTimeMillis());
String title = titles[randT.nextInt(titles.length)];
return title;
}
//产生文本内容,文本内容由四部分随机组合得到。
public String createText() {
//名字纯属虚构,如有雷同(肯定会有),纯属巧合。
String[] parts1 = {"晓静,你好。", "晓静,你还好吗?", "晓静,你那边天气怎么样?"};
String[] parts2 = {
"距离上次见面,我感觉已经好长时间了。",
"流去的时间磨不去我对你的爱。",
"我仍然记得你在天安门前的那一抹笑容。"
};
String[] parts3 = {"今天,我大胆地追求你。",
"我不怕大胆地对你说,我爱你。",
"此刻,月亮代表我的心。"
};
String[] parts4 = {
"未来,我的心依旧属于你。",
"好想在未来陪你一起慢慢变老,当然在我心中你不会老。"
};
Random randT = new Random(System.currentTimeMillis());
String text = parts1[randT.nextInt(parts1.length)]
+ parts2[randT.nextInt(parts2.length)]
+ parts3[randT.nextInt(parts3.length)]
+ parts4[randT.nextInt(parts4.length)];
return text;
} }

触发器的代码:

 import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Random;
public class CronTriggerExample
{
public static void main( String[] args ) throws Exception
{
//创建工作对象
JobDetail job = JobBuilder.newJob(MailJob.class)
.withIdentity("dummyJobName", "group1").build();
//为了立即测试,可以使用下面的代码,每隔5秒钟执行一次
//int secDelta = 5;
//Trigger trigger = TriggerBuilder
// .newTrigger()
// .withIdentity("dummyTriggerName", "group1")
// .withSchedule(
// CronScheduleBuilder.cronSchedule("0/" + secDelta + " * * * * ?"))
// .build();
//在每天早上的9点多(不超过3分钟)执行
Random rand = new Random(System.currentTimeMillis());
int secDelta = rand.nextInt(60 * 3);
//创建触发器对象
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(secDelta + " 0 9 ? * SUN-SAT"))
.build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
//将触发器与工作关联起来
scheduler.scheduleJob(job, trigger);
}
}
发邮件依赖的包:activation.jar,mail.jar
quartz下载地址:http://www.quartz-scheduler.org/downloads/
 

将发邮件依赖的包和quartz下载得到的lib路径下的jar包全部放在mylib路径下,mylib路径与java文件位于同一个目录。编译和运行时,可以使用命令:

set classpath=mylib/*;.;
javac CronTriggerExample.java
java CronTriggerExample

java实现qq邮箱每天定时发送邮件的更多相关文章

  1. JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架)

    JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架) 本来想实现 QQ 登录,有域名一直没用过,还得备案,好麻烦,只能过几天再更新啦. 先把实现的发送邮箱验证码更能更新了. 老规矩,更多内容在注释 ...

  2. JAVA 使用qq邮箱发送邮件

    引入一个架包: gradle( "com.sun.mail:javax.mail:1.5.6", ) 代码如下: private static final String QQ_EM ...

  3. java mail qq邮箱配置 实例

    程序入口:Test_Email_N.java import java.io.IOException; import java.util.Date; import java.util.Propertie ...

  4. C# QQ邮箱授权码发送邮件

    using System.Net;using System.Web.Mail; public class SendMail { /// <summary> /// 发送Email /// ...

  5. qq邮箱发送

    454 Authentication failed, please open smtp flag first!用QQ邮箱测试报错 我用QQ邮箱测试javamail发送邮件的功能,用户名密码设置正确,却 ...

  6. 普通邮箱设置客户端授权码并开启stmp服务以及关于QQ邮箱“命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !”问题全指导

    Zoomla!逐浪CMS带有强大的邮局功能,可以用于发送邮件与进行事务管理. 其中邮局配置大家不太熟悉这里提供一系列教程. 1.首先在QQ邮箱当中开启"POP3/SMTP服务" 2 ...

  7. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...

  8. python3 通过qq邮箱定时发送邮件

    下面的代码为了每天定时发送监控邮件,监控什么呢?监控当天redis队列中是否有没有消费的数据,和当天mysql中新增的数据量 # -*- coding:utf-8 -*- from common.re ...

  9. 基于java mail实现简单的QQ邮箱发送邮件

    刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 S ...

随机推荐

  1. 5 crucial optimizations for SSD usage in Ubuntu Linux

    I bought my first SSD more than 5 years ago (late 2007), for my white MacBook Core2Duo 2.0 Ghz. It m ...

  2. post方法

    CookieContainer cookie = new CookieContainer(); private string HttpPost(string Url, string postDataS ...

  3. mongodb日志服务器方案

    描述 目前要做的是多台服务器上的程序日志(如订购日志,交易日志,接口是否成功等)汇总到1个mongodb服务器,每日大约1亿的量,然后有图表实时展现,和报表展现日志信息 注意: 没有把所有日志放入1张 ...

  4. oc学习之路----application.keyWindow.rootViewController与self.window.rootViewController与[self.window makeKeyAndVisible];小发现

    刚才调试的时候除了一些小问题,有一段代码要重用 NSString *key = @"CFBundleVersion"; // 取出沙盒中存储的上次使用软件的版本号 NSUserDe ...

  5. java request判断微信客户端访问

    微信客户端访问时候user-agent信息如下: Mozilla/5.0 (Linux; Android 5.0.1; M040 Build/LRX22C) AppleWebKit/537.36 (K ...

  6. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  7. OC中 self.view.frame.size.height = 100; 不能通过编译的原因

    在OC中,当需要修改一个view的尺寸时,通常是通过先将 self.view.fram赋值给一个临时变量,然后修改临时变量,最后将临时变量赋值给 self.view.frame.代码如下: // 1. ...

  8. PHP获取IP所在地区(转)

    1.获取IP地址的API新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js新浪多地域测试方法:http:/ ...

  9. ThinkPHP中的动态缓存(S方法)和快速缓存(F方法)(转)

    系统默认的缓存方式是采用File方式缓存,我们可以在项目配置文件里面定义其他的缓存方式,例如,修改默认的缓存方式为Xcache(当然,你的环境需要支持Xcache)    对于File方式缓存下的缓存 ...

  10. debian安装mono环境

    官网 http://pkg-mono.alioth.debian.org/ 在/etc/apt/sources.list 加上 deb http://debian.meebey.net/pkg-mon ...