이번 프로젝트에 이메일 인증을 넣기위해 알아본 것이다
우선 메이븐에 dependency를 추가해주자
<!-- 메일 라이브러리 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
그다음 context-email.xml을 생성한후 다음과같이 빈을 등록한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 메일 보내기 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com" />
<property name="port" value="587" />
<property name="username" value="본인 아이디" />
<property name="password" value="본인 비밀번호" />
<!-- email 요청시는 SMTP -->
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
</beans>
그리고나서 메일을 보내기위한 핸들러 클래스파일을 만든다
import java.io.UnsupportedEncodingException;
import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
public class MailHandler {
private JavaMailSender mailSender;
private MimeMessage message;
private MimeMessageHelper messageHelper;
public MailHandler(JavaMailSender mailSender) throws MessagingException {
this.mailSender = mailSender;
message = this.mailSender.createMimeMessage();
messageHelper = new MimeMessageHelper(message, true, "UTF-8");
}
public void setSubject(String subject) throws MessagingException {
messageHelper.setSubject(subject);
}
public void setText(String htmlContent) throws MessagingException {
messageHelper.setText(htmlContent, true);
}
public void setFrom(String email, String name) throws UnsupportedEncodingException, MessagingException {
messageHelper.setFrom(email, name);
}
public void setTo(String email) throws MessagingException {
messageHelper.setTo(email);
}
public void addInline(String contentId, DataSource dataSource) throws MessagingException {
messageHelper.addInline(contentId, dataSource);
}
public void send() {
mailSender.send(message);
}
}
메일을 보낼때 키값을 랜덤으로 얻어내기위해 다음과같은 계산클래스파일을 만든다
import java.util.Random;
public class TempKey {
private boolean lowerCheck;
private int size;
public String getKey(int size, boolean lowerCheck) {
this.size = size;
this.lowerCheck = lowerCheck;
return init();
}
private String init() {
Random ran = new Random();
StringBuffer sb = new StringBuffer();
int num = 0;
do {
num = ran.nextInt(75)+48;
if((num>=48 && num<=57) || (num>=65 && num<=90) || (num>=97 && num<=122)) {
sb.append((char)num);
}else {
continue;
}
} while (sb.length() < size);
if(lowerCheck) {
return sb.toString().toLowerCase();
}
return sb.toString();
}
}
인증방식이 많지만 나는 크게 신경쓰지 않고 AJAX를 이용하여 클라이언트단에서 validation 체크를 위해
컨트롤러에 다음과같이 작성해준다
@RequestMapping(value = "emailCheck.do", method=RequestMethod.POST)
@ResponseBody
public void mailSending(@RequestParam String email,HttpServletResponse res) {
System.out.println(email);
String setfrom = "본인 메일주소";
String key = new TempKey().getKey(50, false);
String tomail = email; // 받는 사람 이메일
String title = "꿈꾸는 책다방 서비스 이메일 인증입니다.";
String content = new StringBuffer().
append("제공되는 키를 회원가입창에 입력해주세요 키값은 : ").
append(key).
append(" 입니다.").
toString();
try {
res.setContentType("UTF-8");
PrintWriter writer = res.getWriter();
writer.print(key);
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper messageHelper
= new MimeMessageHelper(message, true, "UTF-8");
messageHelper.setFrom(setfrom,"꿈꾸는 책다방"); // 보내는사람 생략하거나 하면 정상작동을 안함 두번째 인자값은 보낼때의 이름이다.
messageHelper.setTo(tomail); // 받는사람 이메일
messageHelper.setSubject(title); // 메일제목은 생략이 가능하다
messageHelper.setText(content); // 메일 내용
sender.send(message);
} catch(Exception e){
System.out.println(e);
}
}
여기까지 작성하였다면 메일이 정상적으로 보내질것이다.