<!-- SpringBoot mailService -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
#mailService
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=gmail주소
spring.mail.password=gmail비밀번호(앱키)
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.auth=true
spring.mail.transport.protocol=smtp
spring.mail.debug=true
spring.mail.default.encoding=UTF-8
구글계정은 보안상 2단계인증이 되어있을 시 새로운 앱을 선택하여 앱보안번호를 받는다.
보안-> 2단계인증 설정(2단계 인증이 안되어있을 시 보안설정 안됨.)
앱 비밀번호 설정
사용할 앱 이름을 설정 후 비밀번호 코드를 받는다.
이 코드를 application.properties의 비밀번호에 넣어야 완료.
@Component
public class MailManager {
@Value("${spring.mail.username}")
private String sender;
@Autowired
private JavaMailSender javaMailSender;
public void send(String sendTo, String sub, String con) throws Exception {
// HTML 태그 그대로 전송하는 방법
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
mimeMessage.setFrom(sender);
//받는사람
mimeMessage.addRecipient(RecipientType.TO, new InternetAddress(sendTo));
mimeMessage.setSubject(sub);
mimeMessage.setText(con);
javaMailSender.send(mimeMessage);
}
}
public class SHA256Util {
/**
* SHA-256 암호화 함
* @param source 원본
* @param salt(String) SALT 값
* @return
*/
public static String getEncrypt(String source, String salt) {
return getEncrypt(source, salt.getBytes());
}
/**
* SHA-256 암호화 함
* @param source 원본
* @param salt(byte[]) SALT 값
* @return
*/
public static String getEncrypt(String source, byte[] salt) {
String result = "";
byte[] a = source.getBytes();
byte[] bytes = new byte[a.length + salt.length];
System.arraycopy(a, 0, bytes, 0, a.length);
System.arraycopy(salt, 0, bytes, a.length, salt.length);
try {
// 암호화 방식 지정 메소드
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(bytes);
byte[] byteData = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xFF) + 256, 16).substring(1));
}
result = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
/**
* SALT를 얻어온다.
* @return
*/
public static String generateSalt() {
Random random = new Random();
byte[] salt = new byte[8];
random.nextBytes(salt);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < salt.length; i++) {
// byte 값을 Hex 값으로 바꾸기.
sb.append(String.format("%02x",salt[i]));
}
return sb.toString();
}
}
//email인증
@PostMapping("/sendMail") //
@ResponseBody //AJAX후 값을 리턴하기위해 작성
public String SendMail(String email) throws Exception {
UUID uuid = UUID.randomUUID(); // 랜덤한 UUID 생성
String key = uuid.toString().substring(0, 7); // UUID 문자열 중 7자리만 사용하여 인증번호 생성
String sub ="인증번호 입력을 위한 메일 전송";
String con = "인증 번호 : "+key;
mailManager.send(email,sub,con);
key = SHA256Util.getEncrypt(key, email);
return key;
}
@PostMapping("/checkMail") //
@ResponseBody
public boolean CheckMail(String key, String insertKey,String email) throws Exception {
insertKey = SHA256Util.getEncrypt(insertKey, email);
if(key.equals(insertKey)) {
return true;
}
return false;
}
회원가입중 인증번호 요청시 해당 메일로 인증번호가 간 것을 볼 수 있다.