在web项目中,定时任务和邮件发送功能是非常常见的,所以这里我将这两个功能添加进去。
内容:每五分钟发送一封邮件给用户(QQ邮箱发送给163邮箱,并且抄送一份给QQ邮箱)。
本次需要导入的jar包为:
mail-1.4.jar
quartz-2.2.3.jar
quartz-jobs-2.2.3.jar
首先,将发送邮件的JOB类完成,同样,注释非常详细,如果有看不太明白的,可以留言咨询。
SendMailJob.java
/** * 邮件自动发送入口 */ public void init(){ SendMailJob.send("toMail@163.com", "标题:newbie邮件测试", "内容:邮件测试", "smtp", "smtp.qq.com", "sendMail@qq.com", "端口号", "sendMail", "password"); } /** * QQ邮箱发送邮件到163邮箱 * * @param toMail 收件人 * @param subject 主题 * @param content 内容 * @param smtp 协议 * @param fromHost 发送方的服务器 * @param sendName 邮件发送人 * @param sendPort 邮件发送人端口(可以不指定) * @param userName 邮件发送人名 * @param userPwd 邮件发送人密码(不是邮箱密码,而是开启SMTP功能时候设置的那个密码) * @return 成功或失败 */ public static boolean send(String toMail, String subject, String content, String smtp, String fromHost, String sendName, String sendPort, String userName, String userPwd) { // 创建Session Properties props = new Properties(); // 指定邮件的传输协议,smtp(Simple Mail Transfer Protocol 简单的邮件传输协议) props.put("mail.transport.protocol", smtp); // 指定邮件发送服务器服务器 "smtp.qq.com" props.put("mail.host", fromHost); // 指定邮件的发送人(QQ邮箱) props.put("mail.from", sendName); // 设置安全传输协议为true props.put("mail.smtp.starttls.enable", "true"); // 设置需要身份验证(不验证会不通过) props.put("mail.smtp.auth", "true"); Authentication authentication = new Authentication(userName, userPwd); Session session = Session.getDefaultInstance(props,authentication); // 开启调试模式(能够在控制台看到日志) session.setDebug(true); try { // 第二步:获取发送方对象 Transport transport = session.getTransport(); // 连接邮件服务器,链接您的QQ邮箱,用户名(可以不用带后缀)、密码 transport.connect(userName, userPwd); // 接收方地址 Address toAddress = new InternetAddress(toMail); // 第三步:创建邮件消息体 MimeMessage message = new MimeMessage(session); // 设置发件人昵称 String nick=""; try { nick=javax.mail.internet.MimeUtility.encodeText("神级程序员"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 用上面的nick作为发件人的昵称(收到邮件,发件人那一栏的内容) message.setFrom(new InternetAddress(nick+" <"+sendName+">")); // 直接用发件人的邮箱作为发件人那一栏的内容 // message.setFrom(new InternetAddress(sendName)); // 邮件的主题 message.setSubject(subject); // 收件人 message.addRecipient(Message.RecipientType.TO, toAddress); // 抄送人 Address ccAddress = new InternetAddress("493059742@qq.com"); message.addRecipient(Message.RecipientType.CC, ccAddress); // 邮件的内容(最简单的方法,纯文本邮件内容) // message.setContent(content, "text/html;charset=utf-8"); // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件 Multipart multipart = new MimeMultipart(); // 添加邮件正文 (如果没有附件,可以直接这样设置) BodyPart contentPart = new MimeBodyPart(); contentPart.setContent(content, "text/html;charset=utf-8"); multipart.addBodyPart(contentPart); // 添加附件的内容 BodyPart attachmentPart = new MimeBodyPart(); File file = new File("C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"); DataSource source = new FileDataSource(file); // 将文件资源添加到邮件体中,并设定附件名 attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(MimeUtility.encodeWord(file.getName())); multipart.addBodyPart(attachmentPart); message.setContent(multipart); message.saveChanges(); // 邮件发送时间 message.setSentDate(new Date()); // 第四步:发送邮件 // 第一个参数:邮件的消息体 // 第二个参数:邮件所有的接收人/抄送人 transport.sendMessage(message, message.getAllRecipients()); return true; } catch (Exception e) { e.printStackTrace(); } return false; }
任务类写好后,需要将这个JOB类添加到配置文件中去。
quartz-job.xml
<!-- 邮件自动发送JOB begin --> <!-- 定义JOB类 --> <bean id="getStockMoneyDirectionActualJob" class="com.leq.stock.moneydirection.job.GetStockMoneyDirectionActualJob"></bean> <!-- 指定JOB执行的方法 --> <bean id="methodGetStockMoneyDirectionActualJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 定时执行的类 --> <property name="targetObject" ref="getStockMoneyDirectionActualJob"/> <!-- 具体的方法 --> <property name="targetMethod" value="init"/> </bean> <!-- 调度触发器,设置自己想要的时间规则 --> <bean id="timeGetStockMoneyDirectionActualTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 加入相关的执行类和方法 --> <property name="jobDetail" ref="methodGetStockMoneyDirectionActualJob"/> <!-- 设置时间规则 --> <property name="cronExpression" value="0 0/1 * ? * *"/> </bean> <!-- 加入调度工厂 ,设置调度触发器即可--> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="timeGetStockMoneyDirectionActualTrigger"/> </list> </property> </bean> <!-- 邮件自动发送JOB end -->
配置文件配好后,需要在服务器启动的时候就加载这个配置文件。
上一篇有web.xml的配置详情,这里讲quartz-job.xml添加进去。
web.xml
<!-- 加载Spring容器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 设置Spring容器加载所有的配置文件的路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml,classpath:quartz-job.xml</param-value>
</context-param>
好了,大功告成!