From eb197492cfa559b75492b47a3ff4063f3f94335b Mon Sep 17 00:00:00 2001 From: HP Date: Wed, 5 Mar 2025 01:37:09 +0800 Subject: [PATCH] Initial commit --- .idea/.gitignore | 8 ++ .idea/ApifoxUploaderProjectSetting.xml | 6 ++ .idea/compiler.xml | 18 +++++ .idea/encodings.xml | 6 ++ .../fastRequestCurrentProjectLocalConfig.xml | 6 ++ .idea/git_toolbox_blame.xml | 6 ++ .idea/inspectionProfiles/Project_Default.xml | 9 +++ .idea/jarRepositories.xml | 20 +++++ .idea/misc.xml | 31 +++++++ .idea/vcs.xml | 4 + pom.xml | 50 ++++++++++++ .../example/EmailSchedulerApplication.java | 13 +++ .../controller/EmailTestController.java | 76 ++++++++++++++++++ .../com/example/scheduler/EmailScheduler.java | 64 +++++++++++++++ .../com/example/service/EmailService.java | 34 ++++++++ src/main/resources/application.yml | 21 +++++ target/classes/application.yml | 21 +++++ .../example/EmailSchedulerApplication.class | Bin 0 -> 820 bytes .../com/example/controller/EmailRequest.class | Bin 0 -> 992 bytes .../controller/EmailTestController.class | Bin 0 -> 2873 bytes .../example/scheduler/EmailScheduler.class | Bin 0 -> 2804 bytes .../com/example/service/EmailService.class | Bin 0 -> 2084 bytes 22 files changed, 393 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/ApifoxUploaderProjectSetting.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/fastRequest/fastRequestCurrentProjectLocalConfig.xml create mode 100644 .idea/git_toolbox_blame.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/example/EmailSchedulerApplication.java create mode 100644 src/main/java/com/example/controller/EmailTestController.java create mode 100644 src/main/java/com/example/scheduler/EmailScheduler.java create mode 100644 src/main/java/com/example/service/EmailService.java create mode 100644 src/main/resources/application.yml create mode 100644 target/classes/application.yml create mode 100644 target/classes/com/example/EmailSchedulerApplication.class create mode 100644 target/classes/com/example/controller/EmailRequest.class create mode 100644 target/classes/com/example/controller/EmailTestController.class create mode 100644 target/classes/com/example/scheduler/EmailScheduler.class create mode 100644 target/classes/com/example/service/EmailService.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/ApifoxUploaderProjectSetting.xml b/.idea/ApifoxUploaderProjectSetting.xml new file mode 100644 index 0000000..2cb57cc --- /dev/null +++ b/.idea/ApifoxUploaderProjectSetting.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..936177e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/fastRequest/fastRequestCurrentProjectLocalConfig.xml b/.idea/fastRequest/fastRequestCurrentProjectLocalConfig.xml new file mode 100644 index 0000000..e62f560 --- /dev/null +++ b/.idea/fastRequest/fastRequestCurrentProjectLocalConfig.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/git_toolbox_blame.xml b/.idea/git_toolbox_blame.xml new file mode 100644 index 0000000..7dc1249 --- /dev/null +++ b/.idea/git_toolbox_blame.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..e8669f3 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..be5f5c6 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..030ca27 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + Java + + + 性能Java + + + + + 用户定义 + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..37ee8b7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.example + email-scheduler + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.7.0 + + + + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-mail + + + + + org.projectlombok + lombok + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/src/main/java/com/example/EmailSchedulerApplication.java b/src/main/java/com/example/EmailSchedulerApplication.java new file mode 100644 index 0000000..3e4cdfd --- /dev/null +++ b/src/main/java/com/example/EmailSchedulerApplication.java @@ -0,0 +1,13 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling // 启用定时任务 +public class EmailSchedulerApplication { + public static void main(String[] args) { + SpringApplication.run(EmailSchedulerApplication.class, args); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/controller/EmailTestController.java b/src/main/java/com/example/controller/EmailTestController.java new file mode 100644 index 0000000..5cc94d2 --- /dev/null +++ b/src/main/java/com/example/controller/EmailTestController.java @@ -0,0 +1,76 @@ +package com.example.controller; + +import com.example.service.EmailService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequestMapping("/api/email") +public class EmailTestController { + + @Autowired + private EmailService emailService; + + @GetMapping("/send") + public String sendTestEmail(@RequestParam(defaultValue = "test@example.com") String to) { + try { + emailService.sendSimpleEmail( + to, + "测试邮件", + "这是一封测试邮件,发送时间:" + java.time.LocalDateTime.now() + ); + return "邮件发送成功!"; + } catch (Exception e) { + log.error("发送测试邮件失败", e); + return "邮件发送失败:" + e.getMessage(); + } + } + + @PostMapping("/send-custom") + public String sendCustomEmail(@RequestBody EmailRequest request) { + try { + emailService.sendSimpleEmail( + request.getTo(), + request.getSubject(), + request.getContent() + ); + return "自定义邮件发送成功!"; + } catch (Exception e) { + log.error("发送自定义邮件失败", e); + return "邮件发送失败:" + e.getMessage(); + } + } +} + +class EmailRequest { + private String to; + private String subject; + private String content; + + // Getters and Setters + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/scheduler/EmailScheduler.java b/src/main/java/com/example/scheduler/EmailScheduler.java new file mode 100644 index 0000000..bdc6a96 --- /dev/null +++ b/src/main/java/com/example/scheduler/EmailScheduler.java @@ -0,0 +1,64 @@ +package com.example.scheduler; + +import com.example.service.EmailService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Slf4j +@Component +public class EmailScheduler { + + @Autowired + private EmailService emailService; + + // 方式1:使用cron表达式(每天上午10:15执行) + @Scheduled(cron = "0 15 10 * * ?") + public void scheduleDailyEmail() { + log.info("执行每日定时邮件发送任务"); + emailService.sendSimpleEmail( + "recipient@example.com", + "每日报告", + "这是每天上午10:15发送的定时邮件" + ); + } + + // 方式2:固定速率执行(每5分钟执行一次) + @Scheduled(fixedRate = 300000) // 300000毫秒 = 5分钟 + public void scheduleFixedRateEmail() { + log.info("执行固定速率邮件发送任务"); + String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + emailService.sendSimpleEmail( + "recipient@example.com", + "固定速率邮件", + "这是每5分钟发送一次的邮件,当前时间:" + currentTime + ); + } + + // 方式3:固定延迟执行(上一次执行完成后延迟1小时执行) + @Scheduled(fixedDelay = 3600000) // 3600000毫秒 = 1小时 + public void scheduleFixedDelayEmail() { + log.info("执行固定延迟邮件发送任务"); + emailService.sendSimpleEmail( + "recipient@example.com", + "固定延迟邮件", + "这是上一次执行完成后延迟1小时发送的邮件" + ); + } + + // 方式4:组合使用initialDelay和fixedRate + // 程序启动后等待1分钟,之后每30分钟执行一次 + @Scheduled(initialDelay = 60000, fixedRate = 1800000) + public void scheduleWithInitialDelayEmail() { + log.info("执行初始延迟后的定时邮件发送任务"); + emailService.sendSimpleEmail( + "recipient@example.com", + "定时邮件", + "这是启动后延迟1分钟,之后每30分钟发送一次的邮件" + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/service/EmailService.java b/src/main/java/com/example/service/EmailService.java new file mode 100644 index 0000000..bb40380 --- /dev/null +++ b/src/main/java/com/example/service/EmailService.java @@ -0,0 +1,34 @@ +package com.example.service; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class EmailService { + + @Autowired + private JavaMailSender mailSender; + + @Value("${spring.mail.username}") + private String fromEmail; + + public void sendSimpleEmail(String to, String subject, String content) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(fromEmail); // 使用配置文件中的邮箱地址 + message.setTo(to); + message.setSubject(subject); + message.setText(content); + + try { + mailSender.send(message); + log.info("邮件发送成功"); + } catch (Exception e) { + log.error("邮件发送失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..3828747 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,21 @@ +spring: + # 邮件配置 + mail: + host: us1.workspace.org # 邮件服务器地址 + port: 587 # 端口号 + username: nnbwo7zjhg5sg@orinme.com + password: nnbwo7zjhg5sg + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + + # 定时任务配置 + task: + scheduling: + pool: + size: 5 # 定时任务线程池大小 + thread-name-prefix: scheduled-task- # 定时任务线程名称前缀 \ No newline at end of file diff --git a/target/classes/application.yml b/target/classes/application.yml new file mode 100644 index 0000000..3828747 --- /dev/null +++ b/target/classes/application.yml @@ -0,0 +1,21 @@ +spring: + # 邮件配置 + mail: + host: us1.workspace.org # 邮件服务器地址 + port: 587 # 端口号 + username: nnbwo7zjhg5sg@orinme.com + password: nnbwo7zjhg5sg + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + + # 定时任务配置 + task: + scheduling: + pool: + size: 5 # 定时任务线程池大小 + thread-name-prefix: scheduled-task- # 定时任务线程名称前缀 \ No newline at end of file diff --git a/target/classes/com/example/EmailSchedulerApplication.class b/target/classes/com/example/EmailSchedulerApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..43faf8403b7fd487c824d8ddced1dad6e2bbb82d GIT binary patch literal 820 zcma)4O>fgc5Ph2_b!q}_(+?;gm3ly=Idm_mmsFKXR8HnY1cd{qwX=1$wRfZSy7X`L z1nPkwz>h-Ax)I62NE|%lo!NQw=I#9YefJZuyHA_1oJodmWD=2$g;oAM4>sLY6%4PU{~|M>MnqII?DoD!3sNIzl}-nT;}DzJ z3eaWf8=LZC=HnMu#B;dHWggeYcQ4H!jMRo9r(N5kt zJ~aA5rKR05}S*^?fAL& z3e304KM)Q;I@1mU4f>-+Asf(%lV{{x{qJbsR_TzePXlXsK(=##f&9ZN_6X|);){Kk@scK$-e;p06ibw761SM literal 0 HcmV?d00001 diff --git a/target/classes/com/example/controller/EmailRequest.class b/target/classes/com/example/controller/EmailRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..86f2fa4227d923722b572849a0242afdce3aa62a GIT binary patch literal 992 zcma)(OK;Oa6otrqY&rXrWL6xvGClP>vQk@=FG3(KYjvujBOW=!giP?f%&A9lh_1dmfAdvW0MCj z5*@|w&4;;}Sr<)(&awWegIK52;O*qtgjT_^nZniK*^iOUqjb8b;Lhfi#+9BXrMmqr zN+a7>X!Ldt6qROs(P3=wKKzF6*=VoGJ|+EL(P6z*RpSLs?nMt++v1ZjDBP@N+E`@j*D~F% zXWCd~dd^{k3z)>?Qzo%k;Z7~n<|5O6Ez?##)8-=6OESH>fJxr_lxeA8y2sVQ{XbVg Bl%xOv literal 0 HcmV?d00001 diff --git a/target/classes/com/example/controller/EmailTestController.class b/target/classes/com/example/controller/EmailTestController.class new file mode 100644 index 0000000000000000000000000000000000000000..6ed56962425878b180d20392eafb257c35fec0ec GIT binary patch literal 2873 zcmb7GOLG)e6#i~Pn90yUoDc{EF@{%O&^{o7K_G;OXabmtQAEX_nVU%`J>5fhPXg)! z-1w|g7Z%FKjaFGMcqk4alpStDPtq@HnX-*qfYy85BKVOqn|^ZUztF)R^i7&j&j-7@T)emp%c zGrmBr<>UmC1CE>1J!^EwxIWm=!M%My2yrS)<$7Q774N|#8q%jJ2&bYc{$~{ z6M9-2wx^F88Q*cw=|&lq-dFUUDbo$0#P?(@(>DFROrR(>abK`<$!6+W5s-0y2A!D7i2hN zSR;mOs&%xvbWeaVfm*EBunsGT(jPOK-R^mrd$_dB;c`#fStWR&yug-9#3^5;kC5j` zL|Xzo7ESP!OzUaW&Q|93i1Y`ILP2>FsGBsbB3aexDlmnfui*(pY2{0IUd8l0cB~4SRSIVIz8hi@h55VZT7!cS6+#R?S8YCP7pS2^_$|82SZTAJw!P4&gA1 zTxp*&)$obRZg(ZR$nV0cTe#CP6344dX((Bg^v}MT{^G|6cP_;7nm}{3S)uIoPuFIy z|GW$XI2OYohg)?+YdDS*tWoK@j!T^%4sLkNb*5Br_9`?(RcOLsK?w|FB!)Ky8t01Y z(AkVEsJW=&EtTs8hsU7wJR`?}(~Xl##dieei5I13VOP$ICs5-%YH-ZOiOvWJ_FhxP zi!uN;3sSz3nP9I*L#AO+`eRPE+>@LxfpYyt&v){3%2ldfJ#eCiT%^<(aOY$9^$EwT z7$RCQJho*598cmVLUX{$o@0sUV8$>eu<>g%0ox|Y{pqkDW~XW zpsz3x5zbh9T|etMm!1XZT^dQ@pnD)&d#{W))M`#DuLT;6~as(`qeYu0t1E0urqugop&e z;1u4a$5vXthxeJO)AYqmosQA}2mD?qXrlNUNLTR9a3|!O4fw_sUr9qH!Y?#bRC@xd zC5(2JFu{+l7@i3kdXHe(NEY)Mw$bZG>bD6RGuwbRa@pPT(@bBEi;RD)@gk&@{>QIj%n}^Ze*PK%YLs literal 0 HcmV?d00001 diff --git a/target/classes/com/example/scheduler/EmailScheduler.class b/target/classes/com/example/scheduler/EmailScheduler.class new file mode 100644 index 0000000000000000000000000000000000000000..119b1903615bc087e2cd52d969be4053b11bc868 GIT binary patch literal 2804 zcmah~Yf}?f7=BJfvxHS?)QI&`#7hASOH{lNEh>mg@oDJ|Wt zotE}-mFu#>6Ldu6HYnEzlsIRoiO!(rEW5;x!D}(d9HB)b!I* zH<#6n)Fa0YO&^lv0xM~E*3bqO-KHY!h^G`)FlV+lifk{gZ^4C`v6)55i-BbFf0h%UD1xjb4S+T|ZN~d=+OEmDCI73*JuE9Ty*o8fQ>?Rl5ZnavMnwebJ zP6)>+648csY6n#tr0%Y*bJ!K{iwNjoSTsbRhJyzi5{c^l`&-iKmP{sq{pj@L0JZis zMvtbaWkbrNbl9Q6brEkMN}Z(j9FYx*$ywV;LiL+>f`&W=>h2 zKfYl8cFjC@(Q1?H_n$w$5kL%YTP6fEQW>`>rzaF#E9X25g*_b zgJ5V*QVfgp74;mUrml!*b)CA%a)335rbn5p2Bkd1knKDr=O;w5jPoJi`!(X<0qaI~41EvB(|?`QfZL zT2*7HFFn|)xwvKw^>e9BOZRIkRXc*!G*0Kx5b=@g=%qxFpCaoi*sC;W>3fB{CfZK{ z^Ra+d7gAJ5PwP`2WaFs(6``Lg@S%$ST9*JKmf0(yh~8c9F^Qhmf9KXe!1CEg7T8Bb zX9HGZ6>VgAg%0~{CKVJ_)9>mGYHSiGQD$$h`URojnul2DL;Zbh2sQ+zV0a9hrU6#j z>4hk%rF2~tDhVn`ycScu6e~QyRR!SfMZhhch}ghqDM=r(+h_srw1LOb8r(aMePcKn zbxFKAf!K-QTMux2!x&DC;k_A@YHX!f6Qvr2u!hL2B_iu6>-A`)IE-4GR>(neX@zKy zjBZMsAznl<(FtCxOwy~25L;gP)L+mqb^PWG+6f{v{s4c6IQCDd=k9K4gfLF?cJDcR&vT#in&1Ea^)~=x*iaB* z=ru%H<6C;UVsXvo&ZcQ_ZMLkNRyGh6#28Mj>zle}>2^uGnP2CI#}KtdiJ^T#I3>-s zieu~Af+&@^lVRvyuG*ei=GW~_(>3!JpSEq`>7FTUSDIL&oEIC~Jh!={d%Qp<$>2u2 zz#WDw0cgcB?NZUv%lxizHZ*xclRW&*4caXFETs)0q{2&c4X(V}5HQbm+trG?;R)xS zrXO(BrmLQ~YdSu$=At9Yemo@er(wu?k{#VU_H5WW-Kugji*L#eLs$Q2uJ7ombZfLq zDX_`o&lwVvhGp8OH$|}?Oy?M4GorwgIE^z3y2$cyRiVf)^Qv{FpQ)zpp(wYvzJx8B+tg_?23?@msM&i(j-Zft@>Re z)vu~}?Fr}#-}2;@<0_hwY(WOEE0|=sd@Su_>RrVY-k?~^_%UdM4QtTvlOuj-(zyht zDW8wO`tgsw+Wt4+J^td$KfnHV|Nes(%wSf*Th#A|YfHtPbRuTjMWNtrs=mXmaII=u z)QJh)U^rEez5j6guSefc^d>Qn1z9AcNi5-(f}0E-Pf=#K3|^5VLdCmSrZ7_dhN&XJ z!SvB8kbo;H-UIbUlU}L#u^4HTu_Lx2*^GqvK*g%OFyV=yykr>esQA!NFLxY4BPrqu zSr!r5uzK!|<~tfq_v^b=DC(@SpmkHS6id#-d*F+e|_6KNC1$NvcKe zt%<@dU5-ePJJfZ_tf)E$pEG60o~$3^qcYMAjVr|^Yc9Nd6|RL-KZ8E1(L~&M* z1dV z!QezJ6&relbPbnMu}d{*sn~E0S5mQ&8eX9XS5vWFOhoV#y4&B}#kB~2K;J~1#68Tf zwqM`DJE?dLi#23xcz+kSBiQyY9LFRTchvW0h&%y0DN?7&{VtrL_jwx5{pf*4C&o#d zA`fp