Spring任务调度之Spring-Task--应用实例:实现邮件(带附件)定时发送功能

项目中多会用到定时任务,这里以实例介绍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参数的语法格式要求,请关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值