diff --git a/.env.example b/.env.example index a44ae1a..2f5da66 100644 --- a/.env.example +++ b/.env.example @@ -2,4 +2,10 @@ RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 RABBITMQ_USERNAME=your_username -RABBITMQ_PASSWORD=your_password \ No newline at end of file +RABBITMQ_PASSWORD=your_password + +# Mail +MAIL_HOST=smtp.gmail.com +MAIL_PORT=587 +MAIL_USERNAME=your_mail +MAIL_PASSWORD=your_mail_password \ No newline at end of file diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 3b60800..f21eb7f 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -54,6 +54,12 @@ REQUIRED_VARS=( "RABBITMQ_PORT" "RABBITMQ_USERNAME" "RABBITMQ_PASSWORD" + +# Mail +"MAIL_HOST" +"MAIL_PORT" +"MAIL_USERNAME" +"MAIL_PASSWORD" ) MISSING=() diff --git a/src/main/java/ditda/notification/mail/EmailSender.java b/src/main/java/ditda/notification/mail/EmailSender.java new file mode 100644 index 0000000..c885541 --- /dev/null +++ b/src/main/java/ditda/notification/mail/EmailSender.java @@ -0,0 +1,65 @@ +package ditda.notification.mail; + +import java.io.UnsupportedEncodingException; +import java.util.Map; + +import org.springframework.boot.mail.autoconfigure.MailProperties; +import org.springframework.core.io.ClassPathResource; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring6.SpringTemplateEngine; + +import jakarta.mail.MessagingException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +public class EmailSender { + + private static final String LOGO_CID = "logoImage"; + private static final String LOGO_PATH = "email-images/logo.png"; + + private static final String FROM_NAME = "DITDA"; + + private final JavaMailSender mailSender; + private final SpringTemplateEngine templateEngine; + private final MailProperties mailProperties; + + public void send(String to, NotificationType type, Map variables) + throws MessagingException { + + MimeMessage mimeMessage = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); + + try { + helper.setFrom(new InternetAddress(mailProperties.getUsername(), FROM_NAME, "UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException("UTF-8 is not supported", e); + } + + helper.setTo(to); + helper.setSubject(type.getSubject()); + helper.setText(renderTemplate(type.getTemplate(), variables), true); + + helper.addInline(LOGO_CID, new ClassPathResource(LOGO_PATH)); + + mailSender.send(mimeMessage); + + log.info("[Email] Email sent. to={}, type={}", MailMasker.mask(to), type); + } + + private String renderTemplate(String templateName, Map variables) { + Context context = new Context(); + if (variables != null) { + variables.forEach(context::setVariable); + } + + return templateEngine.process(templateName, context); + } +} diff --git a/src/main/java/ditda/notification/mail/MailListener.java b/src/main/java/ditda/notification/mail/MailListener.java index a93ebec..675446b 100644 --- a/src/main/java/ditda/notification/mail/MailListener.java +++ b/src/main/java/ditda/notification/mail/MailListener.java @@ -3,14 +3,22 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; +import jakarta.mail.MessagingException; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Component +@RequiredArgsConstructor public class MailListener { + private final EmailSender emailSender; + @RabbitListener(queues = MailRabbitConfig.MAIL_QUEUE) - public void handle(MailMessage message) { - log.info("메일 메세지 수신. type: {}, to: {}", message.type(), message.to()); + public void handle(MailMessage message) throws MessagingException { + log.info("[Email] Mail message received. type: {}, to: {}", message.type(), MailMasker.mask(message.to())); + + NotificationType type = NotificationType.valueOf(message.type()); + emailSender.send(message.to(), type, message.variables()); } } diff --git a/src/main/java/ditda/notification/mail/MailMasker.java b/src/main/java/ditda/notification/mail/MailMasker.java new file mode 100644 index 0000000..98e646a --- /dev/null +++ b/src/main/java/ditda/notification/mail/MailMasker.java @@ -0,0 +1,26 @@ +package ditda.notification.mail; + +import org.springframework.util.StringUtils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class MailMasker { + + public static String mask(String email) { + if (!StringUtils.hasText(email) || !email.contains("@")) { + return "***"; + } + + int at = email.indexOf("@"); + String local = email.substring(0, at); + String domain = email.substring(at); + + if (local.length() <= 2) { + return "****" + domain; + } + + return local.substring(0, 2) + "****" + domain; + } +} diff --git a/src/main/java/ditda/notification/mail/NotificationType.java b/src/main/java/ditda/notification/mail/NotificationType.java new file mode 100644 index 0000000..95030b3 --- /dev/null +++ b/src/main/java/ditda/notification/mail/NotificationType.java @@ -0,0 +1,81 @@ +package ditda.notification.mail; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum NotificationType { + + // 지원 마감 (ApplicationDeadlineClosed) + APPLICATION_REFUND_REQUEST_ADMIN( + "[DITDA] 외주 마감에 따른 환불 처리 요망", "email/admin-refund-request"), + APPLICATION_CANCELLED_INSTRUCTOR( + "[DITDA] 신청하신 외주가 지원자 부족으로 취소되었습니다.", "email/commission-cancelled"), + APPLICATION_SHORTFALL_INSTRUCTOR( + "[DITDA] 신청하신 외주의 모집 인원이 미달되었습니다.", "email/commission-shortfall-instructor"), + APPLICATION_MATCHED_INSTRUCTOR( + "[DITDA] 신청하신 외주의 디자이너 매칭이 완료되었습니다.", "email/commission-matched-instructor"), + APPLICATION_MATCHED_DESIGNER( + "[DITDA] 지원하신 외주의 1차 시안 대상자로 선정되었습니다.", "email/commission-matched-designer"), + + // 1차 시안 마감 (FirstDraftDeadlineClosed) + FIRST_DRAFT_REFUND_REQUEST_ADMIN( + "[DITDA] 1차 시안 미제출에 따른 환불 처리 요망", "email/admin-refund-request"), + FIRST_DRAFT_ZERO_INSTRUCTOR( + "[DITDA] 1차 시안 제출이 없어 외주가 취소되었습니다.", "email/first-draft-zero-instructor"), + FIRST_DRAFT_SHORTFALL_INSTRUCTOR( + "[DITDA] 일부 디자이너의 1차 시안이 미제출되었습니다.", "email/first-draft-shortfall-instructor"), + FIRST_DRAFT_MISSED_DESIGNER( + "[DITDA] 1차 시안 기한 초과로 외주 진행이 종료되었습니다.", "email/first-draft-missed-designer"), + + // 최종 마감 (FinalDeadlineClosed) + FINAL_CANCELLED_INSTRUCTOR( + "[DITDA] 시안 선택 기한 초과로 외주가 취소되었습니다.", "email/final-cancelled-instructor"), + FINAL_CANCELLED_DESIGNER( + "[DITDA] 강사 미선택으로 외주가 취소되었습니다.", "email/final-cancelled-designer"), + + // 전원 1차 시안 제출 (AllFirstDraftsSubmitted) + ALL_FIRST_DRAFTS_SUBMITTED_INSTRUCTOR( + "[DITDA] 모든 1차 시안이 제출되었습니다. 시안을 선택해 주세요.", "email/first-draft-all-submitted-instructor"), + + // 시안 선택 (DraftSelected) + DRAFT_SELECTED_DESIGNER( + "[DITDA] 제출하신 1차 시안이 최종 선택되었습니다.", "email/first-draft-selected-designer"), + DRAFT_REJECTED_DESIGNER( + "[DITDA] 1차 시안 선정 결과를 안내해 드립니다.", "email/first-draft-rejected-designer"), + + // 외주 최종 확정 (CommissionCompleted) + COMMISSION_FINALIZED_INSTRUCTOR( + "[DITDA] 신청하신 외주가 최종 확정되었습니다.", "email/commission-finalized-instructor"), + COMMISSION_FINALIZED_DESIGNER( + "[DITDA] 작업하신 외주가 최종 확정되었습니다.", "email/commission-finalized-designer"), + + // 수정 요청/제출 (RevisionRequested / RevisionSubmitted) + REVISION_REQUESTED_DESIGNER( + "[DITDA] 시안 수정 요청이 도착했습니다. 확인해주세요.", "email/revision-requested-designer"), + REVISION_SUBMITTED_INSTRUCTOR( + "[DITDA] 수정본이 제출되었습니다. 확인해주세요.", "email/revision-submitted-instructor"), + + // 정산 요청 (PayoutRequested) + PAYOUT_REQUEST_COMPLETED_ADMIN( + "[DITDA] 외주 최종 확정 - 디자이너 정산 요청", "email/admin-payout-request"), + PAYOUT_REQUEST_CANCELLED_ADMIN( + "[DITDA] 외주 취소 - 제출 디자이너 정산 요청", "email/admin-payout-request"), + PAYOUT_REQUEST_REJECTED_ADMIN( + "[DITDA] 시안 선택 완료 - 미선택 디자이너 정산 요청", "email/admin-payout-request"), + + // auth + EMAIL_VERIFICATION( + "[DITDA] 이메일 인증 코드", "email/verification-code"), + DESIGNER_SIGNUP_REVIEW_ADMIN( + "[DITDA] 새 디자이너 가입 검토 요청", "email/designer-signup-notification"), + + // payment + DEPOSIT_CONFIRM_REQUEST_ADMIN( + "[DITDA] 외주 입금 확인 요청", "email/deposit-notification"); + + private final String subject; + private final String template; +} + diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 41a284a..677d1da 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -19,5 +19,20 @@ spring: initial-interval: 2s multiplier: 2 max-interval: 10s - max-retries: 3 + max-retries: 2 default-requeue-rejected: false + + mail: + host: ${MAIL_HOST} + port: ${MAIL_PORT:587} + username: ${MAIL_USERNAME} + password: ${MAIL_PASSWORD} + properties: + mail: + smtp: + auth: true + starttls: + enable: true + connectiontimeout: 5000 + timeout: 10000 + writetimeout: 10000 diff --git a/src/main/resources/email-images/logo.png b/src/main/resources/email-images/logo.png new file mode 100644 index 0000000..355f7f9 Binary files /dev/null and b/src/main/resources/email-images/logo.png differ diff --git a/src/main/resources/templates/email/admin-payout-request.html b/src/main/resources/templates/email/admin-payout-request.html new file mode 100644 index 0000000..ce0b0c1 --- /dev/null +++ b/src/main/resources/templates/email/admin-payout-request.html @@ -0,0 +1,100 @@ + + + + + + +
+ +
+ ditda +
+ +
+

