본문 바로가기

Spring

javaMailSender를 이용한 이메일 인증(Naver)

728x90

1.Naver SMTP 설정

네이버 메일 -> 환경설정 -> SMTP 설정을 사용함으로 바꿔줍니다.

2.Build.gradle 설정

implementation 'org.springframework.boot:spring-boot-starter-mail'

 

3.NaverMail.yml 설정

spring:  
  mail:
    host: smtp.naver.com #smtp 서버 주소
    port: 465 # 메일 인증서버 포트
    username: xxxx@naver.com #네이버 아이디
    password: xxxx #네이버 비밀번호
    properties:
      mail:
        smtp:
          starttls:
            enable: true
          auth: true
          ssl:
            enable: true

yml에 JavaMailSender에 쓰일 Properties를 선언해줍니다.

4.EmailDto

@NoArgsConstructor
@AllArgsConstructor
@Getter
public class EmailDto {
    @Email(message = "이메일 형식이 아닙니다")
    @NotBlank(message = "이메일을 입력해주세요")
    private String email;
}

 

5.EmailController

@RestController
@RequiredArgsConstructor
public class EmailController {

    private final EmailService emailService;

    @PostMapping("/api/email")
    public void emailCertification(@Valid @RequestBody EmailDto emailDto){
        emailService.sendEmail(emailDto);
    }

}

6.EmailService

@Service
@RequiredArgsConstructor
public class EmailService {

    private final JavaMailSender mailSender;

    private final SpringTemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String fromEmail;
    private static final String title = "인증 코드 발송";

    public void sendEmail(EmailDto emailDto) {
        try{
            MimeMessage message = createMail(emailDto.getEmail());
            mailSender.send(message);
        }catch (MessagingException | MailSendException ex){
            throw new CustomException(ErrorCode.SEND_EMAIL_ERROR);
        }
    }

    private MimeMessage createMail(String email) throws MessagingException {
        String code = createCode();

        MimeMessage message = mailSender.createMimeMessage();
        message.addRecipients(RecipientType.TO, email); //보낼 이메일 설정
        message.setSubject(title); // 제목 설정
        message.setFrom(fromEmail); // 보내는 이메일 , yml에 설정한 email과 같아야함
//        message.setText("이메일 인증 코드:" + code); // 단순 텍스트
        message.setText(setContext(code),"utf-8","html"); // html

        return message;
    }

    private String createCode() { // 랜덤한 영어 +숫자 10자리
        StringBuffer buffer = new StringBuffer();
        Random random  = new Random();

        for(int i=0; i<10;i++){
            if(random.nextBoolean()){
                buffer.append((char)(random.nextInt(26)+65));
            }else{
                buffer.append(random.nextInt(10));
            }
        }

        return buffer.toString();
    }

    public String setContext(String code){ // thymeleaf를 이용한 context 설정
        Context context = new Context();
        context.setVariable("code",code);
        return templateEngine.process("email",context); // email.html
    }
}

createCode():인증번호를 발송 할 랜덤한 영어+ 숫자 10자리를 만드는 메소드

createMail(): 인증번호를 보낼 이메일을 받아 보내는 이메일의 구체적인 제목이나 내용등을 정해 이메일을 만드는 메소드

sendEmail(): Controller에서 email을 받아 이메일을 만들고 보내는 메소드

SetContext():thymeleaf를 이용한 context 설정 메소드

7.email.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">

<body>
<div style="margin:100px;">
    <br>
    <p> 아래 코드를 회원가입 창으로 돌아가 입력해주세요.</p>
    <br>

    <div align="center" style="border:1px solid black;">
        <h3 style="color:blue"> 회원가입 인증 코드 입니다. </h3>
        <div style="font-size:130%" th:text="${code}"> </div>
    </div>
    <br/>
</div>
</body>
</html>

 

728x90

'Spring' 카테고리의 다른 글

프로메테우스 설치 및 사용법  (1) 2023.11.07
Actuator  (0) 2023.11.03
Querydsl 페이징과 카운터쿼리 최적화  (0) 2023.04.27
Querydsl 동적 쿼리  (0) 2023.04.26
Querydsl 프로젝션 결과 반환  (0) 2023.04.26