비밀번호 찾기 시 사용자 편의성을 생각하면 회원정보 일치 시 바로 비밀번호 변경으로 연결되는게 좋다고 생각하지만
java에서 이메일을 전송하는 방법이 궁금해서 그냥 이 방법을 사용해보았다
간단하게 메일 개설하기 쉬운 관리자용 gmail을 만들어서 gmail 전송하는 방법만 다룰 예정
<!-- 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>
mail 객체를 가진 라이브러리랑 메일전송을 위한 JavaMailSender
인터페이스를 가진 라이브러리 등록하기
<bean id="mailSender2" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com" />
<property name="port" value="587" />
<property name="username" value=""/>
<!-- 이메일 아이디 @gmail.om까지 전부-->
<property name="password" value=""/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
<prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
</props>
</property>
</bean>
gmail의 경우 tls를 사용하고 네이버와 다음의 경우 ssl을 사용한다고 한다.
prop
는 tls 인증코드인데 뿐만 아니라 계정관리에서 보안설정도 해제해줘야 제대로 전송된다고 합니다.
JavaMailSender
를 autowired 하기 @Autowired
private JavaMailSender mailSender;
나는 사용자에게 회원아이디와 이메일을 입력받고 일치하는 회원정보가 있을 경우
랜덤으로 생성한 임시 비밀번호로 회원정보를 변경하고
해당 임시 비밀번호를 입력받은 이메일로 전송해주었다.
public static String getRamdomPassword(int len) {
char[] charSet = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'
};
int idx = 0;
StringBuffer sb = new StringBuffer();
logger.info("charSet.length : "+charSet.length);
for (int i = 0; i < len; i++) {
idx = (int) (charSet.length * Math.random());
// 36 * 생성된 난수를 Int로 추출 (소숫점제거)
logger.info("idx : "+idx);
sb.append(charSet[idx]);
}
return sb.toString();
} //end getRamdomPassword()
public int sendMailTest(String memberEmail, String randomPassword) throws Exception{
int result=0;
String subject = "임시 비밀번호가 발급되었습니다."; //제목
String content =
"<p>안녕하세요 고객님!<br>발급된 임시 비밀번호는"
+randomPassword
+"입니다.<br>로그인하고 비밀번호를 변경해주세요.</p>"; //본문
String from = ""; //보내는사람 이메일주소
String to = memberEmail;
try {
MimeMessage mail = mailSender.createMimeMessage();
MimeMessageHelper mailHelper = new MimeMessageHelper(mail,"UTF-8");
mailHelper.setFrom(from);
mailHelper.setTo(to);
mailHelper.setSubject(subject);
mailHelper.setText(content, true);
// html태그를 사용하려면 true
mailSender.send(mail);
result=1;
return result; //전송 정상적으로 처리됨
} catch(Exception e) {
e.printStackTrace();
return result;
}
} //end sendMailTest()
bean에서 아이디를 설정했다면 setFrom()
은 생략해도 되지않을까? 했지만 bean에서는 단순히 smtp 인증을 받기 위해 사용한 것이고 controller에선 인식하지 못한다고 함.
이렇게해서 controller에서 각각의 함수의 용도에 맞게 사용하면 된다
테스트하기위해 내 메일로 보내봤는데 정상적으로 작동!
근데 생각보다 로딩이 오래걸린다. 더 빠른 라이브러리가 있을까?
참고 블로그
[Spring]메일서버(SMTP Server)를 이용한 메일 전송 1
[Java] 임시(랜덤) 비밀번호 생성하기 (비밀번호 찾기)