디자이너 정산 요청

+

+ + 외주가 자동 최종 확정되어 디자이너 정산이 필요합니다. + 외주가 강사 수동 확정되어 디자이너 정산이 필요합니다. + 외주가 강사 미선택으로 취소되어 제출 디자이너에 대한 기본금 정산이 필요합니다. + 강사가 시안을 선택하여 미선택 디자이너에 대한 기본금 정산이 필요합니다. +
+ 어드민 Swagger에서 디자이너 계좌 정보를 조회 후 송금해 주세요. +

+
+ + +
+

+ 📌 정산 안내
+ 계좌 정보는 보안상 메일에 포함되지 않습니다.
+ 어드민 Swagger에서 디자이너 ID로 계좌 정보를 조회하세요. +

+
+ + +
+

📋 외주 정보

+
+ 외주 ID + +
+
+ 외주명 + +
+
+ 강사 + +
+
+ + +
+

+ 💰 정산 대상 + +

+ +
+
+ 디자이너 ID + +
+
+ 디자이너 + +
+
+ 정산 금액 + +
+
+ +
+
+ 총 정산 금액 + +
+
+
+ +
+ + 어드민 Swagger 바로가기 + +
+ +

+ 본 메일은 시스템에 의해 자동 발송된 관리자 전용 알림입니다. +

