SMTP Server를 통해서 메일 전송 기능을 구현하기 위해선 사용하고자 하는 메일의 SMTP 보안 단계를 낮추어야 합니다. 네이버의 경우 로그인시 휴대폰승인을 통한 보안 단계까지 설정이 되어 있을 경우 아래의 설정만으로는 부족합니다.
<!-- Email 인증번호 라이브러리 추가 -->
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
'메일 서버에 계정 인증 후 메일을 전송하는 방법'을 택하였고 이용한 이메일은 네이버 이메일입니다.
<!-- navermail설정 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.naver.com"/> <!-- 메이서버 호스트 -->
<property name="port" value="465"/> <!-- 메이서버 포트번호 -->
<property name="username" value="your_email"/> <!-- 자신의 이메일 아이디 -->
<property name="password" value="your_password"/> <!-- 자신의 비밀번호 -->
<!-- 보안연결 SSL과 관련된 설정 -->
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtps.checkserveridentity">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
</props>
</property>
</bean>
<div class="mail_check_input_box" id="mail_check_input_box_false">
속성 class가 "mail_check_input"인 input태그에 disabled="disabled"속성을 추가해줍니다.
<input class="mail_check_input" disabled="disabled">
이메일 입력란에 이메일을 입력 후 [인증번호 전송] 버튼을 클릭하면 작동하는 메서드를 추가하겠습니다. 해당 메서드는 controller로 작성한 이메일 주소를 보내고, 인증번호 생성하여 전달받은 이메일로 전송한 뒤 전송된 인증번호를 뷰(회원가입페이지)로 다시 반환되로록 합니다. controller에 요청할 때 화면이 전환되면 안되기 때문에 ajax를 사용하겠습니다.
//인증번호 이메일 전송
$(".mail_check_button").click(function() {
var email = $(".mail_input").val(); // 입력한 이메일
$.ajax({
type : "GET",
url : "mailCheck?email=" + email
})
});
추가할 메서드는 인증번호를 생성하여, 이메일과 뷰로 보내는 기능을 할 것입니다.
// 인증번호(난수) 생성
Random random = new Random();
int checkNum = random.nextInt(888888) + 111111;
logger.info("인증번호" + checkNum);
// 이메일 보내기
String setFrom = "abcd4501@naver.com";
String toMail = email;
String title = "회원가입 인증 이메일 입니다.";
String content = "홈페이지를 방문해주셔서 감사합니다." +
"<br><br>" +
"인증 번호는 " + checkNum + " 입니다." +
"<br>" +
"해당 인증번호를 인증번호 확인란에 기입하여 주세요.";
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom(setFrom);
helper.setTo(toMail);
helper.setSubject(title);
helper.setText(content, true);
mailSender.send(message);
}catch(Exception e) {
e.printStackTrace();
}
String num = Integer.toString(checkNum);
return num;
$.ajax({
type : "GET",
url : "mailCheck?email=" + email,
success : function(data){
console.log("data : " + data);
}
});
인증번호 입력란(mail_check_input)에 사용할 수 있도록 하기 위해 두 가지가 기능 실행되어야 합니다.
이 기능은 인증번호 전송이 정상적으로 작동하였을때만 진행이 됩니다. 그렇기 때문에 앞서 말한 두 가지 기능을 수행하는 명령 코드는 ajax 내에 있는 success코드에 작성되어야 합니다.
//인증번호 이메일 전송
$(".mail_check_button").click(function() {
var email = $(".mail_input").val(); // 입력한 이메일
var checkBox = $(".mail_check_input"); // 인증번호 입력란
var boxWrap = $(".mail_check_input_box")// 인증번호 입력란 박스
$.ajax({
type : "GET",
url : "mailCheck?email=" + email,
success : function(data){
//console.log("data : " + data);
checkBox.attr("disabled",false)
boxWrap.attr("id", "mail_check_input_box_true");
}
});
});
입력된 인증번호와 이메일로 전송된 인증번호에 대한 비교는 Controller에서 진행되지 않고 뷰에서 진행되도록 만들 것입니다.
var code = ""; //이메일전송 인증번호 저장위한 코드
//인증번호 이메일 전송
$(".mail_check_button").click(function() {
var email = $(".mail_input").val(); // 입력한 이메일
var checkBox = $(".mail_check_input"); // 인증번호 입력란
var boxWrap = $(".mail_check_input_box")// 인증번호 입력란 박스
$.ajax({
type : "GET",
url : "mailCheck?email=" + email,
success : function(data){
//console.log("data : " + data);
checkBox.attr("disabled",false)
boxWrap.attr("id", "mail_check_input_box_true");
code = data;
}
});
});
<div class="mail_wrap">
<div class="mail_name">이메일</div>
<div class="mail_input_box">
<input class="mail_input" name="memberMail">
</div>
<div class="mail_check_wrap">
<div class="mail_check_input_box" id="mail_check_input_box_false">
<input class="mail_check_input" disabled="disabled">
</div>
<div class="mail_check_button">
<span>인증번호 전송</span>
</div>
<div class="clearfix"></div>
<span id="mail_check_input_box_warn"></span>
</div>
</div>
.correct{
color: green;
}
.incorrect{
color: red;
}
//인증번호 비교
$(".mail_check_input").blur(function() {
var inputCode = $(".mail_check_input").val(); // 입력코드
var checkResult = $("#mail_check_input_box_warn"); // 비교 결과
if (inputCode == code) { // 일치할 경우
checkResult.html("인증번호가 일치합니다.");
checkResult.attr("class", "correct");
} else { // 일치하지 않을 경우
checkResult.html("인증번호를 다시 확인해주세요.");
checkResult.attr("class", "incorrect");
}
});
- 이메일로 전송된 인증번호
- 인증번호 일치하지 않을 경우
- 인증번호 일치할 경우