슬랙(Slack) 클론 코딩을 진행하면서 이메일 인증 기능을 구현했다
mail.smtp.auth=true
mail.smtp.starttls.required=true
mail.smtp.starttls.enable=true
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback=false
mail.smtp.port=465
mail.smtp.socketFactory.port=465
#admin 구글 아이디 계정 id,password
AdminMail.id=[구글 계정]
AdminMail.password=[계정 비밀번호]
이때 먼저, gmail 계정 보안을 낮춰야 메일 전송이 가능하다
해당 링크에 들어가 설정하고 진행하자!
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;
@Configuration
@PropertySource("classpath:email.properties")
public class EmailConfig {
@Value("${mail.smtp.port}")
private int port;
@Value("${mail.smtp.socketFactory.port}")
private int socketPort;
@Value("${mail.smtp.auth}")
private boolean auth;
@Value("${mail.smtp.starttls.enable}")
private boolean starttls;
@Value("${mail.smtp.starttls.required}")
private boolean startlls_required;
@Value("${mail.smtp.socketFactory.fallback}")
private boolean fallback;
@Value("${AdminMail.id}")
private String id;
@Value("${AdminMail.password}")
private String password;
@Bean
public JavaMailSender javaMailService() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("smtp.gmail.com");
javaMailSender.setUsername(id);
javaMailSender.setPassword(password);
javaMailSender.setPort(port);
javaMailSender.setJavaMailProperties(getMailProperties());
javaMailSender.setDefaultEncoding("UTF-8");
return javaMailSender;
}
private Properties getMailProperties()
{
Properties pt = new Properties();
pt.put("mail.smtp.socketFactory.port", socketPort);
pt.put("mail.smtp.auth", auth);
pt.put("mail.smtp.starttls.enable", starttls);
pt.put("mail.smtp.starttls.required", startlls_required);
pt.put("mail.smtp.socketFactory.fallback",fallback);
pt.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
return pt;
}
}
@RequiredArgsConstructor
@RestController
public class EmailController {
private final EmailService emailService;
@PostMapping("/email") // 이메일 인증 코드 보내기
public ResponseDto<String> emailAuth(@RequestBody Map<String, String> email) throws Exception {
emailService.sendSimpleMessage(email.get("email"));
return new ResponseDto<>(true);
}
@PostMapping("/verifyCode") // 이메일 인증 코드 검증
public ResponseDto<?> verifyCode(@RequestBody Map<String, String> code) {
if(EmailService.ePw.equals(code.get("code"))) {
return new ResponseDto<>(true);
}
else{
return new ResponseDto<>(false);
}
}
}
@RequiredArgsConstructor
@Service
public class EmailService {
private final JavaMailSender emailSender;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public static final String ePw = createKey();
private MimeMessage createMessage(String to)throws Exception{
logger.info("보내는 대상 : "+ to);
logger.info("인증 번호 : " + ePw);
MimeMessage message = emailSender.createMimeMessage();
String code = createCode(ePw);
message.addRecipients(RecipientType.TO, to); //보내는 대상
message.setSubject("Slack 확인 코드: " + code); //제목
String msg="";
msg += "<img width=\"120\" height=\"36\" style=\"margin-top: 0; margin-right: 0; margin-bottom: 32px; margin-left: 0px; padding-right: 30px; padding-left: 30px;\" src=\"https://slack.com/x-a1607371436052/img/slack_logo_240.png\" alt=\"\" loading=\"lazy\">";
msg += "<h1 style=\"font-size: 30px; padding-right: 30px; padding-left: 30px;\">이메일 주소 확인</h1>";
msg += "<p style=\"font-size: 17px; padding-right: 30px; padding-left: 30px;\">아래 확인 코드를 Slack 가입 창이 있는 브라우저 창에 입력하세요.</p>";
msg += "<div style=\"padding-right: 30px; padding-left: 30px; margin: 32px 0 40px;\"><table style=\"border-collapse: collapse; border: 0; background-color: #F4F4F4; height: 70px; table-layout: fixed; word-wrap: break-word; border-radius: 6px;\"><tbody><tr><td style=\"text-align: center; vertical-align: middle; font-size: 30px;\">";
msg += code;
msg += "</td></tr></tbody></table></div>";
msg += "<a href=\"https://slack.com\" style=\"text-decoration: none; color: #434245;\" rel=\"noreferrer noopener\" target=\"_blank\">Slack Clone Technologies, Inc</a>";
message.setText(msg, "utf-8", "html"); //내용
message.setFrom(new InternetAddress("보내는 계정","slack-clone")); //보내는 사람
return message;
}
// 인증코드 만들기
public static String createKey() {
StringBuffer key = new StringBuffer();
Random rnd = new Random();
for (int i = 0; i < 6; i++) { // 인증코드 6자리
key.append((rnd.nextInt(10)));
}
return key.toString();
}
public void sendSimpleMessage(String to)throws Exception {
MimeMessage message = createMessage(to);
try{//예외처리
emailSender.send(message);
}catch(MailException es){
es.printStackTrace();
throw new IllegalArgumentException();
}
}
public String createCode(String ePw){
return ePw.substring(0, 3) + "-" + ePw.substring(3, 6);
}
}
실제 프로젝트 런칭할 계획이면, 인증키를 static이 아니라 DB에 저장해야 할 듯하다
이메일 인증 코드가 오는 것을 볼 수 있음!
도움 많이 받고 갑니다~!!