From 1f938688aca4667e81ae5d125d43059904df27ff Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 14:49:31 +0900 Subject: [PATCH 01/26] =?UTF-8?q?feat:=20email=20=EC=A0=84=EC=86=A1=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 +++ .../service/AnniversaryService.java | 10 ++++ .../fiurinee/domain/mail/MailService.java | 48 +++++++++++++++++++ src/main/resources/application.yml | 14 ++++++ src/main/resources/template/email.html | 12 +++++ 5 files changed, 91 insertions(+) create mode 100644 src/main/java/com/example/fiurinee/domain/mail/MailService.java create mode 100644 src/main/resources/template/email.html diff --git a/build.gradle b/build.gradle index b1967a7..a03fcd2 100644 --- a/build.gradle +++ b/build.gradle @@ -60,6 +60,13 @@ dependencies { //Swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + + //email + implementation 'org.springframework.boot:spring-boot-starter-mail' + + //Thymeleaf + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' } tasks.named('test') { diff --git a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java index 61fc2fc..89b2cc8 100644 --- a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java +++ b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java @@ -5,8 +5,10 @@ import com.example.fiurinee.domain.anniversary.entity.Anniversary; import com.example.fiurinee.domain.anniversary.entity.AnniversaryType; import com.example.fiurinee.domain.anniversary.repository.AnniversaryRepository; +import com.example.fiurinee.domain.mail.MailService; import com.example.fiurinee.domain.member.entity.Member; import com.example.fiurinee.domain.member.repository.MemberRepository; +import jakarta.mail.MessagingException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,6 +32,9 @@ public class AnniversaryService { @Autowired private MemberRepository memberRepository; + @Autowired + private MailService mailService; + public Anniversary addAnniversary(Long memberId, AnniversaryRequestDTO requestDTO) { Member member = memberRepository.findById(memberId).orElseThrow(() -> new IllegalArgumentException("Invalid member ID")); @@ -159,6 +164,11 @@ public List getDDayZeroAnniversaries(List a if (!zeroDDays.isEmpty()) { dDayZeroList.add(AnniversaryResponseDTO.of(anniversary, zeroDDays)); + try { + mailService.sendAnniversaryEmail(anniversary.getMember(), anniversary); + } catch (MessagingException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailService.java b/src/main/java/com/example/fiurinee/domain/mail/MailService.java new file mode 100644 index 0000000..766cccf --- /dev/null +++ b/src/main/java/com/example/fiurinee/domain/mail/MailService.java @@ -0,0 +1,48 @@ +package com.example.fiurinee.domain.mail; + +import com.example.fiurinee.domain.anniversary.entity.Anniversary; +import com.example.fiurinee.domain.member.entity.Member; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring6.SpringTemplateEngine; + +import java.util.Map; + +@Service +public class MailService { + @Autowired + private JavaMailSender mailSender; + + @Autowired + private SpringTemplateEngine templateEngine; + + public void sendEmail(String to, String subject, String templateName, Map variables) throws MessagingException { + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true); + Context context = new Context(); + context.setVariables(variables); + String html = templateEngine.process(templateName, context); + + helper.setTo(to); + helper.setSubject(subject); + helper.setText(html, true); + + mailSender.send(message); + } + + public void sendAnniversaryEmail(Member member, Anniversary anniversary) throws MessagingException { + String to = member.getEmail(); + String subject = "기념일 알림"; + Map variables = Map.of( + "name", member.getName(), + "anniversaryName", anniversary.getName() + ); + sendEmail(to, subject, "email", variables); + } +} + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e2241e4..a9b15a6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -41,6 +41,18 @@ spring: - profile_nickname - account_email + mail: + host: smtp.gmail.com + port: 587 + username: ${mail.username} + password: ${mail.password} + properties: + mail: + smtp: + auth: true + starttls: + enable: true + logging.level: org.hibernate.SQL: debug org.hibernate.type: trace @@ -59,3 +71,5 @@ cloud: jwt: secret-key: ${JWT_SECRET_KEY} + + diff --git a/src/main/resources/template/email.html b/src/main/resources/template/email.html new file mode 100644 index 0000000..04c459a --- /dev/null +++ b/src/main/resources/template/email.html @@ -0,0 +1,12 @@ + + + + D-Day Notification + + +

기념일 알림

+

+

+

기념일에 꽃을 추천 받아 보세요!

+ + From a33c872cc280da9720279375ebfacf1c85dfd0de Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 15:19:03 +0900 Subject: [PATCH 02/26] =?UTF-8?q?chore:=ED=8F=B4=EB=8D=94=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/{template => templates}/email.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/{template => templates}/email.html (100%) diff --git a/src/main/resources/template/email.html b/src/main/resources/templates/email.html similarity index 100% rename from src/main/resources/template/email.html rename to src/main/resources/templates/email.html From afe78db926a326502e272af9d59a2c3d25b15bf6 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 15:46:36 +0900 Subject: [PATCH 03/26] =?UTF-8?q?chore:=EB=8F=84=EC=BB=A4=EC=97=90=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dev_deploy.yml | 2 ++ docker-compose.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/dev_deploy.yml b/.github/workflows/dev_deploy.yml index 7df2e74..acdd6de 100644 --- a/.github/workflows/dev_deploy.yml +++ b/.github/workflows/dev_deploy.yml @@ -108,6 +108,8 @@ jobs: echo "KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}" >> ~/deploy/.env echo "KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}" >> ~/deploy/.env echo "JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}" >> ~/deploy/.env + echo "MAIL_USERNAME=${{ secrets.MAIL_USERNAME }}" >> ~/deploy/.env + echo "MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }}" >> ~/deploy/.env sudo docker-compose -f ~/deploy/docker-compose.yml pull sudo docker-compose -f ~/deploy/docker-compose.yml up -d sudo docker image prune -f diff --git a/docker-compose.yml b/docker-compose.yml index 0c25995..a84b7bc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,8 @@ services: KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID} KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET} JWT_SECRET_KEY: ${JWT_SECRET_KEY} + MAIL_USERNAME : ${MAIL_USERNAME} + MAIL_PASSWORD : ${MAIL_PASSWORD} hibernate_ddl_auto: update REDIS_HOST: redis depends_on: From 1623c8731ac407d90d84e01809e4f28a7db84d88 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 15:50:47 +0900 Subject: [PATCH 04/26] =?UTF-8?q?chore:=EB=8F=84=EC=BB=A4=EC=97=90=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a9b15a6..eb40936 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -44,8 +44,8 @@ spring: mail: host: smtp.gmail.com port: 587 - username: ${mail.username} - password: ${mail.password} + username: ${{ secrets.MAIL_USERNAME }} + password: ${{ secrets.MAIL_PASSWORD }} properties: mail: smtp: From c7efb75d21e4b69159df0f01802c8695f0526ba6 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 16:00:10 +0900 Subject: [PATCH 05/26] =?UTF-8?q?chore:=20=ED=99=98=EA=B2=BD=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/email.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/email.html b/src/main/resources/templates/email.html index 04c459a..d2d548c 100644 --- a/src/main/resources/templates/email.html +++ b/src/main/resources/templates/email.html @@ -6,7 +6,7 @@

