개발자의 끄적끄적

[java] Gmail SMTP를 이용한 메일 보내기 [펌] 본문

개발/java & jsp

[java] Gmail SMTP를 이용한 메일 보내기 [펌]

효벨 2019. 12. 29. 03:00
728x90
반응형

[java] Gmail SMTP를 이용한 메일 보내기 [펌]

 

smtp 메일 보내기 자료를 조사하던중

 

너무 정리가 잘되어있어서 소장용으로 퍼왔습니다!

 

출처는 아래 명시했습니다!

 

참고들하세요!

 

오늘은 Gmail을 이용한 메일 보내는 기능을 구현해봤다.

사실 예전에도 했었던 적이 있지만 다시해보니 또 재밌는 것 같다.

 

자바에서 메일을 보내기 위해서는 SMTP 서버가 있어야 한다.

SMTP는 "Simple Mail Transfer Protocol"의 약자로 전자 메일 전송을 위한 표준 프로토콜이다.

그럼 SMTP 서버가 왜 필요한 걸까?

 

아래 그림과 같이 우리가 보낸 메일은 SMTP 서버로 전송이 되고 SMTP 서버가 해당 메일 주소로 메일을 전송해주는 역할을 한다. 때문에 자체적인 SMTP 서버가 없다면 외부의 SMTP 서버를 이용하는 방법이 있다.

 

Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY

 

본 포스팅에서는 Gmail의 SMTP 서버를 이용한 메일 보내기를 해볼 것이다.

 

먼저 메일을 보내기 위해서는 mail.jar 라이브러리가 필요하다.

☞ https://mvnrepository.com/artifact/javax.mail/mail/1.4.7

 

사이트에 접속해서 아래 표시된 jar 파일을 다운받으면 된다.

 

 

다운받은 mail-1.4.7.jar 파일은 프로젝트의 WEB-INF - lib 폴더에 넣어주자.

 

 

+ Gmail SMTP를 이용하기 위해서는 계정 설정을 해주어야 한다.

아래 화면에서 Google 계정에 들어가면 로그인 및 보안 설정이 있다.

 

 

스크롤을 맨 아래로 내리면 보안 수준이 낮은 앱 허용이 보이는데 사용으로 바꿔주어야 한다.

 

 

이제 간단한 셋팅은 끝났다.

자바로 메일 보내는 코드는 구글링을 해보면 금방 찾아낼 수 있다.

 

나는 인증 부분과 보내기 부분을 나누어 구현해봤다.

 

MailAuth.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package web.mail;

 

import javax.mail.Authenticator;

import javax.mail.PasswordAuthentication;

 

public class MailAuth extends Authenticator{

    

    PasswordAuthentication pa;

    

    public MailAuth() {

        String mail_id = "gmail 아이디";

        String mail_pw = "패스워드 입력";

        

        pa = new PasswordAuthentication(mail_id, mail_pw);

    }

    

    public PasswordAuthentication getPasswordAuthentication() {

        return pa;

    }

}

Colored by Color Scripter

cs

 

메일을 보내기 위해 추가한 mail-1.4.7 jar에는 javax.mail 패키지가 들어있다.

javax.mail 패키지의 주요 클래스는 Session, Message, Address, Authenticator, Tranport 등이 있다. SMTP 서버에 연결해 사용자 인증을 하기 위해서 Authenticator 클래스 사용이 필요하다.

 

17~18 Line :     public PasswordAuthentication getPasswordAuthentication() {

        return pa;

    }

 

- Authenticator를 사용하기 위해서는 PasswordAuthenticator 클래스로부터 인스턴스를 생성하고 getPasswordAuthentication 메소드로 리턴받아야 한다.

PasswordAuthentication 클래스는 사용자의 아이디와 패스워드를 입력받아 반환하도록 재정의한다.

 

MailSend.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

43

44

45

46

47

48

49

50

51

package web.mail;

 

import java.io.UnsupportedEncodingException;

import java.util.Date;

import java.util.Properties;

 

import javax.mail.Authenticator;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

 

public class MailSend {

    

    public void MailSend() {

        Properties prop = System.getProperties();

        prop.put("mail.smtp.starttls.enable""true");

        prop.put("mail.smtp.host""smtp.gmail.com");

        prop.put("mail.smtp.auth""true");

        prop.put("mail.smtp.port""587");

        

        Authenticator auth = new MailAuth();

        

        Session session = Session.getDefaultInstance(prop, auth);

        

        MimeMessage msg = new MimeMessage(session);

    

        try {

            msg.setSentDate(new Date());

            

            msg.setFrom(new InternetAddress("shxorld@gmail.com""VISITOR"));

            InternetAddress to = new InternetAddress("szhyun2002@gmail.com");         

            msg.setRecipient(Message.RecipientType.TO, to);            

            msg.setSubject("제목""UTF-8");            

            msg.setText("안녕하세요 테스트 메일입니다.""UTF-8");            

            

            Transport.send(msg);

            

        } catch(AddressException ae) {            

            System.out.println("AddressException : " + ae.getMessage());           

        } catch(MessagingException me) {            

            System.out.println("MessagingException : " + me.getMessage());

        } catch(UnsupportedEncodingException e) {

            System.out.println("UnsupportedEncodingException : " + e.getMessage());

        }

                

    }

}

