[스프링부트] 이메일 발송 및 이메일 인증

최경현·2023년 12월 25일
0

먼저 application.yml에 google메일을 사용하기 위한 코드를 작성

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: 발송할 자신의 실제 or 가계정 이메일
    password: NEED_TO_INPUT_ON_SECRET
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

그리고 보안을 위해 application-secret.yml에 코드 작성

spring:
  mail:
    password: 자신이 받은 웹 비밀번호

application-secret.yml.default 파일에도 보안을 위해 코드작성

spring:
  mail:
    password: NEED_TO_INPUT

회원가입 시 이메일을 보내기 위함 or 인증하기 위함 emailService구문을 작성

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class EmailService {
    private final JavaMailSender mailSender;
    private static final String senderEmail = "gusrudchl12@gmail.com";
    private static int number;
// 랜덤 발송 번호를 보내기 위한 구문
    public static void createNumber(){
        //(int) Math.random() * (최댓값-최소값+1) + 최소값
        number = (int)(Math.random() * (90000)) + 10000;
    }
// 이메일 인증을 하기 위한 createEmail 구문
    public MimeMessage createEmail(String email){
        createNumber();
        MimeMessage message = mailSender.createMimeMessage();

        try {
            message.setFrom(senderEmail);
            message.setRecipients(MimeMessage.RecipientType.TO, email);
            message.setSubject("이메일 인증");
            String body = "";
            body += "<h3>" + "요청하신 인증 번호입니다." + "</h3>";
            body += "<h1>" + number + "</h1>";
            body += "<h3>" + "감사합니다." + "</h3>";
            message.setText(body,"UTF-8", "html");
        } catch (MessagingException e){
            throw new RuntimeException(e);
        }
        return message;
    }

    public int sendEmail(String email){
        MimeMessage message = createEmail(email);
        mailSender.send(message);

        return number;
    }
// 회원가입 완료 시 가입 이메일을 보내기 위한 send구문
    public void send(String to, String subject, String body) {

        MimeMessage mimeMessage = mailSender.createMimeMessage();

        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, "UTF-8");
            mimeMessageHelper.setTo(to); // 메일 수신자
            mimeMessageHelper.setSubject(subject); // 메일 제목
            mimeMessageHelper.setText(body, true); // 메일 본문 내용, HTML 여부
            mailSender.send(mimeMessage); // 메일발송
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

회원가입이 완료되면 이메일을 보내기 위한 코드를 작성

[다른controller에 작성하였음, 프로젝트 진행 중에 하였음.]

 emailService.send(memberForm.getEmail(), "서비스 가입을 환영합니다!", "회원가입 환영 메일");

이렇게 되면 회원가입 후 이메일 작성한 곳으로 회원가입 완료되었다는 메일 전송 완료

그다음 이메일 인증을 하기위한

controller에 코드를 작성

@Controller
@RequiredArgsConstructor
public class EmailController {

    private final EmailService emailService;

    @ResponseBody
    @RequestMapping(value = "/email")
    public String emailSend(@RequestParam("email") String email){
        int number = emailService.sendEmail(email);

        String num = "" + number;

        return num;
    }
}

이메일 인증을 위해 ajax와 오류 방지를 위한 csrf를 이용하여 스크립트를 작성

혹시모르니 config구문에도 권한을 허가해 주기 위한
.requestMatchers("/email/**").permitAll() 구문 작성

작성 후 html 이메일 발송을 위한 코드 작성

<div class="relative mb-5">
            <label for="email" class="block mb-2 text-sm font-medium text-gray-900">이메일
            </label>
            <input type="email" id="email" name="email" th:field="*{email}"
                   class="absolute shadow-sm bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5"
                   required>
            <button type="button" id="sendBtn" name="sendBtn" onclick="sendNumber()" class="relative left-full text-white top-0.5 bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
                focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2">
                인증 요청
            </button>
            <div id="email_number" name="email_number" class="mt-8">
                <input type="text" name="number" id="number" placeholder="인증번호 입력"
                       class="absolute shadow-sm bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5">
                <button type="button" name="confirmBtn" id="confirmBtn" onclick="confirmNumber()" class="relative left-full text-white top-0.5 bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none
                focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2">이메일 인증
                </button>
            </div>
        </div>
profile
ㅇㅇ

0개의 댓글