Spring_네이버 메일 인증

2022. 12. 28. 16:54Spring

728x90

1. naver 이메일 설정

네이버 메일 → 환경설정 → POP3/IMAP 설정 - POP3/SMTP 사용 사용함 설정

 

2. Spring

- mailConfig

package com.ssafy.backend.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

@Configuration
public class MailConfig {
    // env 파일에 저장된 값 사용
    @Value("${mail.host}")
    private String mailHost;
    @Value("${mail.username}")
    private String mailUsername;
    @Value("${mail.userpassword}")
    private String mailUserpassword;
    @Value("${mail.port}")
    private int mailPort;

    @Bean
    public JavaMailSender javaMailService(){
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost(mailHost);
        javaMailSender.setUsername(mailUsername);
        javaMailSender.setPassword(mailUserpassword);
        javaMailSender.setPort(mailPort);

        javaMailSender.setJavaMailProperties(getMailProperties());

        return javaMailSender;
    }

    private Properties getMailProperties(){
        Properties properties = new Properties();

        properties.setProperty("mail.transport.protocol", "smtp"); // 프로토콜 설정
        properties.setProperty("mail.smtp.starttls.enable", "true"); // smtp strattles 사용
        properties.setProperty("mail.debug", "true"); // 디버그 사용
        properties.setProperty("mail.smtp.auth", "true"); // smtp 인증
        properties.setProperty("mail.smtp.ssl.enable","true"); // ssl 사용
        properties.setProperty("mail.smtp.ssl.trust", mailHost); // ssl 인증 서버는 smtp.naver.com

        return properties;
    }
}

- MailController

package com.ssafy.backend.controller;

import com.ssafy.backend.dto.MailDto;
import com.ssafy.backend.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/api/v1")
public class MailController {

    @Autowired
    private MailService mailService;

    @GetMapping("/mailsend")
    public ResponseEntity<?> signup(
            @Valid @RequestBody MailDto mailDto
    ) throws Exception {
        String code = mailService.sendSimpleMessage(mailDto.getEmail());
        System.out.println("인증코드 : " + code);
        return ResponseEntity.ok(code);
    }
}

- MailService

package com.ssafy.backend.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Random;

@Service
public class MailService{
    @Autowired
    JavaMailSender emailsender; // Bean 등록해둔 MailConfig 를 emailsender 라는 이름으로 autowired

    @Value("${mail.useremail}")
    private String mailEmail;
    @Value("${mail.username}")
    private String mailName;

    private String ePw; // 인증번호

    // 메일 내용 작성
    public MimeMessage createMessage(String to) throws MessagingException, UnsupportedEncodingException {
        MimeMessage message = emailsender.createMimeMessage();

        message.addRecipients(MimeMessage.RecipientType.TO, to);// 보내는 대상
        message.setSubject("회원가입 이메일 인증");// 제목

        StringBuilder msgg = new StringBuilder();
        msgg.append("<div style='margin:100px;'>");
        msgg.append("<h1>ttt 회원가입 인증 메일</h1>");
        msgg.append("<div>");
        msgg.append("Code : ").append(ePw);
        msgg.append("</div>");
        msgg.append("</div>");

        message.setText(msgg.toString(), "utf-8", "html");// 내용, charset 타입, subtype
        // 보내는 사람의 이메일 주소, 보내는 사람 이름
        message.setFrom(new InternetAddress(mailEmail, mailName));// 보내는 사람

        return message;
    }

    // 랜덤 인증 코드 전송
    public String createKey() {
        StringBuffer key = new StringBuffer();
        Random rnd = new Random();

        for (int i = 0; i < 8; i++) { // 인증코드 8자리
            int index = rnd.nextInt(3); // 0~2 까지 랜덤, rnd 값에 따라서 아래 switch 문이 실행됨

            switch (index) {
                case 0:
                    key.append((char) ((int) (rnd.nextInt(26)) + 97));
                    // a~z (ex. 1+97=98 => (char)98 = 'b')
                    break;
                case 1:
                    key.append((char) ((int) (rnd.nextInt(26)) + 65));
                    // A~Z
                    break;
                case 2:
                    key.append((rnd.nextInt(10)));
                    // 0~9
                    break;
            }
        }

        return key.toString();
    }

    // 메일 발송
    // sendSimpleMessage 의 매개변수로 들어온 to 는 곧 이메일 주소가 되고,
    // MimeMessage 객체 안에 내가 전송할 메일의 내용을 담는다.
    // 그리고 bean 으로 등록해둔 javaMail 객체를 사용해서 이메일 send!!
    public String sendSimpleMessage(String to) throws Exception {

        ePw = createKey(); // 랜덤 인증번호 생성

        MimeMessage message = createMessage(to); // 메일 발송
        try {// 예외처리
            emailsender.send(message);
        } catch (MailException es) {
            es.printStackTrace();
            throw new IllegalArgumentException();
        }

        return ePw; // 메일로 보냈던 인증 코드를 서버로 반환
    }
}

- env.properties

# mail
mail.host = smtp.naver.com
mail.username = 아이디
mail.userpassword= 비밀번호
mail.port= 465
mail.useremail = 이메일

'Spring' 카테고리의 다른 글

Spring_MySQL 연결_gradle  (0) 2023.03.22
Spring_tinyLog  (0) 2023.03.09
Spring_JPA_페이지네이션  (0) 2022.12.28
Spring_env 파일 설정  (0) 2022.12.28
Spring_stomp  (0) 2022.12.28