[Project] gmail SMTP 로 이메일 전송기능 구현 및 5.7.8 에러
Categories: Project
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
Gmail 설정
- 보안 → 2단계 인증 설정하기
- 앱 비밀번호 설정
- Gmail 설정 > 전달 및 POP/IMAP > 변경사항 저장
- POP 다운로드
- IMAP 엑세스 사용
의존성 및 yml 파일 설정
build.gradle
1
implementation 'org.springframework.boot:spring-boot-starter-mail
application.yml
- host : SMTP 서버 호스트
- port : SMTP 서버 포트
- username : gmail 주소 (e.g : abc@gmail.com)
- password : 위에서 설정한 앱 비밀번호 16자리
- auth : 사용자 인증 시도 여부, 기 본 값은 false 이다.
- Socket Read Timeout 시간(ms) : (기본값 : 무한대)
- 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);
}
}
- 생성자 주입
- JavaMailSender : 이메일 전송을 위한 Spring의 JavaMailSender 객체
- SpringTemplateEngine : : 이메일 본문을 생성하기 위해 Thymeleaf 템플릿 엔진 사용
- sendMail 메서드
- EmailMessage : 위에서 만든 데이터 객체
- MimeMessage 생성:
MimeMessageHelper
를 사용하여 이메일 수신자, 제목, 그리고 본문 내용을 설정 javaMailSender.send(mimeMessage)
로 이메일을 전송- 예외 처리 : 이메일 전송이 실패할 경우 예외를 발생시키고, 로그를 남긴다.
- createCode 메서드
- 소문자, 숫자, 대문자를 포함한 8자리의 랜덤 코드 생성
- 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 여기서 테스트 해 볼 수 있다고 해서 해봤더니 잘만 도착한다…
-
Email Configuration 생성
아무리 구글링해도 나오지 않고 2단계 인증 또는 앱비밀번호로 하라는 글밖에 없어서 한참 헤매다가 Email Configuration 클래스 만들어서 한번 더 명시해줬다.
-
환경변수로 설정
-
InteliJ에 올렸엇는는데 시스템 환경변수에 새로 만들어주고
-
이름도 @Value변경해서 올렸더니 해결되었다.
-
이렇게 한 다음 localhost:8080/send-mail/email 의 주소와 Body에 email주소를 담아 Post 요청하면 메일이 잘 도착한다.!!!!!
Leave a comment