+
+ + diff --git a/src/main/resources/templates/email/admin-refund-request.html b/src/main/resources/templates/email/admin-refund-request.html new file mode 100644 index 0000000..ceeba99 --- /dev/null +++ b/src/main/resources/templates/email/admin-refund-request.html @@ -0,0 +1,55 @@ + + + + + + +
+
+ ditda +
+
+

외주 마감 환불 처리 요청

+

+ 외주 마감 또는 취소로 인해 정산(환불) 사유가 발생했습니다.
+ 아래 내역을 확인하신 후 수동 환불을 진행해주시기 바랍니다. +

+
+
+
+ 외주 ID + +
+
+ 외주명 + +
+
+ 강사명 + +
+
+ 강사 이메일 + +
+
+ 마감 형태 + + 지원자 0명 (외주 취소) + 정원 미달 (부분 환불 진행) + 1차 시안 전원 미제출 (외주 취소) + 일부 시안 미제출 (부분 환불 진행) + +
+
+ 환불 요청액 + +
+
+

+ 본 메일은 시스템에 의해 자동 발송된 관리자 전용 알림입니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/commission-cancelled.html b/src/main/resources/templates/email/commission-cancelled.html new file mode 100644 index 0000000..f40eac3 --- /dev/null +++ b/src/main/resources/templates/email/commission-cancelled.html @@ -0,0 +1,38 @@ + + + + + + +
+
+ ditda +
+
+

