首页 > 学院 > 开发设计 > 正文

基于Maven,spring整合quartz,定时发送邮件

2019-11-06 08:22:50
字体:
来源:转载
供稿:网友

前段时间刚把工作任务做完,闲来无事,到网上看看资料,发现自己对java quartz定时任务和java发送邮件挺感兴趣,于是借鉴网上的列子写了一个简单的Demo(Maven工程),使用SPRing整合quartz实现定时任务,使用java mail实现发送邮件

1. 定时任务的实现

1.1 导jar包,pom.xml中的相关配置如下

<!-- 使用国内的maven仓库 -->   <repositories>	   <repository>  		   <id>alimaven</id>  		   <name>aliyun maven</name>  		   <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  		   <releases>  		       <enabled>true</enabled>  		   </releases>  		   <snapshots>  		       <enabled>false</enabled>  		   </snapshots>  	   </repository>   </repositories>  	  <dependencies>	  <!-- 日志框架jar包依赖 -->	  	<dependency>		    <groupId>log4j</groupId>		    <artifactId>log4j</artifactId>		    <version>1.2.17</version>		</dependency>		<dependency>  		    <groupId>org.slf4j</groupId>  		    <artifactId>slf4j-api</artifactId>  		    <version>1.6.6</version>  		</dependency>  		<dependency>  		    <groupId>org.slf4j</groupId>  		    <artifactId>slf4j-log4j12</artifactId>  		    <version>1.6.6</version>  		</dependency>		<!-- spring和quartz的jar包依赖 --> 	  	<dependency>		    <groupId>org.quartz-scheduler</groupId>		    <artifactId>quartz</artifactId>		    <version>2.2.1</version>		</dependency>		<dependency>		    <groupId>org.springframework</groupId>		    <artifactId>spring-context-support</artifactId>		    <version>3.2.4.RELEASE</version>		</dependency>		<dependency>		    <groupId>org.springframework</groupId>		    <artifactId>spring-web</artifactId>		    <version>3.2.4.RELEASE</version>		</dependency>		<dependency>		    <groupId>org.springframework</groupId>		    <artifactId>spring-tx</artifactId>		    <version>3.2.4.RELEASE</version>		</dependency>		<!-- java mail的jar包 -->		<dependency>		    <groupId>javax.mail</groupId>		    <artifactId>javax.mail-api</artifactId>		    <version>1.4.7</version>		</dependency>		<dependency>			<groupId>com.sun.mail</groupId>			<artifactId>javax.mail</artifactId>			<version>1.5.3</version>		</dependency>

1.2 写一个调度器要执行的任务内容的类

public class SendMailScheduler {	private static final Logger LOG = Logger.getLogger(SendMailScheduler.class);	public void work() {		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");		LOG.debug(sdf.format(new Date()));			}}1.3 在spring容器中配置quartz

1.3.1 实现JobDetail

    <!-- 第二种方式实现JobDetail 普通类 -->    <bean id="Quartz" class="com.formssi.spring_quartz.SendMailScheduler"></bean>    <bean id="JobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    	<property name="targetObject" ref="Quartz"></property>        <property name="targetMethod" value="work"></property>    </bean>1.3.2  配置触发器Trigger

