[Spring Boot] 이메일 발송 로직 구현, 인증번호 보내기

2023. 7. 10. 17:56·프로그래밍 일기/Java & Spring
반응형
버전 정보

Java 11

Spring Boot 2.7.13

사전 설정

메일 보내기에 앞서 POP3/SMTP 설정이 필요합니다.

저는 하이웍스라는 메일을 사용하고 있어 위와 같이 설정했습니다. 만약 네이버, 구글 등 자신이 보내고 싶은 메일에 가서 POP3/SMTP 설정을 해주셔야 합니다.

build.gradle
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

//  메일전송
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.6.3'

lombok은 @RequiredArgsConstructor 어노테이션을 사용하기 위함입니다.

application.properties
# SMTP
spring.mail.host=[smtp 서버 ex)stmp.naver.com]
spring.mail.port=[smtp 포트 번호 ex) 465]
spring.mail.username=[자신의 이메일]
spring.mail.password=[이메일 비밀번호]
spring.mail.properties.debug=true
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable= true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.trust=[smtp 서버 ex)stmp.naver.com]

 

화면

Controller
@PostMapping("/send/mail")
public Map sendMail(@RequestBody Map params) throws Exception {
    return userService.sendMail(params);
}

 

Service
public Map sendMail(Map params) throws Exception{
    Map result = new HashMap();

    result.put("data", new HashMap<>());
    if (mailUtil.sendMail(params.get("email").toString())) {
        result.put("code", 200);
        result.put("message", "success");
    } else {
        result.put("code", 500);
        result.put("message", "fail");
    }

    return result;
}

인증번호는 난수를 생성하여 mailUtil에 함께 넘겨주어 body안에 넣어줍니다. 이후 db에 저장하거나 response값으로 난수를 넘겨 인증번호가 맞는지 검사하면 됩니다.

MailUtil

위와 같이 MailUtil 파일을 만들어줍니다.

package com.example.testapi.config.util;

import lombok.RequiredArgsConstructor;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import javax.mail.internet.MimeMessage;

@Component
@RequiredArgsConstructor
public class MailUtil {
    private final JavaMailSender javaMailSender;

    public boolean sendMail(String ToEmail) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

            helper.setSubject("이편지는..."); // 제목
            helper.setTo(ToEmail); // 받는사람
            helper.setFrom("tmkim@wbsoft.kr"); // 보내는 사람 *application.properties의 값과 동일해야 합니다.

            String BODY = String.join(
                System.getProperty("line.separator"),
                "<head>\n" +
                        "        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
                        "        <title>행운의 편지</title>\n" +
                        "        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n" +
                        "    </head>\n" +
                        "\n" +
                        "    <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"550px\" style=\"border: 1px solid #d7d7d7; border-radius: 20px; text-align: center; font-family:'Malgun Gothic', '맑은 고딕'; letter-spacing: -0.04em; color: #333333;\">\n" +
                        "        <tr>\n" +
                        "            <td style=\"width: 40px;\"></td>\n" +
                        "            <td>\n" +
                        "                <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"470px;\">\n" +
                        "                    <tr><td style=\"height: 60px;\"></td></tr>\n" +
                        "                    <tr><td style=\"height: 18px;\"></td></tr>\n" +
                        "                    <tr><td><span style=\"font-size: 32px; font-weight: bold;\">행운의 편지</span></td></tr>\n" +
                        "                    <tr><td style=\"height: 34px;\"></td></tr>\n" +
                        "                    <tr><td style=\"height: 1px; background: #eaeaea;\"></td></tr>\n" +
                        "                    <tr><td style=\"height: 30px;\"></td></tr>\n" +
                        "                    <tr>\n" +
                        "                        <td>\n" +
                        "                            <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"340px;\" style=\"margin: 0 auto;\">\n" +
                        "                                <tr>\n" +
                        "                                    <td>\n" +
                        "                                        <span style=\"font-size: 14px;\">\n" +
                        "                                            이 편지는 영국에서 최초로 시작되어 일년에 한바퀴를 돌면서 받는 사람에게 행운을 주었고 지금은 당신에게로 옮겨진 이 편지는 4일 안에 당신 곁을 떠나야 합니다. 이 편지를 포함해서 7통을 행운이 필요한 사람에게 보내 주셔야 합니다. 복사를 해도 좋습니다. 혹 미신이라 하실지 모르지만 사실입니다.\n" +
                        "                        \"영국에서 HGXWCH이라는 사람은 1930년에 이 편지를 받았습니다. 그는 비서에게 복사해서 보내라고 했습니다. 며칠 뒤에 복권이 당첨되어 20억을 받았습니다. 어떤 이는 이 편지를 받았으나 96시간 이내 자신의 손에서 떠나야 한다는 사실을 잊었습니다. 그는 곧 사직되었습니다. 나중에야 이 사실을 알고 7통의 편지를 보냈는데 다시 좋은 직장을 얻었습니다. 미국의 케네디 대통령은 이 편지를 받았지만 그냥 버렸습니다. 결국 9일 후 그는 암살당했습니다. 기억해 주세요. 이 편지를 보내면 7년의 행운이 있을 것이고 그렇지 않으면 3년의 불행이 있을 것입니다. 그리고 이 편지를 버리거나 낙서를 해서는 절대로 안됩니다. 7통입니다. 이 편지를 받은 사람은 행운이 깃들것입니다. 힘들겠지만 좋은게 좋다고 생각하세요. 7년의 행운을 빌면서..." +
                        "                                        </span>\n" +
                        "                                    </td>\n" +
                        "                                </tr>\n<tr><td style=\"height: 30px;\"></td></tr>" +
                        "                            </table>\n" +
                        "                        </td>\n" +
                        "                    \n" +
                        "                </table>\n" +
                        "            </td>\n" +
                        "            <td style=\"width: 40px;\"></td>\n" +
                        "        </tr>\n" +
                        "    </table>",
                "<p></p>"
            );
            helper.setText(BODY, true);

