之前写过一篇用JAVA实现邮件发送的博客,那个使用起来比较麻烦,可以参考文章:java实现邮件发送
今天看到了Spring为我们简化了这些步骤,下面来介绍如何使用Spring和quartz来实现邮件定时发送功能。
项目架构:
发送邮件的服务接口:
package com.sunflower.service; /** * @author Caihanyuan * @time 2012-10-28 上午09:55:15 */ public interface SendMailService { public void sendMail(); }
发送邮件的服务实现类:
1 package com.sunflower.serviceimp; 2 3 import java.util.ResourceBundle; 4 5 import org.springframework.mail.SimpleMailMessage; 6 import org.springframework.mail.javamail.JavaMailSenderImpl; 7 8 import com.sunflower.service.SendMailService; 9 10 /** 11 * @author Caihanyuan 12 * @time 2012-10-28 上午10:01:18 13 */ 14 public class SendMailServiceImp implements SendMailService { 15 private JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 16 17 public JavaMailSenderImpl getMailSender() { 18 return mailSender; 19 } 20 21 public void setMailSender(JavaMailSenderImpl mailSender) { 22 this.mailSender = mailSender; 23 } 24 25 private void getHostInformation() { 26 ResourceBundle resource = ResourceBundle.getBundle("mailhost"); 27 mailSender.setHost(resource.getString("hostname")); 28 mailSender.setPort(Integer.valueOf(resource.getString("hostport"))); 29 mailSender.setUsername(resource.getString("username")); 30 mailSender.setPassword(resource.getString("password")); 31 } 32 33 @Override 34 public void sendMail() { 35 getHostInformation(); 36 SimpleMailMessage simpleMessage = new SimpleMailMessage(); 37 simpleMessage.setTo("1****@139.com"); 38 simpleMessage.setFrom(mailSender.getUsername()); 39 simpleMessage.setSubject("老师您好"); 40 simpleMessage.setText("老师你好,我的作业已经提交了,请查看"); 41 42 mailSender.send(simpleMessage); 43 } 44 }
到目前为止,一个发送邮件的服务已经建立好了,而且可以运行,这里使用的是简单的邮件类型。Spring为我们提供了org.springframework.mail.javamail.JavaMailSenderImpl类,它封装了发送邮件的步骤,让我们使用起来更加简单。org.springframework.mail.SimpleMailMessage是简单邮件的封装类,如果要发送更复杂的邮件类型,要使用javax.mail.internet.MimeMessage类和org.springframework.mail.javamail.MimeMessageHelper类。如何进行各种邮件类型的发送,请查看怎样使用Spring发邮件一文。
JavaMailSenderImpl的邮件发送功能是建立在JavaMail基础之上的,所以要导入mail.jar包 。
使用调度器对这个邮件发送服务进行调度:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 5 6 <bean id="javaMailSenderImp" class="org.springframework.mail.javamail.JavaMailSenderImpl"></bean> 7 8 <bean id="sendMailService" class="com.sunflower.serviceimp.SendMailServiceImp"> 9 <property name="mailSender"> 10 <ref bean="javaMailSenderImp" /> 11 </property> 12 </bean> 13 14 <!-- 被触发器调用,指定被调用的方法 --> 15 <bean id="sendJob" 16 class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 17 <property name="targetObject"> 18 <ref bean="sendMailService" /> 19 </property> 20 <property name="targetMethod"> 21 <value>sendMail</value> 22 </property> 23 </bean> 24 25 <!--一个简单的触发器--> 26 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 27 <property name="jobDetail" ref="sendJob" /> 28 <!-- 在调度程序启动多少毫秒后启动任务 --> 29 <property name="startDelay" value="1" /> 30 <!-- 表示每隔多少毫秒启动 --> 31 <property name="repeatInterval" value="180000" /> 32 </bean> 33 34 35 <!--一个定时的触发器--> 36 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 37 <property name="jobDetail" ref="sendJob" /> 38 <!-- 指明每天早上6点启动任务,表达式的解释见下篇文章 --> 39 <property name="cronExpression" value="0 0 6 * * ?" /> 40 </bean> 41 42 <!-- 调度器 --> 43 <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 44 <property name="triggers"> 45 <list> 46 <ref bean="simpleTrigger" /> 47 </list> 48 </property> 49 </bean> 50 </beans>
------------------------------------
在定时触发器中,<property name="cronExpression"/>属性指定何时进行触发。
一个cron表达式有至少6个(也可能7个)由空格分隔的时间元素。从左到右,这些元素的定义如下:
1.秒(0~59)
2.分钟(0~59)
3.小时(0~23)
4.月份中的日期(1~31)
5.月份(1~12或者JAN~DEC)
6.星期中的日期(1~7或者SUN~SAT)
7.年份(1970~2099)
每一个元素都可以显式地规定一个值(如5),一个区间(如5-12),一个列表(如4,7,10),或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素是互斥的。因此通过设置一个问号(?)来表示你不想设置的那个字段。
------------------------------------
要使用quartz实现定时操作,需要下载quartz的jar包。
定时定时发送的测试:
1 package com.sunflower.maintest; 2 3 import org.quartz.SchedulerException; 4 import org.quartz.impl.StdScheduler; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 /** 9 * @author Caihanyuan 10 * @time 2012-10-28 下午02:37:10 11 */ 12 public class SendMailTest { 13 public static void main(String[] args) { 14 ApplicationContext context = new ClassPathXmlApplicationContext( 15 "applicationContext.xml"); 16 StdScheduler scheduler = (StdScheduler) context.getBean("scheduler"); 17 18 try { 19 scheduler.start(); 20 } 21 catch (SchedulerException e) { 22 e.printStackTrace(); 23 } 24 } 25 }