저번 포스팅에서 메시지 큐에 대해 알아보면서 메시지 큐가 어떤 경우에 쓰이는지 알아보던 중 메일을 보내는 로직에서 사용된다는 것을 알 수 있었다. 예전에 Hi Planner 프로젝트에서 회원 가입 시 입력한 이메일로 인증번호를 받아 본인 인증을 하는 로직을 구현했는데 복기한다는 생각과 동시에 포스팅을 해서 남겨놔야겠다는 마음이 들어서 이번 포스팅을 쓰게 되었다.
의존성 추가
Gradle
implementation 'org.springframework.boot:spring-boot-starter-mail'
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
가장 먼저 의존성을 추가해주도록 하자. 필자는 Gradle을 선호하는 편이기 때문에 Gradle을 사용하여 기능을 구현할 것이다. Gradle과 Maven 두 빌드 도구에 있는 의존성을 위에 첨부하였으니 사용하는 빌드 도구에 맞게 사용하면 될 것이다.
Google SMTP
좀 더 쉽게 구현하기 위해 Google SMTP를 사용할 것이다. 그래서 application.properties를 아래와 같이 설정해줄 것이다.
( Spring Boot에서 사용하면 JavaMailSender Bean을 생성할 필요없이 자동으로 생성된다고 한다. 그래서 properties에 설정만 해주면 된다고 한다. 블로그 주소 참조. )
spring.mail.host=smtp.gmail.com
spring.mail.port=465
spring.mail.username=[본인이 사용할 이메일]
spring.mail.password=[생성된 비밀번호]
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true
여기서 Google SMTP를 사용하기로 했으니 그에 맞게 smtp.gmail.com을 입력해준다.
Google SMTP는 465 또는 587 포트 번호를 사용할 수 있다고 한다. (필자는 587를 포트 번호로 입력했다.)
다음으로 본인의 Google 이메일을 입력해주면 된다.
그리고 다음 과정이 비밀번호를 입력하는 것인데 로그인할 때 사용하는 그 비밀번호를 입력하는 게 아니다.
아래의 과정을 따라하면 쉽게 비밀번호를 생성할 수 있을 것이다.
비밀번호 생성 과정
구글 계정에 로그인을 하고 google 계정 관리에 들어간다. 그러면 페이지가 이동되면서 사이드 바에 아래와 같이 나타날 것이다.
![](https://blog.kakaocdn.net/dn/cnJGz1/btrMdNHCylY/vp6HzvLwUUfeePvqKMPXp0/img.png)
그럼 형광펜으로 칠해진 '보안'으로 이동하면 중간에 Google에 로그인이라는 칸이 있고 거기에 보면 '앱 비밀번호'를 클릭하면 된다.
![](https://blog.kakaocdn.net/dn/dhHrU6/btrMdGWbkRP/O9ck8RJcAlKa8sQCBCy77k/img.png)
다음 페이지로 이동하게 되는데 본인 인증을 위해 비밀번호를 입력해달라고 하니 정확하게 비밀번호를 입력해주자!
![](https://blog.kakaocdn.net/dn/0V3fA/btrMec08XEU/TElVQZeduBchttt0es5GKk/img.png)
1) '앱 선택' → 메일
2) '기기 선택' → 본인이 사용할 기기를 선택 (필자는 Windows 컴퓨터를 선택)
3) ' 생성'을 누르면 앱 비밀번호 생성 중이라는 문구가 잠깐 뜬 뒤 생성된 비밀번호가 나타남.
4) 그 비밀번호를 복사해서 spirng.mail.password에 넣어주면 된다.
.gitignore
혹시 깃허브같은 원격 저장소에 코드를 Push할 일이 있다면 주의를 해야할 것이 있다. application.properties에는 Google 계정에 대한 정보가 들어있기 때문에 다른 사람에게 보여지는 게 좋은 일은 없다. 그래서 아래처럼 추가해주자.
src/main/resources/application.properties
Mail.html
간단하게 html로 View를 하나 만들었다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>메일 보내기</title>
</head>
<body>
<form method="post" action="/mail">
<input type="text" name="receiver" placeholder="받는 사람 입력"><br>
<input type="text" name="title" placeholder="제목"><br>
<textarea name= "content" cols="10" rows="10"></textarea><br>
<input type="submit" value="전송">
</form>
</body>
</html>
대단한 view를 만든 게 아니기 때문에 설명은 넘어가도록 하겠다. 그리고 입력받은 값을 저장할 VO 클래스를 만들었다.
MailVo.java
import lombok.Data;
@Data
public class MailVo {
private String receiver;
private String title;
private String content;
}
MailController.java
@Controller
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@GetMapping("/")
public String MailPage(){
return "Mail";
}
@PostMapping("/mail")
public void MailSend(MailVo mailVo){
mailService.CreateMail(mailVo);
}
}
MailService.java
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail= "gohwangbong@gmail.com";
public void CreateMail(MailVo mailVo){
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(mailVo.getReceiver());
message.setFrom(senderEmail);
message.setSubject(mailVo.getTitle());
message.setText(mailVo.getContent());
javaMailSender.send(message);
}
}
View를 통해서 Controller로 들어온 값을 가지고 Service 로직을 수행하면서 받는 사람에게 원하는 내용을 보낼 수 있게 되었다.
하지만 우리가 원하는 건 회원가입을 할 때처럼 인증번호가 오는 로직을 구현하려고 했기 때문에 좀 더 추가를 해서 원하는 기능을 완성하려고 한다.
View
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>이메일 인증 구현하기</title>
</head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
function sendNumber(){
$("#mail_number").css("display","block");
$.ajax({
url:"/mail",
type:"post",
dataType:"json",
data:{"mail" : $("#mail").val()},
success: function(data){
alert("인증번호 발송");
$("#Confirm").attr("value",data);
}
});
}
function confirmNumber(){
var number1 = $("#number").val();
var number2 = $("#Confirm").val();
if(number1 == number2){
alert("인증되었습니다.");
}else{
alert("번호가 다릅니다.");
}
}
</script>
<body>
<div id="mail_input" name="mail_input">
<input type="text" name="mail" id="mail" placeholder="이메일 입력">
<button type="button" id="sendBtn" name="sendBtn" onclick="sendNumber()">인증번호</button>
</div>
<br>
<div id="mail_number" name="mail_number" style="display: none">
<input type="text" name="number" id="number" placeholder="인증번호 입력">
<button type="button" name="confirmBtn" id="confirmBtn" onclick="confirmNumber()">이메일 인증</button>
</div>
<br>
<input type="text" id="Confirm" name="Confirm" style="display: none" value="">
</body>
</html>
MailController.java
package com.example.etc.Controller;
import com.example.etc.Service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@GetMapping("/")
public String MailPage(){
return "Main";
}
@ResponseBody
@PostMapping("/mail")
public String MailSend(String mail){
int number = mailService.sendMail(mail);
String num = "" + number;
return num;
}
}
MailService.java
package com.example.etc.Service;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail= "gohwangbong@gmail.com";
private static int number;
public static void createNumber(){
number = (int)(Math.random() * (90000)) + 100000;// (int) Math.random() * (최댓값-최소값+1) + 최소값
}
public MimeMessage CreateMail(String mail){
createNumber();
MimeMessage message = javaMailSender.createMimeMessage();
try {
message.setFrom(senderEmail);
message.setRecipients(MimeMessage.RecipientType.TO, mail);
message.setSubject("이메일 인증");
String body = "";
body += "<h3>" + "요청하신 인증 번호입니다." + "</h3>";
body += "<h1>" + number + "</h1>";
body += "<h3>" + "감사합니다." + "</h3>";
message.setText(body,"UTF-8", "html");
} catch (MessagingException e) {
e.printStackTrace();
}
return message;
}
public int sendMail(String mail){
MimeMessage message = CreateMail(mail);
javaMailSender.send(message);
return number;
}
}
회원가입하는 것처럼 다양한 정보를 입력해야하는 복잡한 View 대신에 이메일만 입력할 수 있는 View를 만들었다.
이메일을 입력하고 인증번호 버튼을 클릭하면 인증번호를 입력하는 칸이 나타나도록 했다.
그리고 입력한 이메일을 들어가보면 아래와 같이 메일이 온 것을 확인할 수 있다.
기능을 구현해보려고 했기 때문에 예쁘게 꾸미는 것같은 쓸데없는 코드는 생략하고 필자가 필요한 코드만 넣어서 구현해보았다.
이 포스팅에 모든 코드를 올려놓았지만 그 외에 다른 코드가 필요한 분을 위해 아래에 깃허브 링크를 같이 올려놓겠다.
GitHub - gwamsoju/Etc: 우당탕탕 이것저것 구현해보기
우당탕탕 이것저것 구현해보기. Contribute to gwamsoju/Etc development by creating an account on GitHub.
github.com
REFERENCE
Spring Boot - 이메일 전송(1)(JavaMailSender)
Spring Boot 이메일 전송 1. pom.xml 의존성 주입 org.springframework.boot spring-boot-starter-mail - JavaMailSender 등 클래스, 인터페이스를 사용하기 위함 2. resources 경로 밑에 mail/email.properties..
hanke-r.tistory.com
[SpringBoot] 이메일 전송 ( JavaMailSender, MimeMessageHelper )
이번 글에서는 MailSender 인터페이스를 상속받은 JavaMailSender를 사용하여 이메일 전송 시스템을 구현해보도록 하겠습니다. 전체 코드는 깃헙을 참고하시길 바랍니다. 개발환경 IntelliJ 2019.02 Java 11
victorydntmd.tistory.com
[SpringBoot] 구글 SMTP 통해 메일 보내기
개요 회원 가입 이후 이메일 인증을 한 사용자에게만 서비스 접근을 할 수 있도록 구현하고 싶어 찾아본 결과 구글에서 제공하는 SMTP 서비스를 통해 비교적 쉽게 구현할 수 있었습니다. 단, 구글
jaimemin.tistory.com
Spring boot 메일 보내기
[Spring Boot] send Mail (SMTP)
medium.com
![](https://t1.daumcdn.net/keditor/emoticon/friends2/large/050.png)
'기타' 카테고리의 다른 글
[Linux] 리눅스 명령어와 친구가 되어보자! ( 관리 명령어편 ) (1) | 2022.11.01 |
---|---|
메시지 큐(Message Queue)에 대해 알아보자! (1) | 2022.09.14 |
동기와 비동기의 차이(+ 블로킹과 논블로킹) (0) | 2022.07.22 |