외주 매칭 취소 안내

+

+

+ 신청하신 외주에 기간 내에 지원한 디자이너가 없어
+ 아쉽게도 해당 외주가 자동 취소되었습니다.

+ [환불 안내]
+ 본 메일의 답장으로 환불받으실 은행과 계좌번호, 예금주명을 보내주시면,
+ 확인 후 영업일 기준 2~3일 이내에 전액 환불해 드릴 예정입니다. +

+
+
+
+ 외주명 + +
+
+ 진행 상태 + 취소 (환불 예정) +
+
+

+ ※ 본 메일은 환불 계좌 회신용으로 답장 수신이 가능합니다.
환불 계좌 외의 일반 문의사항이 있으시면 고객센터로 연락 바랍니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/commission-finalized-designer.html b/src/main/resources/templates/email/commission-finalized-designer.html new file mode 100644 index 0000000..ee26839 --- /dev/null +++ b/src/main/resources/templates/email/commission-finalized-designer.html @@ -0,0 +1,47 @@ + + + + + + +
+ +
+ ditda +
+ +
+

외주 최종 확정

+

+

+ + 작업하신 외주의 최종 마감일이 지나
+ 가장 최근 제출하신 시안이 자동으로 최종 확정되었습니다. +
+ + 작업하신 외주가 최종 확정되었습니다.
+ 강사님께서 시안을 최종 결과물로 확정하셨습니다. +
+

+ 소중한 시간을 내어 시안을 제출해 주신 점 감사드립니다.
+ 인센티브는 영업일 기준 2~3일 이내에 지급될 예정입니다. +

+
+ +
+
+ 외주명 + +
+
+ 진행 상태 + 최종 확정 완료 +
+
+ +

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/commission-finalized-instructor.html b/src/main/resources/templates/email/commission-finalized-instructor.html new file mode 100644 index 0000000..36576e9 --- /dev/null +++ b/src/main/resources/templates/email/commission-finalized-instructor.html @@ -0,0 +1,59 @@ + + + + + + +
+ +
+ ditda +
+ +
+

외주 최종 확정

+

+

+ + 신청하신 외주의 최종 마감일이 지나
+ 가장 최근 제출된 시안이 자동으로 최종 확정되었습니다. +
+ + 신청하신 외주가 최종 확정되었습니다.
+ 선택하신 시안이 최종 결과물로 확정됩니다. +
+

+ 확정된 시안은 검토를 거쳐
+ 영업일 기준 2~3일 내에 최종 확정본을 메일로 발송해 드립니다. +

+ ditda를 + 이용해 주셔서 진심으로 감사드립니다. +

+ + +
+ +
+
+ 외주명 + +
+
+ 진행 상태 + 최종 확정 완료 +
+
+ +
+ + 대시보드 바로가기 + +
+ +

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/commission-matched-designer.html b/src/main/resources/templates/email/commission-matched-designer.html new file mode 100644 index 0000000..7113620 --- /dev/null +++ b/src/main/resources/templates/email/commission-matched-designer.html @@ -0,0 +1,45 @@ + + + + + + +
+ +
+ ditda +
+ +
+

1차 시안 대상자 선정 알림

+

+

+ 지원하신 외주 프로젝트의 1차 시안 대상자로 선정되셨습니다.
+ 기한 내에 고품질의 1차 시안을 제출해 주시기 바랍니다. +

+
+ +
+
+ 외주명 + +
+
+ 1차 시안 제출 마감일 + +
+
+ +
+ + 시안 제출하기 + +
+ +

+ 마감 기한을 넘길 경우 매칭 불이익을 받을 수 있으니 기한 엄수 부탁드립니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/commission-matched-instructor.html b/src/main/resources/templates/email/commission-matched-instructor.html new file mode 100644 index 0000000..1540699 --- /dev/null +++ b/src/main/resources/templates/email/commission-matched-instructor.html @@ -0,0 +1,49 @@ + + + + + + +
+ +
+ ditda +
+ +
+

디자이너 매칭 완료!

+

+

