项目中多会用到定时任务,这里以实例介绍spring-task实现邮件定时发送功能,希望对大家有帮助!
如有写的不对或者不好的地方,欢迎留言提出各位的宝贵意见。谢谢!
一.spring-task.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.1.xsd
">
<!-- 自动扫描task包下的所有类 -->
<context:component-scan base-package="com.times.test.task" />
<!-- 计划任务 -->
<task:scheduled-tasks>
<!-- 每日发送邮件(每日18点50分0秒) -->
<task:scheduled ref="emailSend" method="run" cron="0 50 18 ? * *"/>
</task:scheduled-tasks>
</beans>
注意:ref-指的是类名,这里是EmailSend类,method-定时任务的方法名,这里是run方法,cron-指的是定时的时间(下一篇博客会附上cron的表达式的语法格式,可以参考)
二.邮件发送-EmailSend类
public void run(){
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", ConfigUtils.getMailSmtpUid()); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", ConfigUtils.getMailSmtpHost()); // 发件人的邮箱的 SMTP
// 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
// 开启 SSL 连接
//final String smtpPort = "465";
props.setProperty("mail.smtp.port", ConfigUtils.getMailSmtpPort());
props.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", ConfigUtils.getMailSmtpPort());
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
// 1. 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
try {
message.setFrom(new InternetAddress(ConfigUtils.getMailSmtpFrom()));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.addRecipient(RecipientType.TO, new InternetAddress(ConfigUtils.getMailDir()));
// 4. Subject: 邮件主题
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
message.setSubject(ConfigUtils.getMailBodyHeader()+"("+sdf.format(new Date())+")", "UTF-8");
/*
* 下面是邮件内容的创建:
*/
// 9. 创建附件“节点”
MimeBodyPart attachment = new MimeBodyPart();
//附件信息 生成文件
String fileName = InvoiceCsv.generateFileName();
InvoiceCsv invoiceCsv = new InvoiceCsv();
List<Invoice> listReady = invoiceService.listReady();//查询status是2的数据
Double totAmount = 0.0;
for(int i = 0;i<listReady.size();i++){
totAmount = totAmount + listReady.get(i).getTotalamount();
}
//定义好double类型的精度 统一精度为2位
DecimalFormat df2 = new DecimalFormat("###.00");
String amount = df2.format(totAmount);
invoiceCsv.createCSV(listReady, amount, fileName);//自动查询生成报表
DataHandler dh2 = new DataHandler(new FileDataSource(ConfigUtils.getInvFileSavePath()+fileName)); // 读取本地文件
attachment.setDataHandler(dh2);
// 将附件数据添加到“节点”
attachment.setFileName(MimeUtility.encodeText(dh2.getName()));
// 设置附件的文件名(需要编码)
// 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(attachment);
// 如果有多个附件,可以创建多个多次添加
// 11. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
message.setContent(mm);
// 12. 设置发件时间
message.setSentDate(new Date());
// 13. 保存上面的所有设置
message.saveChanges();
// 也可以保持到本地查看
// message.writeTo(file_out_put_stream);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器
// 这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错
transport.connect(ConfigUtils.getMailSmtpFrom(), ConfigUtils.getMailSmtpPwd());
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人,
// 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
注意:1.这里邮件的参数在system.properties中统一进行管理
下一篇会附上cron参数的语法格式要求,请关注!