JAVA MailSender를 활용해서 이메일 인증만들기 - 2
두번째 게시글 입니다.
이전글보기
1. 중복체크
먼저 중복 체크부터 컨트롤러부터 보자. 이메일을 파라미터로 받아서 서비스에게 넘겨준다.
1.1 컨트롤러
@Controller
@RequestMapping("member")
public class MemberController {
@Autowired
private MemberService service;
@GetMapping("checkEmail/{useremail}")
@ResponseBody
public Map<String, Object> checkemail(@PathVariable("useremail") String useremail) {
return service.checkEmail(useremail);
}
}1.2 서비스
서비스는 mapper에게 useremail을 넘겨주고 해당 이메일이 있는지 체크하고 member객체를 반환한다.
만약 있다면 Map객체에 available이라는 키로 membmer객체가 있는지 여부를 value로 반환한다.
이 것을 활용해서 view단에서 data.avaiable해서 true인지 false인지를 확인하고 중복 체크를 하는 것이다.
매퍼는 간단한 select구문이니 넘어가겠다.
@Service
public class MemberService {
@Autowired
private MemberMapper mapper;
public Map<String, Object> checkEmail(String useremail) {
Members member = mapper.selectEmail(useremail);
return Map.of("available", member == null);
}
}2. 메일인증
2.1 컨트롤러
같은 컨트롤러에서 진행한다.
메일 체크를 보내기 위해 MailService 서비스 클래스를 만들어 줄 것이니 일단 주입해준다.
ajax로부터 email를 파라미터로 받고 MailService객체의 sendEmail메소드를 통해서 메일을 보낸다.
이때 반환받을 값은 인증번호이다.
@Controller
@RequestMapping("member")
public class MemberController {
@Autowired
private MemberService service;
@Autowired
private MailService mailService;
@PostMapping("/mailCheck")
@ResponseBody
String mailConfirm(@RequestParam("email") String email) {
String authCode = null;
try {
authCode = mailService.sendEmail(email);
} catch (Exception e) {
e.printStackTrace();
}
return authCode;
}
}2.2 서비스 인터페이스
다른 메세지 객체를 사용할 수 있어서 인터페이스와 구현객체를 나누었다.
필요한 메소드는 메일작성하는 메소드, 인증번호 생성메소드, 메일보내는 메소드이다.
public interface MailService {
String sendEmail(String email) throws Exception;
MimeMessage createEmail(String email);
String createKey();
}2.3 서비스 구현객체
필드로는 반환받은 인증코드를 저장할 authCode가 필요하고
메일을 보내기 위한 JavaMailSender객체가 필요하다.
코드를 하나씩 알아보자.
@Service
@RequiredArgsConstructor
public class MailServiceImpl implements MailService {
private final JavaMailSender emailSender;
private String authCode;
// 랜덤 인증 코드 전송
public String createKey() {
Random random = new Random();
int randomNumber = random.nextInt(90) + 10; // 10 이상 99 이하의 랜덤 숫자 생성
return String.valueOf(randomNumber);
}
public MimeMessage createEmail(String email) throws MessagingException, UnsupportedEncodingException {
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setTo(email);
helper.setSubject("회원가입 이메일 인증");
String msg = "<h1>안녕하세요</h1>\n" + "<p>\n" + "NiceToMeatYou입니다.\n" + "<br />\n" + "다음은 인증번호입니다.\n" + "</p>\n"
+ "<div style='font-size: 130%'>\n" + "CODE : <strong>" + authCode + "</strong>\n" + "</div>";
helper.setText(msg, true);
helper.setFrom(new InternetAddress("메일 주소", "관리자"));
return message;
}
// 메일 발송
// send 의 매개변수로 들어온 email 는 곧 이메일 주소가 되고,
// MimeMessage 객체 안에 내가 전송할 메일의 내용을 담는다.
// 그리고 bean 으로 등록해둔 javaMail 객체를 사용해서 이메일 send!!
@Override
public String sendEmail(String email) throws Exception {
authCode = createKey(); // 랜덤 인증번호 생성
MimeMessage message = createEmail(email); // 메일 발송
try {// 예외처리
// 메일보내기
emailSender.send(message);
} catch (MailException e) {
e.printStackTrace();
throw new IllegalArgumentException();
}
return authCode; // 메일로 보냈던 인증 코드를 서버로 반환
}
}2.3.1 인증번호 생성
매우 단순한 코드이다. Random객체를 이용해서 10~99의 숫자를 랜덤하게 생성한다.
반환하고자 하는 autoCode는 String이기때문에 String.valueOf()메소드를 사용해서 문자로 반환하고 있다.
여기서는 단순하게 2자리 숫자이지만 알아서 더 복잡하게 생성하면 복잡한 문자가 될 것이다.
// 랜덤 인증 코드 전송
public String createKey() {
Random random = new Random();
int randomNumber = random.nextInt(90) + 10; // 10 이상 99 이하의 랜덤 숫자 생성
return String.valueOf(randomNumber);
}2.3.2 MimeMessage객체 생성
MimeMessage는 자바에서 이메일을 생성하고 조작하기 위해 사용되는 클래스이다.
이 클래스는 javax.mail 패키지에 속해 있으며, JavaMail API를 사용하여 이메일을 작성하고 전송하는 데 사용된다.
MimeMessage는 이메일의 표준 형식인 MIME(Multipurpose Internet Mail Extensions) 형식을 따른다.
MIME은 이메일 메시지에 텍스트, HTML, 첨부 파일 등 다양한 형식의 데이터를 포함할 수 있도록 한다.
MimeMessage 객체를 생성하려면 JavaMail API를 먼저 설정해야 한다.
이전에 추가한 javamailsender api가 이 MimeMessage객체를 설정할수 있게 해준다.
MimeMessageHelper는 Spring Framework에서 제공하는 유틸리티 클래스로, MimeMessage를 보다 쉽게 생성하고 조작할 수 있도록 도와준다.
MimeMessageHelper는 JavaMail의 MimeMessage를 래핑하고 일반적인 작업을 간소화하는 메서드를 제공한다.
public MimeMessage createEmail(String email) throws MessagingException, UnsupportedEncodingException {
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setTo(email);
helper.setSubject("회원가입 이메일 인증");
String msg = "<h1>안녕하세요</h1>\n" + "<p>\n" + "관리자입니다.\n" + "<br />\n" + "다음은 인증번호입니다.\n" + "</p>\n"
+ "<div style='font-size: 130%'>\n" + "CODE : <strong>" + authCode + "</strong>\n" + "</div>";
helper.setText(msg, true);
helper.setFrom(new InternetAddress("메일 주소", "관리자"));
return message;
}setTo은 누구에게 보낼것인지를 의미한다. 여기서는 파라미터로 받아온 email이 파라미터로 들어간다.
setSubject은 제목을 어떤식으로 할것인지를 정한다.
setText은 어떤 메시지를 어떤 형식으로 보낼 것인지를 정한다. true라면 HTML로 인식해서 보내지고 false면 간단한 텍스트 형식으로 전달되게 된다.
setFrom은 이메일의 발신자 주소를 설정하는 부분이다.
InternetAddress 클래스를 사용하여 발신자의 이메일 주소와 이름(또는 닉네임)을 지정한다.
메일을 수신하는 측에게 보여지며 수신자는 이메일을 받을 때 발신자 이름과 이메일 주소를 확인할 수 있다.
대략
안녕하세요
관리자입니다
다음은 인증번호입니다.
CODE: 77
이런식으로 메일 객체가 생성되게 된다.
이외에도 여러가지 내용을 담을 수 있다.
1.setFrom(Address address): 이메일 발신자를 설정한다.
2.setRecipient(Message.RecipientType type, Address address): 수신자를 설정한다.
수신자 유형은 TO, CC(참조), BCC(숨은 참조) 등이 있다.
3.setSubject(String subject): 이메일의 제목을 설정한다.
4.setText(String text): 텍스트 형식의 이메일 내용을 설정한다.
5.setContent(Multipart multipart): 다중 부분(Multipart) 형식의 이메일 내용을 설정한다.
다중 부분은 텍스트, HTML, 첨부 파일 등 다양한 형식의 내용을 포함할 수 있다.
6.setSentDate(Date sentDate): 이메일의 전송일을 설정한다.
7.addAttachment(String filename, DataSource dataSource): 첨부 파일을 추가한다.
Mimemessage객체 자세한 사용법에 대해서는 다루지 않겠다.
2.3.3 메일 발송
컨트롤러로부터 sendEmail메소드의 매개변수로 들어온 email이 곧 이메일 주소가 되고
MimeMessage 객체 안에 전송할 메일의 내용을 담는다. 위에서 작성했듯이 MimeMessage누구한테 누가 어떤내용을 보낼지에 대한 정보가 들어있다.
그리고 bean 으로 등록해둔 javaMail 객체를 사용해서 이메일 send()메소드를 호출해서 보낸다.
@Override
public String sendEmail(String email) throws Exception {
authCode = createKey(); // 랜덤 인증번호 생성
MimeMessage message = createEmail(email); // 메일 발송
try {// 예외처리
// 메일보내기
emailSender.send(message);
} catch (MailException e) {
e.printStackTrace();
throw new IllegalArgumentException();
}
return authCode; // 메일로 보냈던 인증 코드를 서버로 반환
}이렇게 하면 메일이 보내진다. return값이 없어도 되고 이 글의 경우에는 이메일 인증을 위해 랜덤으로 생성한 authCode를 보내는 것이다.
authCode는 위에서 전역으로 설정해놓았기 때문에 MimeMessage에서 담아서 사용하고 반환값으로 사용할 수 있었다.
반환한 authCode를 이용해서 화면처리하는 것은 이전글에 있으니 참고하길 바란다.
정리
이것저것 많이 한것 같지만 메일을 보낼 객체를 잘 만들어 놓은 다음 JavaMailSender의 send()메소드를 통해서 메일을 보내면 된다.
Mimemessage객체 이외에도 단순하게 SimpleMailMessage를 사용해서 단순한 텍스트이메일을 보낼 수도 있다.
HTML이나 첨부파일을 보내고 싶다면 Mimemessage, 단순한 텍스트 이메일이라면 SimpleMailMessage를 사용하면 될듯 하다.
중간중간 이메일 중복처리와 같은 쓸데없는 내용이 들어있어 완벽하진 못한 글이지만 누군가는 도움이 되길 바란다.
'개념정리' 카테고리의 다른 글
| 외래키 임시 비활성화와 최근 사용하지 않는 이유? (1) | 2023.07.15 |
|---|---|
| 2023.06.28 105일차 인텔리제이 배우기 (0) | 2023.07.15 |
| JAVA MailSender (SMTP)활용해서 GMAIL보내기, 이메일인증 (1) | 2023.06.22 |
| OGNL이란 (0) | 2023.05.01 |
| MYSQL workbench readonly상태 해제 (0) | 2023.04.19 |