+ 신청하신 외주의 디자이너 모집 기간이 마감되어 매칭이 성공적으로 완료되었습니다.
+ 디자이너들의 1차 시안 제작이 완료되는 대로 알림을 보내드리겠습니다. +

+
+ +
+
+ 외주명 + +
+
+ 모집 디자이너 수 + +
+
+ 매칭 디자이너 수 + +
+
+ +
+ + 대시보드 바로가기 + +
+ +

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/commission-shortfall-instructor.html b/src/main/resources/templates/email/commission-shortfall-instructor.html new file mode 100644 index 0000000..510dad4 --- /dev/null +++ b/src/main/resources/templates/email/commission-shortfall-instructor.html @@ -0,0 +1,62 @@ + + + + + + +
+ +
+ ditda +
+ +
+

모집 인원 미달 안내

+

+

+ 신청하신 외주의 모집 인원이 모두 채워지지 않아
+ 매칭된 디자이너만으로 외주가 진행됩니다.

+ [부분 환불 안내]
+ 본 메일의 답장으로 환불받으실 은행과 계좌번호, 예금주명을 보내주시면,
+ 확인 후 영업일 기준 2~3일 이내에 미달 인원분에 해당하는 금액을 환불해 드릴 예정입니다. +

+
+ +
+
+ 외주명 + +
+
+ 모집 정원 + +
+
+ 매칭 인원 + +
+
+ 미달 인원 + +
+
+ 환불 예정 금액 + +
+
+ +
+ + 대시보드 바로가기 + +
+ +

+ ※ 본 메일은 환불 계좌 회신용으로 답장 수신이 가능합니다.
+ 환불 계좌 외의 일반 문의사항은 고객센터로 연락 바랍니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/deposit-notification.html b/src/main/resources/templates/email/deposit-notification.html new file mode 100644 index 0000000..b5b4f8d --- /dev/null +++ b/src/main/resources/templates/email/deposit-notification.html @@ -0,0 +1,50 @@ + + + + + + +
+ +
+ ditda +
+ +
+

외주 입금 확인 요청

+

강사가 입금 완료를 통보했습니다.
입금 내역 확인 후 진행 처리 부탁드립니다.

+
+ +
+
+ 외주 ID + +
+
+ 외주명 + +
+
+ 강사 + +
+
+ 입금자명 + +
+
+ 금액 + +
+
+ 통보 시각 + +
+
+ +

+ 본 메일은 자동 발송된 알림입니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/designer-signup-notification.html b/src/main/resources/templates/email/designer-signup-notification.html new file mode 100644 index 0000000..0b0e88f --- /dev/null +++ b/src/main/resources/templates/email/designer-signup-notification.html @@ -0,0 +1,54 @@ + + + + + + +
+ +
+ ditda +
+ +
+

새 디자이너 가입 검토 요청

+

새로운 디자이너가 회원가입을 완료했습니다.
포트폴리오 검토 후 승인 처리 부탁드립니다.

+
+ + +
+

+ 📌 포트폴리오 확인 안내
+ 포트폴리오는 메일에 포함되지 않습니다.
+ 어드민 Swagger에서 디자이너 ID로 포트폴리오를 조회하세요. +

+
+ +
+
+ Designer ID + +
+
+ 이름 + +
+
+ 이메일 + +
+
+ +
+ + 어드민 Swagger 바로가기 + +
+ +

+ 본 메일은 자동 발송된 알림입니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/final-cancelled-designer.html b/src/main/resources/templates/email/final-cancelled-designer.html new file mode 100644 index 0000000..a14aea7 --- /dev/null +++ b/src/main/resources/templates/email/final-cancelled-designer.html @@ -0,0 +1,37 @@ + + + + + + +
+
+ ditda +
+
+

외주 취소 안내

+

+

+ 제출하신 1차 시안에 대해 강사님의 최종 선택이 기한 내에 이루어지지 않아
+ 해당 외주가 자동 취소되었습니다.

+ 소중한 시간을 내어 시안을 제출해 주신 점 감사드립니다.
+ 기본금은 영업일 기준 2~3일 이내에 지급될 예정입니다. +

+
+
+
+ 외주명 + +
+
+ 진행 상태 + 취소 +
+
+

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/final-cancelled-instructor.html b/src/main/resources/templates/email/final-cancelled-instructor.html new file mode 100644 index 0000000..870c4af --- /dev/null +++ b/src/main/resources/templates/email/final-cancelled-instructor.html @@ -0,0 +1,38 @@ + + + + + + +
+
+ ditda +
+
+

