[Spring] 이메일 전송하기

yed·2021년 11월 11일
0

비밀번호 찾기 시 사용자 편의성을 생각하면 회원정보 일치 시 바로 비밀번호 변경으로 연결되는게 좋다고 생각하지만
java에서 이메일을 전송하는 방법이 궁금해서 그냥 이 방법을 사용해보았다

간단하게 메일 개설하기 쉬운 관리자용 gmail을 만들어서 gmail 전송하는 방법만 다룰 예정

pom.xml 설정

<!-- 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 인터페이스를 가진 라이브러리 등록하기

root-context.xml 설정

<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 인증코드인데 뿐만 아니라 계정관리에서 보안설정도 해제해줘야 제대로 전송된다고 합니다.

controller에서 사용하기

  • bean으로 만든 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] 임시(랜덤) 비밀번호 생성하기 (비밀번호 찾기)

profile
6개월 국비과정 기록하기

0개의 댓글