728x90

- 기초 용어

smtp : 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다.

 

간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol)이라고 불린다.

사용하는 TCP 포트번호는 25,465,587번이다.

 

https : https를 이용한 인터넷 접속은 기존 http프로토콜에 더해서 보안프로토콜인 SSL 혹은 TLS를 이용하여 클라이언트와 서버간 보안성있는 데이터 왕래를 하게 해줍니다.

 

SSL,TLS : 보안 프로토콜이다. 

SSL TLS 는 응용계층(HTTP,FTP,SMTP)과 전송계층(TCP) 사이에 보안 계층이라는 독립적인 프로토콜계층을 생성하고,

위치합니다.

SSL 암호화 통신은 비대칭키방식으로 암호화에 사용할 키를 교환하고, 대칭키 방식으로 데이터 통신을 한다.

TLS가 SSL의 후속버전이긴 하지만,  두가지 전부 같은 의미이다.

 

- 기본설정

 

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
<!-- javax.mail -->
        <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
        <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>
cs

6: mvnrepository에서 JavaMail API (compat) 을 의존성에 추가한다.

최신버전은 1.5.0-b01 이지만, 1.4.7 , 1.4 버전이 주로 사용된다.

 

root-context.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 회원가입 메일 인증 -->
    <bean id="mailSender"    class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="587" /><!-- 465 or (25비추 평문) or 587 -->
        <property name="username" value="1234@gmail.com" />
        <property name="password" value="12345" />
        <property name="defaultEncoding" value="utf-8" />
        <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>
cs

servlet-context.xml 이 아닌 root-context.xml 에  bean을 등록한다. ( root-context.xml은 웹뷰와 관련 없는 bean을 처리 )

4 : 포트번호를 SMTP 평문 포트번호인 25번이 아닌 다른 포트번호로 지정해주었다.

( 사실 본 내용에서는 서버->구글로 전달되는 방식만 정해주는 것이기에 그렇게 보안설정이 중요해 보이지는 않는다. )

5~6 : 서버에서 사용할 구글 아이디 , 비밀번호가 각각 들어간다.

12 : STARTTLS 를 true로 놓아 상호간 TLS버전을 통일시 하도록 한다.

 

SSL과 TLS를 지원하는 포트에 연결되거나, 안전하지 않은 연결이 STARTTLS에 의해 업그레이드되면,

서버,클라이언트양측은 이 중에 지원되는 특정 버전을 쓰도록 합의합니다. 서버가 최신의 TLS v1.3을 지원하더라도, 이메일 클라이언트가 TLS v1.1만 지원한다면, 양측은 TLS v1.1을 쓰게 된다는 겁니다.

 

구글내 설정

보안 수준이 낮은 앱의 액세스를 허용해야 spring 에서 구글 smtp 서버에 접속할 수 있다.

 

-SPRING 에서 활용하기

 

하단의 샘플은 이메일인증키를 사용자에게 발송하는 로직을 가진 서비스.java 파일이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Random;
import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.servlet.http.HttpSession;
 
@Service
public class userinfoServiceImpl implements userinfoService{
    
    @Inject
    private userinfoDAO dao;
    @Inject
    private JavaMailSender mailSender;
 
    ~~ 생략 ~~
 
    @Override
    public void createEmailKey(HttpSession session,String usermail) {
        String strKey=getKey(8);
        session.setAttribute("authenticationKey", strKey);
        session.setMaxInactiveInterval(60*3);
        MimeMessage mail=mailSender.createMimeMessage();
        String htmlStr="<h2>안녕하세요 TodaysFortune 웹사이트 입니다! </h2><br><br>" 
                + "<h3>회원님의 가입을 환영합니다<h3>"
                + "<p>이메일 인증 코드 : " 
                + "<span style='color:red;'>"+strKey+"</span></p>"
                + "(혹시 잘못 전달된 메일이라면 이 이메일을 무시하셔도 됩니다)";
        try {
            mail.setSubject("[TodaysFortune] 인증메일입니다.""utf-8");
            mail.setText(htmlStr,"utf-8","html");
            mail.addRecipient(RecipientType.TO,new InternetAddress(usermail));
            mailSender.send(mail);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
 
    }
 
    ~~~ 생략 ~~
}
cs

14~15 : root-context.xml 에서 정의한 bean을 주입시켜준다.

24 : MimeMessage 객체를 생성해준다.

31 : 메일의 제목.

32 : 메일의 본문

33 : 메일 수신자 설정.

34 : 실제 메일 발송.

 

하단은 daum 홈페이지에서 수신된 이메일이다.

 

참고 : SSL,TLS,HTTPS정리사이트 https://blog.naver.com/skinfosec2000/222135874222

        STARTTLS 원문번역사이트 https://tech.yeon.me/blog/ssl-tls-starttls%EC%9D%98-%EC%97%AD%EC%82%AC/

        서브 OKKY 참고자료 https://okky.kr/article/329317?note=1834311

        spring javaxmail 참고자료 http://blog.naver.com/vnemftnsska2/221413314636

       

추후 볼만한 사이트 : 이미지,파일,대량의 메일을 전송하는방법 https://offbyone.tistory.com/167

+ Recent posts