외주 자동 취소 안내

+

+

+ 신청하신 외주의 최종 마감일까지 시안 선택이 이루어지지 않아
+ 해당 외주가 자동 취소되었습니다.

+ 기한 내 시안을 선택하지 않으신 점에 대한 안내로,
+ 본 건은 환불 대상이 아닙니다. +

+
+
+
+ 외주명 + +
+
+ 진행 상태 + 취소 (환불 없음) +
+
+

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다.
+ 문의사항은 고객센터로 연락 바랍니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/first-draft-all-submitted-instructor.html b/src/main/resources/templates/email/first-draft-all-submitted-instructor.html new file mode 100644 index 0000000..46da8a0 --- /dev/null +++ b/src/main/resources/templates/email/first-draft-all-submitted-instructor.html @@ -0,0 +1,45 @@ + + + + + + +
+ +
+ ditda +
+ +
+

1차 시안 제출 완료 안내

+

+

+ 신청하신 외주의 모든 디자이너가 1차 시안 제출을 완료했습니다.
+ 제출된 시안들을 확인하시고 최종 디자이너를 선택해 주세요. +

+
+ +
+
+ 외주명 + +
+
+ 제출 시안 + +
+
+ +
+ + 시안 선택하러 가기 + +
+ +

+ ※ 본 메일은 발신 전용입니다. 문의사항은 고객센터로 연락 바랍니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/first-draft-missed-designer.html b/src/main/resources/templates/email/first-draft-missed-designer.html new file mode 100644 index 0000000..375aff2 --- /dev/null +++ b/src/main/resources/templates/email/first-draft-missed-designer.html @@ -0,0 +1,35 @@ + + + + + + +
+
+ ditda +
+
+

1차 시안 기한 초과 안내

+

+

+ 지원하신 외주의 1차 시안 마감일까지 시안을 제출하지 않으셔서
+ 본 외주에서 자동 탈락 처리되었습니다.

+ ditda에서 다시 만나뵐 수 있기를 기대합니다. +

+
+
+
+ 외주명 + +
+
+ 처리 결과 + 자동 탈락 +
+
+

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/first-draft-rejected-designer.html b/src/main/resources/templates/email/first-draft-rejected-designer.html new file mode 100644 index 0000000..d095c27 --- /dev/null +++ b/src/main/resources/templates/email/first-draft-rejected-designer.html @@ -0,0 +1,35 @@ + + + + + + +
+
+ ditda +
+
+

시안 선택 결과 안내

+

+

+ 제출하신 1차 시안이 아쉽게도 이번 외주에서 선택되지 않았습니다.

+ 소중한 시간을 내어 시안을 제출해 주신 점 감사드립니다.
+ 기본금은 영업일 기준 2~3일 이내에 지급될 예정입니다. +

+
+
+
+ 외주명 + +
+
+ 결과 + 미선택 +
+
+

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/first-draft-selected-designer.html b/src/main/resources/templates/email/first-draft-selected-designer.html new file mode 100644 index 0000000..1f52e3f --- /dev/null +++ b/src/main/resources/templates/email/first-draft-selected-designer.html @@ -0,0 +1,41 @@ + + + + + + +
+
+ ditda +
+
+

시안 선택 안내

+

+

+ 제출하신 1차 시안이 최종 선택되었습니다!
+ 앞으로 강사님과 함께 수정 진행이 시작됩니다.

+ 대시보드에서 수정 요청을 확인해 주세요. +

+
+
+
+ 외주명 + +
+
+ 진행 상태 + 최종 선택 완료 +
+
+
+ + 대시보드 바로가기 + +
+

+ 본 메일은 수신전용 메일이므로 회신되지 않습니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/first-draft-shortfall-instructor.html b/src/main/resources/templates/email/first-draft-shortfall-instructor.html new file mode 100644 index 0000000..5965824 --- /dev/null +++ b/src/main/resources/templates/email/first-draft-shortfall-instructor.html @@ -0,0 +1,62 @@ + + + + + + +
+ +
+ ditda +
+ +
+

1차 시안 일부 미제출 안내

+

+

+ 신청하신 외주의 1차 시안 마감일까지 일부 디자이너의 시안이 제출되지 않았습니다.
+ 제출된 시안들 중에서 최종 선택을 진행해 주세요.

