From dd099d9d2b09dc118465cfad4c1930d37519a275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=B0=94=EB=8B=A4?= Date: Wed, 5 Nov 2025 20:08:45 +0900 Subject: [PATCH] =?UTF-8?q?:sparkles:=20feat:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auth/email/EmailSenderImpl.java | 103 +++++++++++++++++- .../service/InvitationMailServiceImpl.java | 88 +++++++++++++-- src/main/resources/static/syncly_dolphin.png | Bin 0 -> 33361 bytes 3 files changed, 177 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/static/syncly_dolphin.png diff --git a/src/main/java/com/project/syncly/domain/auth/email/EmailSenderImpl.java b/src/main/java/com/project/syncly/domain/auth/email/EmailSenderImpl.java index 55eb49a..c501609 100644 --- a/src/main/java/com/project/syncly/domain/auth/email/EmailSenderImpl.java +++ b/src/main/java/com/project/syncly/domain/auth/email/EmailSenderImpl.java @@ -1,8 +1,11 @@ package com.project.syncly.domain.auth.email; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; -import org.springframework.mail.SimpleMailMessage; +import org.springframework.core.io.ClassPathResource; import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; @Service @@ -13,10 +16,98 @@ public class EmailSenderImpl implements EmailSender { @Override public void send(String to, String subject, String content) { - SimpleMailMessage message = new SimpleMailMessage(); - message.setTo(to); - message.setSubject(subject); - message.setText(content); - javaMailSender.send(message); + try { + MimeMessage message = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setTo(to); + helper.setSubject(subject); + + String body = createEmailTemplate(content); + helper.setText(body, true); + + // 돌고래 이미지 첨부 + ClassPathResource dolphinImage = new ClassPathResource("static/syncly_dolphin.png"); + helper.addInline("dolphinLogo", dolphinImage); + + javaMailSender.send(message); + } catch (MessagingException e) { + throw new RuntimeException("이메일 전송에 실패했습니다.", e); + } + } + + private String createEmailTemplate(String verificationCode) { + StringBuilder body = new StringBuilder(); + body.append(""); + body.append(""); + body.append(""); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(""); + body.append(""); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append("
"); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append(" "); + body.append("
"); + body.append("
"); + body.append(" \"Syncly"); + body.append("
"); + body.append("

이메일 인증

"); + body.append("

회원가입을 위한 인증코드입니다

"); + body.append("
"); + body.append("

안녕하세요,

"); + body.append("

"); + body.append(" Syncly 회원가입을 환영합니다.
"); + body.append(" 아래 인증코드를 입력하여 이메일 인증을 완료해 주세요."); + body.append("

"); + body.append(" "); + body.append("
"); + body.append("
"); + body.append("

").append(verificationCode).append("

"); + body.append("
"); + body.append("
"); + body.append(" "); + body.append("
"); + body.append("

보안 안내

"); + body.append("

"); + body.append(" • 이 인증코드는 10분간 유효합니다
"); + body.append(" • 타인에게 코드를 공유하지 마세요
"); + body.append(" • 본인이 요청하지 않은 경우 이메일을 무시하세요"); + body.append("

"); + body.append("
"); + body.append("

"); + body.append(" 만약 회원가입을 요청하지 않으셨다면, 이 이메일을 무시하셔도 됩니다."); + body.append("

"); + body.append("
"); + body.append("

"); + body.append(" © 2025 Syncly. All rights reserved.
"); + body.append(" 함께 만들어가는 협업 워크스페이스"); + body.append("

"); + body.append("
"); + body.append("
"); + body.append(""); + body.append(""); + + return body.toString(); } } diff --git a/src/main/java/com/project/syncly/domain/workspace/service/InvitationMailServiceImpl.java b/src/main/java/com/project/syncly/domain/workspace/service/InvitationMailServiceImpl.java index 86f2680..7f4ffa3 100644 --- a/src/main/java/com/project/syncly/domain/workspace/service/InvitationMailServiceImpl.java +++ b/src/main/java/com/project/syncly/domain/workspace/service/InvitationMailServiceImpl.java @@ -7,8 +7,10 @@ import jakarta.mail.MessagingException; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import java.util.Random; @@ -63,17 +65,87 @@ private String generateRandomToken() { public MimeMessage createMail(String mail, String number) { try { MimeMessage message = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); - message.setFrom(senderEmail); - message.setRecipients(MimeMessage.RecipientType.TO, mail); - message.setSubject("이메일 인증"); + helper.setFrom(senderEmail); + helper.setTo(mail); + helper.setSubject("이메일 인증"); String body = ""; - body += "

워크스페이스 초대 수락 링크입니다.

"; - body += "

" + number + "

"; - body += "

감사합니다.

"; - - message.setText(body, "UTF-8", "html"); + body += ""; + body += ""; + body += ""; + body += " "; + body += " "; + body += " "; + body += ""; + body += ""; + body += " "; + body += " "; + body += " "; + body += " "; + body += "
"; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += " "; + body += "
"; + body += "
"; + body += " \"Syncly"; + body += "
"; + body += "

워크스페이스 초대

"; + body += "

Syncly 워크스페이스에 초대되었습니다

"; + body += "
"; + body += "

안녕하세요,

"; + body += "

"; + body += " 새로운 워크스페이스에서 함께 협업하실 수 있도록 초대장을 보내드립니다.
"; + body += " 아래 버튼을 클릭하여 초대를 수락해 주세요."; + body += "

"; + body += " "; + body += " "; + body += " "; + body += "
"; + body += "

버튼이 작동하지 않나요?

"; + body += "

"; + body += " 아래 링크를 복사하여 브라우저에 붙여넣으세요:
"; + body += " " + number + ""; + body += "

"; + body += "
"; + body += "

"; + body += " 이 초대장은 7일간 유효합니다. 만약 이 이메일을 예상하지 못했다면 무시하셔도 됩니다."; + body += "

"; + body += "
"; + body += "

"; + body += " © 2025 Syncly. All rights reserved.
"; + body += " 함께 만들어가는 협업 워크스페이스"; + body += "

"; + body += "
"; + body += "
"; + body += ""; + body += ""; + + helper.setText(body, true); + + // 이미지 첨부 (CID 방식) + ClassPathResource dolphinImage = new ClassPathResource("static/syncly_dolphin.png"); + helper.addInline("dolphinLogo", dolphinImage); return message; diff --git a/src/main/resources/static/syncly_dolphin.png b/src/main/resources/static/syncly_dolphin.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3614b2eb48030f4511ba183b74a78b47dc7814 GIT binary patch literal 33361 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
  • Cd;n&%o?CB~uMI0OLhpj41l{$~*K&}$j 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 literal 0 HcmV?d00001