1. 程式人生 > 其它 >springboot 實現定時傳送郵件任務

springboot 實現定時傳送郵件任務

技術標籤:springjava

功能實現需要兩個知識點:1 定時任務 2 郵件服務
先說SringBoot定時任務:
SpringBoot自帶定時任務處理,開箱即用 方便快捷以及靈活配置等特點。實現需要兩個註解,@EnableScheduling //表示開啟定時任務註解支援
@Scheduled //自帶cron表示式,方便使用者自定義。
示例如下:

/**
 * @ClassName ApplicationTest
 * @Description TODO
 * @Author 86150
 * @Date 2021/1/20 21:08
 * @Version 1.0
 **/
@SpringBootApplication
@EnableAsync//開啟非同步支援 @EnableScheduling//開啟定時任務執行 public class ApplicationTest { public static void main(String[] args) { SpringApplication.run(ApplicationTest.class); } }

cron表示式 使用者可自行百度,

 //秒 分 時 日 月 周
 	//每天每時每分 每兩秒執行一次
    @Scheduled(cron = "0/2 * * * * ?")
    public void test2
(){ System.out.println("每兩秒執行"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); }

郵件服務:
1 在使用郵件服務之間務必 要開通POP3/SMTP 服務,否則你的服務無法與之通訊。

2 需要匯入指定jar

 <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-
boot-starter-mail</artifactId> </dependency>

3 配置郵件:

# 配置使用的哪個郵件服務商
spring.mail.host=smtp.163.com
# 傳送人的郵箱
spring.mail.username=1506405245@163.com
# 授權碼 表示可以通訊 (服務能讓你在本地客戶端上收發郵件)
spring.mail.password=FFLDJIDFDMIEDLZ
個人不建議使用QQ郵箱,作者自己測試的時候,QQ的授權碼老是失效,動不動就報錯,目前也沒有找到QQ授權碼永久開啟的方法。

3 郵件可以分為普通的郵件和複雜一些的郵件,不過原理都是相通的。
在這裡我們主要使用一個類JavaMailSenderImpl
他實現了JavaMailSender介面,而JavaMailSender介面自己又繼承了MailSender介面。MailSender中只有兩個傳送核心方法,如圖所示:

//
package org.springframework.mail;

public interface MailSender {
    void send(SimpleMailMessage var1) throws MailException;

    void send(SimpleMailMessage... var1) throws MailException;
}

3.1 普通郵件服務
3.1.1 建立郵件主題
3.1.2 建立郵件文字
3.1.3 指定傳送人
3.1.4 指定接收人
3.1.5 呼叫傳送方法

@Autowired
    private JavaMailSender javaMailSender;

    public void sendMail() {
        long startTime = System.currentTimeMillis();
        //初始化郵件物件
        SimpleMailMessage mail = new SimpleMailMessage();
        //主題
        mail.setSubject("測試主題");
        //文字
        mail.setText("Hello World");
        //傳送人
        mail.setFrom("[email protected]");
        //接受人
        mail.setTo("[email protected]");
        javaMailSender.send(mail);
        long endTime = System.currentTimeMillis();
        long mill = (endTime - startTime) / 1000;
        System.out.println("傳送郵件耗時:" + mill + ":秒");
    }

3.2 複雜郵件服務,無非是添加了附件 如圖片、pdf、txt等

public void sendMessage() {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
        	//組裝複雜郵件
            MimeMessageHelper mimeHelper = new MimeMessageHelper(mimeMessage, true);
            mimeHelper.setTo("[email protected]");
            mimeHelper.setFrom("[email protected]");
            //標題
            mimeHelper.setSubject("開發者測試");
            //正文
            mimeHelper.setText("抗擊疫情 人人有責");
            //附件
            File file = new File("D:\\devTools\\apache-maven-3.6.1-bin.zip");
            mimeHelper.addAttachment("清明上河圖", file);
            //圖片
            mimeHelper.addAttachment("test.png", new File("D:\\wp\\思維導圖\\servlet原理.png"));
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        javaMailSender.send(mimeMessage);
    }

到了這兒,實現定時任務郵件傳送其實就簡單了很多,無非就是將兩個服務整合在一塊。
1 啟動類新增@EnableScheduling//開啟定時任務執行
2 編寫郵件傳送方法,方法上面新增定時任務註解
// 秒 分 時 日 月 周
@Scheduled(cron = “0/5 * * * * ?”)

3 最後附上測試程式碼

 // 秒 分 時 日 月 周
    @Scheduled(cron = "0/5 * * * * ?")
    public void send() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom("[email protected]");
        simpleMailMessage.setTo("[email protected]");
        simpleMailMessage.setSubject("開發者測試");
        simpleMailMessage.setText("抗擊疫情 人人有責 我在:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        System.out.println("開始傳送 郵件:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        javaMailSender.send(simpleMailMessage);
        System.out.println("郵件傳送結束:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
2021-01-30 14:53:49.756  INFO 16332 --- [           main] com.hzbank.ApplicationTest               : Started ApplicationTest in 1.967 seconds (JVM running for 2.863)
開始傳送 郵件:2021-01-30 14:53:50
郵件傳送結束:2021-01-30 14:54:08
開始傳送 郵件:2021-01-30 14:54:10
郵件傳送結束:2021-01-30 14:54:28
開始傳送 郵件:2021-01-30 14:54:30
Disconnected from the target VM, address: '127.0.0.1:11038', transport: 'socket'