+ [부분 환불 안내]
+ 본 메일의 답장으로 환불받으실 은행과 계좌번호, 예금주명을 보내주시면,
+ 확인 후 영업일 기준 2~3일 이내에 미달 인원분에 해당하는 금액을 환불해 드릴 예정입니다. +

+
+ +
+
+ 외주명 + +
+
+ 제출 시안 + +
+
+ 미제출 + +
+
+ 환불 예정 금액 + +
+
+ 최종 마감일 + +
+
+ +
+ + 시안 선택하러 가기 + +
+ +

+ ※ 본 메일은 환불 계좌 회신용으로 답장 수신이 가능합니다.
+ 환불 계좌 외의 일반 문의사항은 고객센터로 연락 바랍니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/first-draft-zero-instructor.html b/src/main/resources/templates/email/first-draft-zero-instructor.html new file mode 100644 index 0000000..77f640a --- /dev/null +++ b/src/main/resources/templates/email/first-draft-zero-instructor.html @@ -0,0 +1,48 @@ + + + + + + +
+ +
+ ditda +
+ +
+

외주 자동 취소 안내

+

+

+ 신청하신 외주의 1차 시안 마감일까지 제출된 시안이 없어
+ 아쉽게도 해당 외주가 자동 취소되었습니다.

+ [환불 안내]
+ 본 메일의 답장으로 환불받으실 은행과 계좌번호, 예금주명을 보내주시면,
+ 확인 후 영업일 기준 2~3일 이내에 전액 환불해 드릴 예정입니다. +

+
+ +
+
+ 외주명 + +
+
+ 진행 상태 + 취소 (환불 예정) +
+
+ 환불 금액 + +
+
+ +

+ ※ 본 메일은 환불 계좌 회신용으로 답장 수신이 가능합니다.
+ 환불 계좌 외의 일반 문의사항은 고객센터로 연락 바랍니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/revision-requested-designer.html b/src/main/resources/templates/email/revision-requested-designer.html new file mode 100644 index 0000000..5bf9529 --- /dev/null +++ b/src/main/resources/templates/email/revision-requested-designer.html @@ -0,0 +1,49 @@ + + + + + + +
+ +
+ ditda +
+ +
+

시안 수정 요청 안내

+

+

+ 강사님으로부터 시안 수정 요청이 도착했습니다.
+ 요청 내용을 확인하시고 가능한 빠르게 수정본을 제출해 주세요. +

+
+ +
+
+ 외주명 + +
+
+ 수정 차수 + +
+
+ +
+ + 수정 요청 확인하기 + +
+ +

+ 제출이 지연되면 남은 수정 기회에 영향을 줄 수 있으니 신속히 진행해 주세요. +

+ +

+ 본 메일은 발신 전용입니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/revision-submitted-instructor.html b/src/main/resources/templates/email/revision-submitted-instructor.html new file mode 100644 index 0000000..dfc086a --- /dev/null +++ b/src/main/resources/templates/email/revision-submitted-instructor.html @@ -0,0 +1,45 @@ + + + + + + +
+ +
+ ditda +
+ +
+

수정본 제출 안내

+

+

+ 요청하신 수정 사항에 대한 수정본이 제출되었습니다.
+ 제출된 수정본을 확인해 주세요. +

+
+ +
+
+ 외주명 + +
+
+ 수정 차수 + +
+
+ +
+ + 수정본 확인하러 가기 + +
+ +

+ 본 메일은 발신 전용입니다. +

+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/email/verification-code.html b/src/main/resources/templates/email/verification-code.html new file mode 100644 index 0000000..120e327 --- /dev/null +++ b/src/main/resources/templates/email/verification-code.html @@ -0,0 +1,27 @@ + + + + + Ditda 이메일 인증 + + +
+ + +
+ ditda +
+ +
+

ditda 이메일 인증번호

+

아래 인증번호를 입력해주세요.

+
+ 0000 +
+

+ 인증번호는 5분간 유효합니다. +

+
+
+ + \ No newline at end of file diff --git a/src/test/resources/application-test.yaml b/src/test/resources/application-test.yaml index 6818a22..d505587 100644 --- a/src/test/resources/application-test.yaml +++ b/src/test/resources/application-test.yaml @@ -2,4 +2,9 @@ spring: rabbitmq: listener: simple: - auto-startup: false \ No newline at end of file + auto-startup: false + + mail: + host: localhost + username: test + password: test \ No newline at end of file