[Project] gmail SMTP 로 이메일 전송기능 구현 및 5.7.8 에러

Updated:

Categories:

Tags: ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]


Gmail 설정

  1. 보안 → 2단계 인증 설정하기
  2. 앱 비밀번호 설정
  3. Gmail 설정 > 전달 및 POP/IMAP > 변경사항 저장
    • POP 다운로드
    • IMAP 엑세스 사용

의존성 및 yml 파일 설정

build.gradle

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

application.yml

  1. host : SMTP 서버 호스트
  2. port : SMTP 서버 포트
  3. username : gmail 주소 (e.g : abc@gmail.com)
  4. password : 위에서 설정한 앱 비밀번호 16자리
  5. auth : 사용자 인증 시도 여부, 기 본 값은 false 이다.
  6. Socket Read Timeout 시간(ms) : (기본값 : 무한대)
  7. StartTLS 활성화 여부 (기본값 : false)

mail package

email 관련 패키지 생성

EmailMessage.java

  • 이메일 전송을 위한 메시지 정보를 캡슐화하는 간단한 데이터 모델
  • 이메일 전송 기능을 구현할 때 EmailMessage 클래스를 사용하여 이메일의 수신자, 제목, 내용 등을 쉽게 전달할 수 있다.
1
2
3
4
5
6
7
8
@Data
@Builder
public class EmailMessage {
    private String to;
    private String subject;
    private String message;
}

수신자와 제목, 메세지를 지정한다.

EmailPostDto

1
2
3
4
@Getter
public class EmailPostDto {
    private String email;
}

EmailService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@Slf4j
@Service
public class EmailService {
    private final JavaMailSender javaMailSender;
    private final SpringTemplateEngine templateEngine;

    public EmailService(JavaMailSender javaMailSender, SpringTemplateEngine templateEngine) {
        this.javaMailSender = javaMailSender;
        this.templateEngine = templateEngine;

    }

    public String sendMail(EmailMessage emailMessage, String type) {
        String authNumber = createCode();
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //MimeMessage 생성

        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,false,"UTF-8");
            mimeMessageHelper.setTo(emailMessage.getTo());
            mimeMessageHelper.setSubject(emailMessage.getSubject());
            mimeMessageHelper.setText(setContext(authNumber,type), true);
            javaMailSender.send(mimeMessage);
            //이메일 전송
            
            log.info("Success");

            return authNumber;

        } catch (MessagingException e) {
            log.info("fail");
            throw new RuntimeException(e);
        }
    }

    // 이메일 인증코드 생성
    public String createCode() {
        Random random = new Random();
        StringBuffer key = new StringBuffer();
        for (int i = 0; i < 8; i++) {
            int index = random.nextInt(3);

            switch (index) {
                case 0:
                    key.append((char) (random.nextInt(26) + 'a'));
                    break;
                case 1:
                    key.append((char) (random.nextInt(26) + 'A'));
                    break;
                case 2:
                    key.append(random.nextInt(10)); // 0부터 9까지
                    break;
            }
        }
        return key.toString();
    }

    public String setContext(String code, String type) {
        Context context = new Context();
        context.setVariable("code", code);
        return templateEngine.process(type, context);
    }
}

  1. 생성자 주입
    • JavaMailSender : 이메일 전송을 위한 Spring의 JavaMailSender 객체
    • SpringTemplateEngine : : 이메일 본문을 생성하기 위해 Thymeleaf 템플릿 엔진 사용
  2. sendMail 메서드
    • EmailMessage : 위에서 만든 데이터 객체
    • MimeMessage 생성: MimeMessageHelper를 사용하여 이메일 수신자, 제목, 그리고 본문 내용을 설정
    • javaMailSender.send(mimeMessage)로 이메일을 전송
    • 예외 처리 : 이메일 전송이 실패할 경우 예외를 발생시키고, 로그를 남긴다.
  3. createCode 메서드
    • 소문자, 숫자, 대문자를 포함한 8자리의 랜덤 코드 생성
  4. setContext 메서드
    • Context 객체에 인증 코드를 변수로 설정하고, 이를 기반으로 Thymeleaf 템플릿을 처리하여 이메일 본문을 생성
    • type 인자는 사용될 템플릿 파일을 지정


EmailController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.springboot.helper.email;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/send-mail")
@RestController
public class EmailController {
    private final EmailService emailService;

    public EmailController(EmailService emailService) {
        this.emailService = emailService;
    }

    //회원가입 이메일 인증코드 발송
    @PostMapping("/email")
    public ResponseEntity sendJoinMail(@RequestBody EmailPostDto emailPostDto) {
        EmailMessage emailMessage = EmailMessage.builder()
                .to(emailPostDto.getEmail())
                .subject("[MeetBTI] 회원가입을 위한 인증코드 발송")
                .build();

        emailService.sendMail(emailMessage,"email");
        String message = "인증코드가 이메일로 발송되었습니다.";
        return new ResponseEntity<>(message, HttpStatus.OK);
    }
}

5.7.8 Username and Password not accept 발생

이거 다 했는데 자꾸 username 이랑 password가 일치 하지 않는다는 에러가 자꾸 발생했다.

혹시 내가 생각한 Useraname이랑 Password가 잘못되었나 생각했는데

https://www.gmass.co/smtp-test 여기서 테스트 해 볼 수 있다고 해서 해봤더니 잘만 도착한다…

  1. Email Configuration 생성

    아무리 구글링해도 나오지 않고 2단계 인증 또는 앱비밀번호로 하라는 글밖에 없어서 한참 헤매다가 Email Configuration 클래스 만들어서 한번 더 명시해줬다.

  2. 환경변수로 설정

    • InteliJ에 올렸엇는는데 시스템 환경변수에 새로 만들어주고

    • 이름도 @Value변경해서 올렸더니 해결되었다.

이렇게 한 다음 localhost:8080/send-mail/email 의 주소와 Body에 email주소를 담아 Post 요청하면 메일이 잘 도착한다.!!!!!

Project 카테고리 내 다른 글 보러가기

Leave a comment