기념일 알림

-

+

기념일에 꽃을 추천 받아 보세요!

From 9caf941c9a3d4d2f760a22469bf93c960dd6b3f5 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 16:55:50 +0900 Subject: [PATCH 06/26] =?UTF-8?q?chore:=20=EC=98=A4=EB=A5=98=20=EB=94=94?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index eb40936..bd4e730 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -56,6 +56,9 @@ spring: logging.level: org.hibernate.SQL: debug org.hibernate.type: trace + org.springframework.mail: DEBUG + com.sun.mail.smtp: DEBUGs + cloud: aws: From 3d2d4396679608b01c59f92b05fe07b62a22004e Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 17:26:54 +0900 Subject: [PATCH 07/26] =?UTF-8?q?fix:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bd4e730..f20b7ae 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -57,7 +57,7 @@ logging.level: org.hibernate.SQL: debug org.hibernate.type: trace org.springframework.mail: DEBUG - com.sun.mail.smtp: DEBUGs + com.sun.mail.smtp: DEBUG cloud: From 37bf8cfb53b05da93144f7ca410252be2ca6d16e Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 18:02:42 +0900 Subject: [PATCH 08/26] =?UTF-8?q?chore:=20email=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fiurinee/domain/mail/MailServiceTest.java | 21 ++++++++++++++++ .../fiurinee/domain/mail/TestController.java | 25 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java create mode 100644 src/main/java/com/example/fiurinee/domain/mail/TestController.java diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java b/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java new file mode 100644 index 0000000..ed8d4cf --- /dev/null +++ b/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java @@ -0,0 +1,21 @@ +package com.example.fiurinee.domain.mail; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +@Service +public class MailServiceTest { + @Autowired + private JavaMailSender javaMailSender; + + public void sendTestEmail() { + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo("qormoon@naver.com"); // 테스트 이메일 수신자 + message.setSubject("Test Email"); + message.setText("This is a test email from the application."); + + javaMailSender.send(message); + } +} diff --git a/src/main/java/com/example/fiurinee/domain/mail/TestController.java b/src/main/java/com/example/fiurinee/domain/mail/TestController.java new file mode 100644 index 0000000..27faf39 --- /dev/null +++ b/src/main/java/com/example/fiurinee/domain/mail/TestController.java @@ -0,0 +1,25 @@ +package com.example.fiurinee.domain.mail; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/test") +public class TestController { + @Autowired + private MailServiceTest mailServiceTest; + + @GetMapping("/sendEmail") + public String sendEmail() { + try { + mailServiceTest.sendTestEmail(); + return "Email sent successfully!"; + } catch (Exception e) { + e.printStackTrace(); + return "Email send failed: " + e.getMessage(); + } + } +} From 3176bed718a6e4544df239aed2356679f6470714 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 18:21:06 +0900 Subject: [PATCH 09/26] =?UTF-8?q?chore:=20=EC=95=B1=20=EB=B9=84=EB=B0=80?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/fiurinee/domain/mail/MailServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java b/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java index ed8d4cf..56be850 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java +++ b/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java @@ -12,7 +12,7 @@ public class MailServiceTest { public void sendTestEmail() { SimpleMailMessage message = new SimpleMailMessage(); - message.setTo("qormoon@naver.com"); // 테스트 이메일 수신자 + message.setTo("qormoon@naver.com"); message.setSubject("Test Email"); message.setText("This is a test email from the application."); From 17cc25eda95629abbc79c667d15116c96491f296 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 19:59:39 +0900 Subject: [PATCH 10/26] =?UTF-8?q?chore:=20naver=20smtp=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f20b7ae..ff7a26e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -42,15 +42,15 @@ spring: - account_email mail: - host: smtp.gmail.com - port: 587 + host: smtp.naver.com + port: 465 username: ${{ secrets.MAIL_USERNAME }} password: ${{ secrets.MAIL_PASSWORD }} properties: mail: smtp: auth: true - starttls: + ssl: enable: true logging.level: From 32d636fe9584866cede2aeaaea3fdb33c2db86c3 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 20:16:00 +0900 Subject: [PATCH 11/26] =?UTF-8?q?chore:=20smtp=20port=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff7a26e..bf8dee8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -43,7 +43,7 @@ spring: mail: host: smtp.naver.com - port: 465 + port: 587 username: ${{ secrets.MAIL_USERNAME }} password: ${{ secrets.MAIL_PASSWORD }} properties: From 001bc4cc9770c08dc13282391479155e34844645 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 20:20:44 +0900 Subject: [PATCH 12/26] =?UTF-8?q?chore:=20smtp=20port=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bf8dee8..ff7a26e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -43,7 +43,7 @@ spring: mail: host: smtp.naver.com - port: 587 + port: 465 username: ${{ secrets.MAIL_USERNAME }} password: ${{ secrets.MAIL_PASSWORD }} properties: From 3616e2a672b97450e238bde1273e8823259e3adc Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Wed, 26 Jun 2024 22:41:30 +0900 Subject: [PATCH 13/26] =?UTF-8?q?chore:=20smtp=20gmail=EB=A1=9C=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff7a26e..f20b7ae 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -42,15 +42,15 @@ spring: - account_email mail: - host: smtp.naver.com - port: 465 + host: smtp.gmail.com + port: 587 username: ${{ secrets.MAIL_USERNAME }} password: ${{ secrets.MAIL_PASSWORD }} properties: mail: smtp: auth: true - ssl: + starttls: enable: true logging.level: From 1dff7eb921a0616632d6687ef7b03b3a5c95d3eb Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Thu, 27 Jun 2024 00:24:27 +0900 Subject: [PATCH 14/26] =?UTF-8?q?chore:=20=ED=99=98=EA=B2=BD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=97=86=EC=95=A0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f20b7ae..5f6a89b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -44,8 +44,8 @@ spring: mail: host: smtp.gmail.com port: 587 - username: ${{ secrets.MAIL_USERNAME }} - password: ${{ secrets.MAIL_PASSWORD }} + username: wlgusqor12@gmail.com + password: tbyiilhblgupacvg properties: mail: smtp: From f1e1c505c9f35b993724bcbb2c665183f0bdd7e0 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Thu, 27 Jun 2024 23:24:22 +0900 Subject: [PATCH 15/26] =?UTF-8?q?feat:=20=EC=8A=A4=EC=BC=80=EC=A5=B4?= =?UTF-8?q?=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/fiurinee/FiurineeApplication.java | 2 + .../domain/mail/AnniversarySchedular.java | 47 +++++++++++++++++++ .../domain/member/service/MemberService.java | 6 +++ 3 files changed, 55 insertions(+) create mode 100644 src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java diff --git a/src/main/java/com/example/fiurinee/FiurineeApplication.java b/src/main/java/com/example/fiurinee/FiurineeApplication.java index a9d33ba..68329e2 100644 --- a/src/main/java/com/example/fiurinee/FiurineeApplication.java +++ b/src/main/java/com/example/fiurinee/FiurineeApplication.java @@ -5,8 +5,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import com.example.fiurinee.domain.flower.service.FlowerService; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling public class FiurineeApplication implements CommandLineRunner { @Autowired diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java new file mode 100644 index 0000000..5f71797 --- /dev/null +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -0,0 +1,47 @@ +package com.example.fiurinee.domain.mail; + +import com.example.fiurinee.domain.anniversary.entity.Anniversary; +import com.example.fiurinee.domain.anniversary.service.AnniversaryService; +import com.example.fiurinee.domain.member.entity.Member; +import com.example.fiurinee.domain.member.service.MemberService; +import jakarta.mail.MessagingException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class AnniversarySchedular { + @Autowired + private AnniversaryService anniversaryService; + + @Autowired + private MailService mailService; + + @Autowired + private MemberService memberService; + + @Scheduled(cron = "0 27 23 * * *") + public void sendDDayZeroAnniversaryEmails() { + List members = memberService.findAll(); + for (Member member : members) { + List anniversaries = member.getAnniversaries(); + for (Anniversary anniversary : anniversaries) { + List> allDDays = anniversaryService.calculateDDay(anniversary); + for (Map dDay : allDDays) { + for (Map.Entry entry : dDay.entrySet()) { + if (entry.getValue() == 0) { + try { + mailService.sendAnniversaryEmail(anniversary.getMember(), anniversary); + } catch (MessagingException e) { + e.printStackTrace(); + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/example/fiurinee/domain/member/service/MemberService.java b/src/main/java/com/example/fiurinee/domain/member/service/MemberService.java index 596a666..8c44ede 100644 --- a/src/main/java/com/example/fiurinee/domain/member/service/MemberService.java +++ b/src/main/java/com/example/fiurinee/domain/member/service/MemberService.java @@ -9,6 +9,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @Transactional(readOnly = true) @RequiredArgsConstructor @@ -37,5 +39,9 @@ public MemberResponseDTO getMemberDtoById(Long id) { return MemberResponseDTO.of(member); } + public List findAll() { + return memberRepository.findAll(); + } + } From 18e8ff997d81b7d3e8ed0a6cdacf3bcce9b934fe Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Thu, 27 Jun 2024 23:38:45 +0900 Subject: [PATCH 16/26] =?UTF-8?q?chore:=20=EC=8B=9C=EA=B0=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20anniversaryService=20=EC=BD=94=EB=93=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/anniversary/service/AnniversaryService.java | 5 ----- .../example/fiurinee/domain/mail/AnniversarySchedular.java | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java index 89b2cc8..b15f527 100644 --- a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java +++ b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java @@ -164,11 +164,6 @@ public List getDDayZeroAnniversaries(List a if (!zeroDDays.isEmpty()) { dDayZeroList.add(AnniversaryResponseDTO.of(anniversary, zeroDDays)); - try { - mailService.sendAnniversaryEmail(anniversary.getMember(), anniversary); - } catch (MessagingException e) { - e.printStackTrace(); - } } } diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 5f71797..4b23263 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -23,7 +23,7 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 27 23 * * *") + @Scheduled(cron = "0 0 0 * * *") public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { From c5f3e2806ebfc416905f7643def4d2e7f2555f2e Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Fri, 28 Jun 2024 17:16:15 +0900 Subject: [PATCH 17/26] =?UTF-8?q?chore:=20=ED=95=9C=EA=B5=AD=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=20=EB=82=A0=EC=A7=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AnniversaryService.java | 75 ++++++++++--------- .../domain/mail/AnniversarySchedular.java | 2 +- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java index b15f527..92ebef3 100644 --- a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java +++ b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java @@ -96,54 +96,55 @@ private void validateAnniversaryType(String type) { } - public List> calculateDDay(Anniversary anniversary) { - List> dDayList = new ArrayList<>(); - LocalDate today = LocalDate.now(); - LocalDateTime anniversaryDateTime = anniversary.getAnniversaryDate().toLocalDateTime(); - LocalDate anniversaryDate = anniversaryDateTime.toLocalDate(); - long yearsDifference = ChronoUnit.YEARS.between(anniversaryDate, today); - - if (anniversary.getType() == AnniversaryType.연인) { - int daysPassed = (int) ChronoUnit.DAYS.between(anniversaryDate, today); - int nextDay = ((daysPassed / 100) + 1) * 100; - - for (int i = 0; i < 2; i++) { - LocalDate hundredDays = anniversaryDate.plusDays(nextDay + i * 100); - if (!hundredDays.isBefore(today)) { - Map dDay = new HashMap<>(); - dDay.put((nextDay + i * 100) + "days", (int) ChronoUnit.DAYS.between(today, hundredDays) - 1); - dDayList.add(dDay); + public List> calculateDDay(Anniversary anniversary) { + List> dDayList = new ArrayList<>(); + ZoneId koreaZoneId = ZoneId.of("Asia/Seoul"); + LocalDate today = LocalDate.now(koreaZoneId); + LocalDateTime anniversaryDateTime = anniversary.getAnniversaryDate().toLocalDateTime(); + LocalDate anniversaryDate = anniversaryDateTime.toLocalDate(); //기념일의 날짜 부분만 추출 + long yearsDifference = ChronoUnit.YEARS.between(anniversaryDate, today); //기념일 날짜와 오늘 날짜 사이의 년 차이를 계산 + + if (anniversary.getType() == AnniversaryType.연인) { + int daysPassed = (int) ChronoUnit.DAYS.between(anniversaryDate, today); //기념일 이후 오늘까지 경과된 일 수를 계산 + int nextDay = ((daysPassed / 100) + 1) * 100; + + for (int i = 0; i < 2; i++) { + LocalDate hundredDays = anniversaryDate.plusDays(nextDay + i * 100); + if (!hundredDays.isBefore(today)) { + Map dDay = new HashMap<>(); + dDay.put((nextDay + i * 100) + "days", (int) ChronoUnit.DAYS.between(today, hundredDays) - 1); + dDayList.add(dDay); + } } } - } - - boolean isTodayAnniversary = false; - for (int i = 1; i <= yearsDifference + 1; i++) { - LocalDate yearAnniversary = anniversaryDate.plusYears(i); - int daysBetween = (int) ChronoUnit.DAYS.between(today, yearAnniversary); - if (daysBetween == 0) { - Map dDay = new HashMap<>(); - dDay.put("year", daysBetween); - dDayList.add(dDay); - isTodayAnniversary = true; - break; - } - } - if (!isTodayAnniversary) { + boolean isTodayAnniversary = false; for (int i = 1; i <= yearsDifference + 1; i++) { LocalDate yearAnniversary = anniversaryDate.plusYears(i); - if (!yearAnniversary.isBefore(today)) { + int daysBetween = (int) ChronoUnit.DAYS.between(today, yearAnniversary); + if (daysBetween == 0) { Map dDay = new HashMap<>(); - dDay.put("year", (int) ChronoUnit.DAYS.between(today, yearAnniversary)); + dDay.put("year", daysBetween); dDayList.add(dDay); + isTodayAnniversary = true; break; } } - } - return dDayList; - } + if (!isTodayAnniversary) { + for (int i = 1; i <= yearsDifference + 1; i++) { + LocalDate yearAnniversary = anniversaryDate.plusYears(i); + if (!yearAnniversary.isBefore(today)) { + Map dDay = new HashMap<>(); + dDay.put("year", (int) ChronoUnit.DAYS.between(today, yearAnniversary)); + dDayList.add(dDay); + break; + } + } + } + + return dDayList; + } public List getDDayZeroAnniversaries(List anniversaries) { List dDayZeroList = new ArrayList<>(); diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 4b23263..11ac13d 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -23,7 +23,7 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 0 0 * * *") + @Scheduled(cron = "0 35 17 * * *") public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { From da4a0d94851aad90526e8af36551951820017dbe Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Fri, 28 Jun 2024 17:40:36 +0900 Subject: [PATCH 18/26] =?UTF-8?q?chore:=20=ED=95=9C=EA=B5=AD=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=20=EC=8B=9C=EA=B0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/fiurinee/domain/mail/AnniversarySchedular.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 11ac13d..a341108 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -23,7 +23,7 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 35 17 * * *") + @Scheduled(cron = "0 48 17 * * *", zone = "Asia/Seoul") public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { From cae1edeb2a70514b270e5aff48fe29c8842d9757 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Fri, 28 Jun 2024 17:59:36 +0900 Subject: [PATCH 19/26] =?UTF-8?q?fix:=20LazyInitializationException?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/fiurinee/domain/mail/AnniversarySchedular.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index a341108..22e7497 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import java.util.List; import java.util.Map; @@ -23,7 +25,8 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 48 17 * * *", zone = "Asia/Seoul") + @Scheduled(cron = "0 05 18 * * *", zone = "Asia/Seoul") + @Transactional public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { From 60e79e448af7da13345c56cbda4a8e79b1d3bc7d Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Fri, 28 Jun 2024 18:59:33 +0900 Subject: [PATCH 20/26] =?UTF-8?q?chore:=20=EB=B0=9C=EC=8B=A0=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=94=94?= =?UTF-8?q?=EC=9E=90=EC=9D=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/mail/AnniversarySchedular.java | 2 +- .../fiurinee/domain/mail/MailService.java | 1 + src/main/resources/templates/email.html | 76 ++++++++++++++++++- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 22e7497..63befc6 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -25,7 +25,7 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 05 18 * * *", zone = "Asia/Seoul") + @Scheduled(cron = "0 07 05 * * *", zone = "Asia/Seoul") @Transactional public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailService.java b/src/main/java/com/example/fiurinee/domain/mail/MailService.java index 766cccf..e2f2c61 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/MailService.java +++ b/src/main/java/com/example/fiurinee/domain/mail/MailService.java @@ -28,6 +28,7 @@ public void sendEmail(String to, String subject, String templateName, Map"); helper.setTo(to); helper.setSubject(subject); helper.setText(html, true); diff --git a/src/main/resources/templates/email.html b/src/main/resources/templates/email.html index d2d548c..afc6ecc 100644 --- a/src/main/resources/templates/email.html +++ b/src/main/resources/templates/email.html @@ -1,12 +1,80 @@ + + D-Day Notification + -

기념일 알림

-

-

-

기념일에 꽃을 추천 받아 보세요!

+
+
+

[Fiurinee] 기념일 알림

+
+
+

안녕하세요.

+

소중한 사람들에게 선물할 꽃을 추천해주는 플랫폼 Fiurinee입니다.

+

+

+

기념일에 꽃을 추천 받아 보세요!

+
+ +
+ + + From 0fe35ceb67b738abf09d2ca30a4a5edf02bbe6e0 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Fri, 28 Jun 2024 19:02:49 +0900 Subject: [PATCH 21/26] =?UTF-8?q?chore:=20=EB=A9=94=EC=9D=BC=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/fiurinee/domain/mail/AnniversarySchedular.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 63befc6..c27bc5a 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -25,7 +25,7 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 07 05 * * *", zone = "Asia/Seoul") + @Scheduled(cron = "0 07 19 * * *", zone = "Asia/Seoul") @Transactional public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); From 9f9ca5b3979c4c6806bbe02384e51268e7fe2138 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Fri, 28 Jun 2024 19:14:40 +0900 Subject: [PATCH 22/26] =?UTF-8?q?chore:=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/mail/AnniversarySchedular.java | 2 +- .../fiurinee/domain/mail/MailService.java | 2 +- src/main/resources/templates/email.html | 75 ++++--------------- 3 files changed, 17 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index c27bc5a..7b28baa 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -25,7 +25,7 @@ public class AnniversarySchedular { @Autowired private MemberService memberService; - @Scheduled(cron = "0 07 19 * * *", zone = "Asia/Seoul") + @Scheduled(cron = "0 19 19 * * *", zone = "Asia/Seoul") @Transactional public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailService.java b/src/main/java/com/example/fiurinee/domain/mail/MailService.java index e2f2c61..75819cb 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/MailService.java +++ b/src/main/java/com/example/fiurinee/domain/mail/MailService.java @@ -38,7 +38,7 @@ public void sendEmail(String to, String subject, String templateName, Map variables = Map.of( "name", member.getName(), "anniversaryName", anniversary.getName() diff --git a/src/main/resources/templates/email.html b/src/main/resources/templates/email.html index afc6ecc..47b187a 100644 --- a/src/main/resources/templates/email.html +++ b/src/main/resources/templates/email.html @@ -2,75 +2,28 @@ - D-Day Notification - -
-
-

[Fiurinee] 기념일 알림

+ +
+
+

[Fiurinee] 기념일 알림

-
-

안녕하세요.

-

소중한 사람들에게 선물할 꽃을 추천해주는 플랫폼 Fiurinee입니다.

-

-

-

기념일에 꽃을 추천 받아 보세요!

+
+

안녕하세요.

+

소중한 사람들에게 선물할 꽃을 추천해주는 플랫폼 Fiurinee입니다.

+

+

+

기념일에 꽃을 추천 받아 보세요!

- @@ -78,3 +31,5 @@

소중한 사람들에게 선물할 꽃을 추천해주는 플랫폼 Fiurine + + From 137ffa15d57bf3568d617d279f8eb8d493200e5d Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Sat, 29 Jun 2024 00:20:36 +0900 Subject: [PATCH 23/26] =?UTF-8?q?chore:=20alarm=EC=9D=B4=20true=EC=9D=B8?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=EC=97=90=EB=A7=8C=20=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/mail/AnniversarySchedular.java | 20 +++++++++------ .../fiurinee/domain/mail/MailServiceTest.java | 21 ---------------- .../fiurinee/domain/mail/TestController.java | 25 ------------------- 3 files changed, 12 insertions(+), 54 deletions(-) delete mode 100644 src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java delete mode 100644 src/main/java/com/example/fiurinee/domain/mail/TestController.java diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 7b28baa..f161812 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -16,20 +16,24 @@ @Service public class AnniversarySchedular { - @Autowired - private AnniversaryService anniversaryService; + private final AnniversaryService anniversaryService; + private final MailService mailService; + private final MemberService memberService; - @Autowired - private MailService mailService; - - @Autowired - private MemberService memberService; + public AnniversarySchedular(AnniversaryService anniversaryService, MailService mailService, MemberService memberService) { + this.anniversaryService = anniversaryService; + this.mailService = mailService; + this.memberService = memberService; + } - @Scheduled(cron = "0 19 19 * * *", zone = "Asia/Seoul") + @Scheduled(cron = "0 0 9 * * *", zone = "Asia/Seoul") @Transactional public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { + if (!member.isAlarm()) { // Alarm이 false인 경우 스킵 + continue; + } List anniversaries = member.getAnniversaries(); for (Anniversary anniversary : anniversaries) { List> allDDays = anniversaryService.calculateDDay(anniversary); diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java b/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java deleted file mode 100644 index 56be850..0000000 --- a/src/main/java/com/example/fiurinee/domain/mail/MailServiceTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.fiurinee.domain.mail; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.stereotype.Service; - -@Service -public class MailServiceTest { - @Autowired - private JavaMailSender javaMailSender; - - public void sendTestEmail() { - SimpleMailMessage message = new SimpleMailMessage(); - message.setTo("qormoon@naver.com"); - message.setSubject("Test Email"); - message.setText("This is a test email from the application."); - - javaMailSender.send(message); - } -} diff --git a/src/main/java/com/example/fiurinee/domain/mail/TestController.java b/src/main/java/com/example/fiurinee/domain/mail/TestController.java deleted file mode 100644 index 27faf39..0000000 --- a/src/main/java/com/example/fiurinee/domain/mail/TestController.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.example.fiurinee.domain.mail; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/test") -public class TestController { - @Autowired - private MailServiceTest mailServiceTest; - - @GetMapping("/sendEmail") - public String sendEmail() { - try { - mailServiceTest.sendTestEmail(); - return "Email sent successfully!"; - } catch (Exception e) { - e.printStackTrace(); - return "Email send failed: " + e.getMessage(); - } - } -} From d89eba8bda7f8a0575980da9d46a7dc9b0c95b14 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Sat, 29 Jun 2024 00:32:34 +0900 Subject: [PATCH 24/26] =?UTF-8?q?chore:=20=EB=A9=94=EC=9D=BC=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EC=8B=9C=EA=B0=84=209=EC=8B=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/fiurinee/domain/mail/AnniversarySchedular.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index f161812..3e0508a 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -31,7 +31,7 @@ public AnniversarySchedular(AnniversaryService anniversaryService, MailService m public void sendDDayZeroAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { - if (!member.isAlarm()) { // Alarm이 false인 경우 스킵 + if (!member.isAlarm()) { continue; } List anniversaries = member.getAnniversaries(); From 74a55726d392686bca1eaa351a768e396458d78d Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Sat, 29 Jun 2024 22:02:46 +0900 Subject: [PATCH 25/26] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=BC=EC=A0=84?= =?UTF-8?q?=EC=86=A1=203=EC=9D=BC=EC=A0=84=20=EC=A0=84=EC=86=A1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/mail/AnniversarySchedular.java | 12 ++++---- .../fiurinee/domain/mail/MailService.java | 10 +++++++ src/main/resources/templates/pre-email.html | 30 +++++++++++++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/templates/pre-email.html diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index 3e0508a..ba87f53 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -28,7 +28,7 @@ public AnniversarySchedular(AnniversaryService anniversaryService, MailService m @Scheduled(cron = "0 0 9 * * *", zone = "Asia/Seoul") @Transactional - public void sendDDayZeroAnniversaryEmails() { + public void sendAnniversaryEmails() { List members = memberService.findAll(); for (Member member : members) { if (!member.isAlarm()) { @@ -39,12 +39,14 @@ public void sendDDayZeroAnniversaryEmails() { List> allDDays = anniversaryService.calculateDDay(anniversary); for (Map dDay : allDDays) { for (Map.Entry entry : dDay.entrySet()) { - if (entry.getValue() == 0) { - try { + try { + if (entry.getValue() == 0) { mailService.sendAnniversaryEmail(anniversary.getMember(), anniversary); - } catch (MessagingException e) { - e.printStackTrace(); + } else if (entry.getValue() == 3) { + mailService.sendPreAnniversaryEmail(anniversary.getMember(), anniversary); } + } catch (MessagingException e) { + e.printStackTrace(); } } } diff --git a/src/main/java/com/example/fiurinee/domain/mail/MailService.java b/src/main/java/com/example/fiurinee/domain/mail/MailService.java index 75819cb..096d1b2 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/MailService.java +++ b/src/main/java/com/example/fiurinee/domain/mail/MailService.java @@ -45,5 +45,15 @@ public void sendAnniversaryEmail(Member member, Anniversary anniversary) throws ); sendEmail(to, subject, "email", variables); } + + public void sendPreAnniversaryEmail(Member member, Anniversary anniversary) throws MessagingException { + String to = member.getEmail(); + String subject = "[Fiurinee] 안녕하세요, Fiurinee입니다. 곧 다가올 기념일을 준비하세요!"; + Map variables = Map.of( + "name", member.getName(), + "anniversaryName", anniversary.getName() + ); + sendEmail(to, subject, "pre-email", variables); + } } diff --git a/src/main/resources/templates/pre-email.html b/src/main/resources/templates/pre-email.html new file mode 100644 index 0000000..f985eae --- /dev/null +++ b/src/main/resources/templates/pre-email.html @@ -0,0 +1,30 @@ + + + + + D-Day Notification + + + +
+
+

[Fiurinee] 기념일 알림

+
+
+

안녕하세요.

+

소중한 사람들에게 선물할 꽃을 추천해주는 플랫폼 Fiurinee입니다.

+

+

+

기념일에 꽃을 추천 받아 보세요!

+
+
+

Fiurinee

+
+
+ + From 6e783a395c760c556dafdf7b96fc9be19d2094b7 Mon Sep 17 00:00:00 2001 From: jihyeon baek Date: Thu, 4 Jul 2024 14:14:49 +0900 Subject: [PATCH 26/26] =?UTF-8?q?chore:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fiurinee/domain/anniversary/service/AnniversaryService.java | 2 +- .../com/example/fiurinee/domain/mail/AnniversarySchedular.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java index 92ebef3..35f31bb 100644 --- a/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java +++ b/src/main/java/com/example/fiurinee/domain/anniversary/service/AnniversaryService.java @@ -96,7 +96,7 @@ private void validateAnniversaryType(String type) { } - public List> calculateDDay(Anniversary anniversary) { + public List> calculateDDay(Anniversary anniversary) { List> dDayList = new ArrayList<>(); ZoneId koreaZoneId = ZoneId.of("Asia/Seoul"); LocalDate today = LocalDate.now(koreaZoneId); diff --git a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java index ba87f53..0433741 100644 --- a/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java +++ b/src/main/java/com/example/fiurinee/domain/mail/AnniversarySchedular.java @@ -26,7 +26,7 @@ public AnniversarySchedular(AnniversaryService anniversaryService, MailService m this.memberService = memberService; } - @Scheduled(cron = "0 0 9 * * *", zone = "Asia/Seoul") + @Scheduled(cron = "0 30 14 * * *", zone = "Asia/Seoul") @Transactional public void sendAnniversaryEmails() { List members = memberService.findAll();