            javaMailSender.send(message);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

}

String Body 부분에 원하는 html을 입력하여 줍니다.

 

결과물

 

반응형
저작자표시

'프로그래밍 일기 > Java & Spring' 카테고리의 다른 글

[Spring Boot] 파일 다운로드 로직 구현 feat.Nuxt3  (0) 2023.07.12
[Spring Boot] 단일, 다중 파일 업로드 로직 구현 feat.Nuxt3  (0) 2023.07.12
[Spring Boot] RestTemplate 사용법 서버 간 통신 getForEntity, postForEntity  (0) 2023.07.10
[Spring Boot] CORS 해결하기 Cross-Origin Resource Sharing 에러 OncePerRequestFilter  (0) 2023.07.10
카카오 로그인 API 사용 방법 nuxt3, spring boot  (2) 2023.07.10
'프로그래밍 일기/Java & Spring' 카테고리의 다른 글
  • [Spring Boot] 파일 다운로드 로직 구현 feat.Nuxt3
  • [Spring Boot] 단일, 다중 파일 업로드 로직 구현 feat.Nuxt3
  • [Spring Boot] RestTemplate 사용법 서버 간 통신 getForEntity, postForEntity
  • [Spring Boot] CORS 해결하기 Cross-Origin Resource Sharing 에러 OncePerRequestFilter
MakeMe
MakeMe
제가 포스팅한 글 중 잘못된 부분이 있으면 알려주세요!
  • MakeMe
    Developer blog
    MakeMe
    • 모든 글 (71)
      • 프로그래밍 일기 (57)
        • Java & Spring (21)
        • Python & Flask (3)
        • Linux (12)
        • Front-End (10)
        • DB & SQL (6)
        • Git (3)
        • IDE (2)
      • 자격증 (7)
        • 정보처리기능사 (2)
        • SQLD (1)
        • SW개발_L5 (1)
        • AWS (3)
      • 독립일기 (7)
        • 중소기업청년대출 (7)
  • 인기 글

  • 태그

    DB
    중기청필수서류
    AWS
    자바
    중소기업청년대출
    스프링
    psql
    flask 세팅
    중기청필요서류
    springboot
    건강보험자격득실확인서
    nuxt3
    넉스트
    중기청후기
    nuxt
    스프링부트
    Spring
    Vue
    MYSQL
    인텔리제이
    젠킨스 자동 배포
    젠킨스 우분투 설치
    자동배포설정
    중기청서류
    자바환경변수
    java
    flask
    DBeaver
    IntelliJ
    고용보험내역서
  • hELLO· Designed By정상우.v4.10.1
MakeMe
[Spring Boot] 이메일 발송 로직 구현, 인증번호 보내기
상단으로

티스토리툴바