 <!-- 触发器的第二种方式 CRON表达式 -->    <bean id="trigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">        <property name="jobDetail" ref="JobDetail2"></property>        <!-- 一下配置是每15秒发送执行一次任务 -->        <property name="cronExpression" value="0/15 * * * * ?"></property>    </bean> 

1.3.3 配置调度器

<!-- 把触发器加入到任务列表中 -->    <bean id="testScheduler"         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">        <property name="triggers">              <list>                  <ref bean="trigger2" />              </list>          </property>    </bean>1.4 测试任务调度的配置结果(Log4J的配置略过)

2. 实现邮件发送

2.2 写发送邮件的类,具体看注释

public class SendMail {	private static final Logger LOG = Logger.getLogger(SendMail.class);	private String host = ""; // smtp服务器    private String from = ""; // 发件人地址    private String to = ""; // 收件人地址    private String[] attachmentPath = null; // 附件地址    private String user = ""; // 用户名    private String pwd = ""; // 密码    private String subject = ""; // 邮件标题    private int status = 0; // 发送结果:0-成功,1-失败    private String htmlContent = ""; //若果发送的是html格式的邮件,这是html内容    	private static final Logger logger = Logger.getLogger(SendMail.class);    public void setAddress(String from, String to, String subject) {    	this.from = from;    	this.to = to;    	this.subject = subject;    }    public void setAttachmentPath(String[] attachmentPath) {    	this.attachmentPath = attachmentPath;    }    	public void setHtmlContent(String htmlContent) {		this.htmlContent = htmlContent;	}	public int sendMail(String user, String pwd, String host) {		// 1. 创建参数配置, 用于连接邮件服务器的参数配置		Properties prop = new Properties();		prop.put("mail.smtp.host", host);		prop.put("mail.smtp.auth", "true");		prop.put("mail.smtp.port","25");		prop.put("mail.transport.protocol", "smtp");				// 2. 根据配置创建会话对象, 用于和邮件服务器交互		session session = Session.getInstance(prop);		session.setDebug(true); 		MimeMessage message = new MimeMessage(session);		try {			//设置发件人地址			message.setFrom(new InternetAddress(from));			//设置收件人地址			message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));//			message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));			//设置邮件标题			message.setSubject(subject);			Multipart mp = new MimeMultipart();			// 设置邮件的文本内容			BodyPart bodyPart = new MimeBodyPart();			//邮件正文(html形式)			bodyPart.setContent(htmlContent, "text/html; charset=utf-8");			mp.addBodyPart(bodyPart);			//设置邮件附件			for (String filePath:attachmentPath) {				bodyPart= new MimeBodyPart();				File attachment = new File(filePath);				if (!attachment.exists()) {					LOG.warn("文件:"+attachment+"不存在!");					status = 1;					return status;				} else{					DataSource ds = new FileDataSource(attachment);					bodyPart.setDataHandler(new DataHandler(ds));					// 添加附件的标题					// 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码					sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); 					bodyPart.setFileName("=?GBK?B?"							+ enc.encode(attachment.getName().getBytes()) + "?=");					mp.addBodyPart(bodyPart);					message.setContent(mp);				}			}			message.saveChanges();			//创建Transport对象			Transport transport = session.getTransport("smtp");			//连接服务器			transport.connect(host, user, pwd);			//发送邮件			transport.sendMessage(message, message.getAllRecipients());			transport.close();		} catch (Exception e) {			e.printStackTrace();			logger.error("发送失败!");		} 		return status;	}}

2.2 在任务类中调用发送邮件的方法

public class SendMailScheduler {	private static final Logger LOG = Logger.getLogger(SendMailScheduler.class);	public void work() {		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");		LOG.debug(sdf.format(new Date()));		SendMail sendmail = new SendMail();		//设置发件地址和收件地址及主题		sendmail.setAddress("1300880****@163.com", "huang**o@formssi.com", "哈哈!逗你玩!");		//设置附件		sendmail.setAttachmentPath(new String[]{"D:/logs/test.log", "D:/picture/test.PNG"});		//设置html内容		StringBuffer content = new StringBuffer();		content.append("<!DOCTYPE html PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/" /"http://www.w3.org/TR/html4/loose.dtd/">")		.append("<html>")          .append("<head>")          .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/">")          .append("<title>测试邮件</title>")        .append("<body>")        .append("<h2>尊敬的xxx,您好,您需要的信息如下:</h2>")        .append("<ol>")        .append("<li>xxxxx1</li>")        .append("<li>xxxxx2</li>")        .append("<li>xxxxx2</li>")        .append("</ol>")        .append("</body>")        .append("</head>")		.append("</html>");		sendmail.setHtmlContent(content.toString());		//调用发送邮件方法		int status = sendmail.sendMail("13008807015", "********", "smtp.163.com");		if (status == 1) {			LOG.error("发送失败");		} else {			LOG.info("发送成功");		}	}}2.3 测试发送结果

下载Demo链接:点击打开链接

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表