Colored by Color Scripter

cs

 

19 Line :  Properties prop = System.getProperties(); 

- Properties 클래스는 시스템의 속성을 객체로 생성하는 클래스이다. Hashtable을 상속받은 클래스로 속성과 값은 1:1로 저장이 된다.

 

20 ~ 23 Line : 이 부분은 TLS와 SSL의 사용에 따라 설정값이 다른데 위 코드는 TLS의 경우이다. 

(https://stackoverflow.com/questions/20290625/javamail-javax-mail-authenticationfailedexception 참조)

 

20 Line : prop.put("mail.smtp.starttls.enable""true"); - 로그인시 TLS를 사용할 것인지 설정

21 Line : prop.put("mail.smtp.host""smtp.gmail.com"); - 이메일 발송을 처리해줄 SMTP서버

22 Line : prop.put("mail.smtp.auth""true"); - SMTP 서버의 인증을 사용한다는 의미

23 Line : prop.put("mail.smtp.port""587"); - TLS의 포트번호는 587이며 SSL의 포트번호는 465이다.

 

25 ~ 27 Line : Authenticator auth = new MailAuth();

       

        Session session = Session.getDefaultInstance(prop, auth);

- MailAuth.java 에서 Authenticator를 상속받아 생성한 MailAuth 클래스를 받아 세션을 생성한다.

getDefaultInstance의 첫 번째 파라미터는 앞서 설정한 메일 처리 환경이다.

 

29 Line : MimeMessage msg = new MimeMessage(session); 

- MimeMessage는 Message (추상)클래스를 상속받은 인터넷 메일을 위한 클래스이다. 위에서 생성한 세션을 담아 msg 객체를 생성한다.

 

32 Line : msg.setSentDate(new Date());

- 보내는 날짜 지정

 

34 Line : msg.setFrom(new InternetAddress("shxorld@gmail.com""VISITOR"));

- Message 클래스의 setFrom() 메소드를 사용하여 발송자를 지정한다. 발송자의 메일, 발송자명

InternetAddress 클래스는 이메일 주소를 나타날 때 사용하는 클래스이다.

 

35 Line : InternetAddress to = new InternetAddress("szhyun2002@gmail.com");   

-  수신자의 메일을 생성한다.

 

36 Line : msg.setRecipient(Message.RecipientType.TO, to);   

- Message 클래스의 setRecipient() 메소드를 사용하여 수신자를 설정한다. setRecipient() 메소드로 수신자, 참조, 숨은 참조 설정이 가능하다.

Message.RecipientType.TO : 받는 사람

Message.RecipientType.CC : 참조

Message.RecipientType.BCC : 숨은 참조

 

37 Line : msg.setSubject("제목""UTF-8"); - 메일의 제목 지정

38 Line : msg.setText("안녕하세요 테스트 메일입니다.""UTF-8"); - 메일의 내용 입력

 

40 Line : Transport.send(msg); 

- Transport는 메일을 최종적으로 보내는 클래스로 메일을 보내는 부분이다.

 

42 ~ 47 Line : 예외 처리

MessagingException - 메일 계정인증 관련 예외 처리

UnsupportedEncodingException - 지원되지 않는 인코딩을 사용할 경우 예외 처리

 

 

페이지를 하나 만들고 테스트 해봤다.

(참고로 화면에 보이는 메일 입력 컨트롤 창은 현재 기능이 없으며, 추후에 입력된 메일로 보내는 기능을 추가할 예정이다)

 

 

main.jsp

1

2

3

  <div class="form-group" style="width: 38%; margin: 10px auto;">  

      <button type="button" class="btn btn-primary btn-lg btn-block" onclick="send_mail()">보내기</button>

  </div>  

Colored by Color Scripter

cs

 

보내기 버튼을 클릭하면 send_mail() 함수가 실행되도록 했다.

 

1

2

3

4

5

<script type="text/javascript">

function send_mail(){

    window.open("./test_mail.jsp""""width=370, height=360, resizable=no, scrollbars=no, status=no");

}

</script>

Colored by Color Scripter

cs

 

send_mail() 함수는 팝업창으로 test_mail.jsp 페이지를 띄어준다.

현재는 메일을 보내는 것만 구현이 되어있고 메일 보내기를 실패했을 때 처리는 되지 않은 상태이다. 즉 클라이언트단에서 예외처리가 없는 상태. 따라서 실패하면 콘솔창에 에러 내역만 뜨고 팝업창에 COMPLETE 메시지는 무조건 뜨게 되어있다. 이 부분은 각자 만들어보는 것도 좋을 것 같다 :)

 

test_mail.jsp

1

2

3

4

5

6

7

8

9

10

11

12

<%@ page contentType="text/html; charset=UTF-8" %>

<%@ include file="/common/ssi.jsp" %>

<%@ include file="/common/resource.jsp" %>

 

<%@ page import="web.mail.*"  %>

 

<%

MailSend ms = new MailSend();

ms.MailSend();

 

out.println("COMPLETE");

%>

Colored by Color Scripter

cs

 

메일이 성공적으로 보내지면 요렇게 메일이 도착한다.

 

+피드백은 언제나 환영입니다 :)



출처: https://shxrecord.tistory.com/118 [첫 발]

반응형
Comments