๐ก ๋ชฉํ
ํ์๊ฐ์ ์์ ์ด๋ฉ์ผ ์ธ์ฆ์ ์ถ๊ฐ๋ก ๋ฐ์ ์ค๋ณต๋ฐฉ์ง ๋ฐ ๋ณด์์ฑ ๊ฐํ๋ฅผ ๋ชฉ์ ์ผ๋ก ๋์๋ค.
build.gradle
// Google Email
implementation 'org.springframework.boot:spring-boot-starter-mail'
์์กด์ฑ ์ฃผ์ ์ ํด์ค๋ค.
EmailConfig
@Slf4j
@Configuration
@RequiredArgsConstructor
public class EmailConfig {
private final JavaMailSender javaMailSender;
private final String SUBJECT = "[์นํ์] ์ธ์ฆ๋ฉ์ผ ์
๋๋ค.";
public boolean sendCertificationMain(String email, String certificationNumber) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
String htmlContent = getCertificationMessage(certificationNumber);
messageHelper.setTo(email);
messageHelper.setSubject(SUBJECT);
messageHelper.setText(htmlContent, true);
javaMailSender.send(message);
log.info("์ด๋ฉ์ผ ๋ฐ์ ์ฑ๊ณต : {}", email);
} catch (Exception e) {
log.error("์ด๋ฉ์ผ ๋ฐ์ ์คํจ : {}", email, e);
return false;
}
return true;
}
private String getCertificationMessage (String certificationNumber) {
String certificationMessage = "";
certificationMessage += "<div style='text-align: center;'><img src=\"https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVbXC4%2FbtsKePF4r6K%2FHdV3AU33uDf8khBSMLMLU0%2Fimg.png\"></div>";
certificationMessage += "<h1 style='text-align: center;'>[์นํ์] ์ธ์ฆ๋ฉ์ผ</h1>";
certificationMessage += "<h3 style='text-align: center;'>์ธ์ฆ์ฝ๋: <string style='font-size:32px; letter-spacing: 8px;'>"
+ certificationNumber + "</strong></h3>";
return certificationMessage;
}
}
์ด๋ฉ์ผ์ ์ ์กํ๋ ๋ฉ์๋์ด๋ค.
getCertificationMessage ๋ฉ์๋๋ฅผ ํตํด์ ์ํ๋ ํํ๋ก ๋ฉ์ผ์ ๋ง๋ค๊ณ , SUBJECT ์ ๋ชฉ๊ณผ ํจ๊ป ๋ฉ์ผ์ ์ ์กํ๋ค.
EmailCertificationController
@RestController
@RequiredArgsConstructor
public class EmailCertificationController {
private final EmailCertificationService emailCertificationService;
@PostMapping("/v2/auth/email-certification")
public ResponseEntity<CommonResponse<String>> emailCertification(
@RequestBody @Valid
EmailCertificationRequestDto requestDto
) {
return ResponseEntity.ok(CommonResponse.success(emailCertificationService.emailCertification(requestDto)));
}
}
EmailCertificationRequestDto
@Getter
@NoArgsConstructor
public class EmailCertificationRequestDto {
@Email
@NotBlank
private String email;
}
์ด๋ฉ์ผ์ Dto ์ ๋ด์์ ์ธ์ฆ๋ฒํธ๋ฅผ ๋ ๋ ค์ผํ๊ธฐ ๋๋ฌธ์ email ํ๋๋ง ๋ด์๋ค.
EmailCertificationService
@Service
@RequiredArgsConstructor
public class EmailCertificationService {
private final EmailConfig emailConfig;
private final UserService userService;
public String emailCertification(EmailCertificationRequestDto requestDto) {
// ์
๋ ฅํ ์ด๋ฉ์ผ๋ก ์ค๋ณต ์ ๋ฌด ํ์ธ
String email = requestDto.getEmail();
boolean isExisted = userService.existsByEmail(email);
if(isExisted) throw new DuplicateEmailException();
// 4์๋ฆฌ ์ธ์ฆ๋ฒํธ ์์ฑ
String certificationNumber = getCertificationNumber();
// ์ด๋ฉ์ผ ๋ฐ์ ์ฑ๊ณต ์ฌ๋ถ ํ์ธ
boolean isSuccessed = emailConfig.sendCertificationMain(email, certificationNumber);
// ์คํจ์ ์์ธ์ฒ๋ฆฌ
if (!isSuccessed) throw new BusinessLogicException();
return "์ด๋ฉ์ผ์ด ์ ์์ ์ผ๋ก ์ ์ก๋์์ต๋๋ค.";
}
// 4์๋ฆฌ ์ธ์ฆ๋ฒํธ ์์ฑ ๋ฉ์๋
public static String getCertificationNumber() {
String certificationNumber = "";
for (int count = 0; count < 4; count++) {
certificationNumber += (int) (Math.random() * 10);
}
return certificationNumber;
}
}
๊ธฐ์กด ์ด๋ฉ์ผ๊ณผ ์ค๋ณต์ธ์ง ํ์ธํ๊ณ , ์ค๋ณต๊ฒ์ฌ์์ ํต๊ณผํ๋ค๋ฉด 4์๋ฆฌ ์ธ์ฆ๋ฒํธ๋ฅผ ๋๋ค์ผ๋ก ์์ฑํด์ ๋ฉ์ผ์ ์ ์ก์์ผฐ๋ค.
๐ก ํธ๋ฌ๋ธ ์ํ
TLS ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
"Could not convert socket to TLS" ์ค๋ฅ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ SSL/TLS ํธ๋์ ฐ์ดํฌ ์คํจ๋ก ์ธํด ๋ฐ์ํ๋ค.
์ฃผ๋ก ์๋ชป๋ ์ธ์ฆ์ ์ค์ ์ด๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ฌธ์ ๊ฐ ์์ธ์ด๋ค.
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
ssl:
trust: smtp.gmail.com
starttls : required : true
ssl: truest ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํด๊ฒฐ์ด ๋์๋ค.
- starttls.required=true:
- ์ด ์ค์ ์ SMTP ์๋ฒ์์ ํต์ ์ TLS๊ฐ ๋ฐ๋์ ํ์ํจ์ ์ง์ ํ๋ค.
- ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฐ๋์ ์ํธํ๋ ํต์ ์ ํ๋๋ก ๊ฐ์ ํด, TLS ํธ๋์ ฐ์ดํฌ ์คํจ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- ssl.trust=smtp.gmail.com:
- ์ด ์ค์ ์ Gmail์ SMTP ์๋ฒ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๋๋ก ์ง์ ํ๋ค.
- Gmail ์๋ฒ์์ ์ฐ๊ฒฐ์์ ์ธ์ฆ์ ์ ๋ขฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ, ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ Gmail์ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ๊ฒ ๋์ด TLS ์ค์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
๋ค์ ๊ธ