springboot 實現定時傳送郵件任務
阿新 • • 發佈:2021-01-31
功能實現需要兩個知識點: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'