- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6.3 - ORM : Mybatis 3.2.8 |
자동 로그인 시 2차 인증을 하기 위해 메일을 발송하는 클래스를 작성해봅니다. SMTP 서버를 직접 구축할 수도 있겠지만 이번 글에서는 네이버의 계정에서 제공해주는 SMTP 기능을 사용해서 메일을 보내는 기능을 구현하도록 하겠습니다.
SMTP는 메일을 보내주는 역할을 하는 서버를 의미합니다. 반대로 POP은 메일을 받아주는 역할의 서버입니다. 많은 메일 서비스 업체들은 자사의 SMTP/POP에 대한 접속 정보를 제공해주기 때문에, 아웃룩 등의 다른 프로그램에서 해당 서버에 직접 접속해 메일 송수신을 할 수 있습니다.
1. Pom.xml 의존 설정
일반적으로 사용되는 라이브러리는 2개입니다. 아래와 같이 의존 설정을 해줍니다. mail 라이브러리는 현재 가장 최신 버전이 1.4.7이지만 필요한 버전에 맞추면 됩니다. support 라이브러리는 메일 라이브러리 사용을 좀 더 수월하게 할 수 있도록 스프링에서 제공해주는 라이브러리이기 때문에 현재 스프링 버전과 동일하게 맞춰줍니다.
<!-- 메일발송 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
2. JavaMailSenderImpl 클래스 Bean 등록
메일을 보내기 위한 최종 구현체는 스프링의 support 라이브러리의 JavaMailSenderImpl 클래스입니다. 이 클래스의 Bean 객체만 잘 설정해주면 준비가 완료됩니다.
일단 네이버의 smtp 정보를 얻기 위해 메일 페이지에 방문합니다. 아웃룩을 쓰시는 분들에게는 익숙한 설정들입니다. 네이버 메일에 들어가면 좌측 하단의 "환경설정"을 클릭해줍니다.
상단 메뉴탭 중에 "POP3/IMAP 설정"을 클릭합니다. 다른 부분은 아웃룩 같은 프로그램 연동 시 필요한 것이라 아무렇게나 설정하면 되는데 사용여부에 "사용함"을 꼭 체크해주셔야 합니다.
그리고 아랫쪽에 있는 내용들이 네이버 SMTP의 설정 내용입니다. POP은 메일을 수신하는 서버라 이번 글에서는 신경쓰지 않아도 됩니다.
위 내용을 기반으로 아래와 같이 Bean 설정을 해줍니다. 네이버나 다음, 구글 등 서비스 업체에 따라 조금씩 설정이 다릅니다. 아래는 네이버 메일을 사용하기 위한 설정입니다. 실제 기업에서 서비스를 구현할 때는 계약한 서비스 업체에서 해당 설정 내용을 제공해주거나 아예 SMTP를 자체 구축해버리므로 아래 설정의 정확한 의미는 굳이 분석하지 않고 넘어가도록 하겠습니다.
저 같은 경우는 1차적으로 Spring Security에서 사용하기 위해 등록하는 것이라 루트 컨테이너(root)에 등록해줬습니다. 서블릿 컨테이너에 등록하면 서블릿에서만 사용이 가능하다는 점에 유의해서 셋팅을 하시면 될 것 같습니다. 아마 대부분 @Service 클래스에서 사용하는 만큼 루트에 등록하는게 좋지 않을까 합니다.
[Spring MVC/- 기본 상식] - 스프링(Spring) MVC 동작 구조 및 스프링 컨테이너
<!-- 메일 -->
<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="username" />
<property name="password" value="password" />
<property name="defaultEncoding" value="utf-8" />
<property name="javaMailProperties">
<props>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtps.ssl.checkserveridentity">true</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
</props>
</property>
</bean>
3. 메일 발송 코드 작성
jUnit으로 간단히 테스트를 해보겠습니다. 라이브러리 사용에는 여러 방법들이 있는데 아래 방법이 가장 쉬울 것 같습니다. 위에서 의존 설정한 두 개의 라이브러리를 사용하면 됩니다.
javax의 mail 라이브러리는 실제 보내질 메일 객체를 가집니다. 이 라이브러리만 사용하더라도 메일을 보내는데는 지장이 없겠지만 사용법이 꽤 복잡합니다. 그래서 스프링에서 mail 라이브러리를 쉽게 사용할 수 있도록 해주는데, 이것이 바로 support 라이브러입니다. 실제 메일 객체에 여러 값들을 간단히 넣어서 전송할 수 있도록 해줍니다. 프레임워크 짱..
보내는 사람은 꼭 넣어줘야 합니다. 본인 계정으로 네이버에 로그인을 하지만 이는 SMTP 사용 권한을 얻어오는 것이고 보내는 사람이 해당 계정으로 자동 셋팅되는 것은 아닙니다.
내용을 넣는 setText() 메소드는 그냥 텍스트를 넣을 수도 있고 HTML 코드로 내용을 만들었다면 두 번째 인자로 true를 주면 됩니다.
@Test
public void mailTest() {
JavaMailSenderImpl mailSender = (JavaMailSenderImpl)ctx.getBean("mailSender");
// 메일 제목, 내용
String subject = "제목입니당";
String content = "내용입니당~";
// 보내는 사람
String from = "codevang@naver.com";
// 받는 사람
String[] to = new String[2];
to[0] = "codevang@naver.com";
to[1] = "ulantj@naver.com";
try {
// 메일 내용 넣을 객체와, 이를 도와주는 Helper 객체 생성
MimeMessage mail = mailSender.createMimeMessage();
MimeMessageHelper mailHelper = new MimeMessageHelper(mail, "UTF-8");
// 메일 내용을 채워줌
mailHelper.setFrom(from); // 보내는 사람 셋팅
mailHelper.setTo(to); // 받는 사람 셋팅
mailHelper.setSubject(subject); // 제목 셋팅
mailHelper.setText(content); // 내용 셋팅
// 메일 전송
mailSender.send(mail);
} catch(Exception e) {
e.printStackTrace();
}
}
4. 메일 전송 확인
메일이 제대로 전송됐는지 확인해봅니다. 정상적으로 수신된 것을 확인할 수 있습니다.
HTML 코드로 좀 더 쉽게 복잡한 메일을 작성하고 싶으면 메일 작성 서비스나 프로그램을 이용하면 됩니다. 예를 들어 아웃룩을 사용한다면 아웃룩으로 메일을 써서 발송한뒤, 발송한 메일을 열어 우클릭해 "소스 보기"를 클릭하면 메일에 대한 HTML 소스가 나옵니다.
네이버 메일쓰기를 활용할 수도 있습니다. 에디터에서 메일을 작성한 뒤 우측 하단에 HTML버튼을 누르면 코드가 나오는데 복사해서 사용하면 됩니다.
'▸Spring MVC > 기본 문법' 카테고리의 다른 글
Mybatis, MySQL 계층형 게시판 쿼리, 페이징, Date 처리 (0) | 2020.04.11 |
---|---|
스프링, Mybatis, MySQL_쿼리문 다중 파라미터 사용 [5/5] (0) | 2020.04.03 |
스프링, Mybatis, MySQL_트랜잭션 처리 [4/5] (1) | 2020.03.22 |
스프링, Mybatis, MySQL_사용법(Mapper 인터페이스) [3/5] (0) | 2020.03.22 |
스프링, Mybatis, MySQL_사용법 [2/5] (0) | 2020.03.22 |
댓글