Java로 메일 가져오기 & 쓰레드의 인터럽트

단비·2023년 5월 2일
0

학습

목록 보기
28/66

SMTP / POP3 / IMAP란?

SMTP

  • 편지를 쓰고 동네에 있는 우체통에 해당 편지를 넣는다.
    우체통: SMTP 서버
  • 웹 상에서 메일을 주고 받기 위해 이용되는 프로토콜(규약)
  • 클라이언트 측에서 메일 서버로 메일을 보낼 때 사용
  • 클라이언트가 이메일을 보내면 바로 상대편의 컴퓨터로 메일을 송신하는 것이 아니라,
    중간에 메일 서버를 거치게 됨

POP3

  • 집배원이 해당 우체통에 있는 모든 편지를 가져간다.
    집배원: POP3 서버
  • 사용자의 기기로 이메일을 다운로드하여 읽는 프로토콜(다운로드한 내용은 서버에서 삭제되기에 동일한 기기에서만 이메일 확인 가능)

IMAP

  • 받는이가 사는 동네 우체국으로 편지가 분배 된다.
    POP3 서버에 의해 해당 이메일이 전송 된다.
  • 서버에서 이메일을 읽는 프로토콜(여러가지의 디바이스에서 접속하여도 동일한
    정보를 확인할 수 있음)
  • 어떤 상황에서든 동일한 내용을 읽어올 수 있음

메일 발송을 위해 필요한 부분
메일 서버(SMTP Server)




Java Mail 핵심 요소

1. Session

  • Java Mail API를 사용할 수 있게 해주는 클래스
  • 다양한 메일 프로바이더 구현(Service Provider Implementation; SPI)을 나타내는 클래스를 로딩하고 제어할 수 있는 메소드 제공

2. Store

  • 특정한 메일 프로토콜을 이용해 읽기,쓰기,감시,검색 가능
  • 메일 저장소를 추상화한 Folder에 접근할 수 있게 해줌

3. Folder

  • 메일 메시지에 접근할 수 있게 해줌
  • 메일 메시지는 Message 클래스의 객체로 표현됨

4. Transport

  • 메시지를 전송할 때 사용

5. Message

  • 제목,메일주소,날짜 등의 실제 메일 세부 사항을 나타내는 객체




세팅법

1. build.gralde

// https://mvnrepository.com/artifact/javax.activation/activation
implementation group: 'javax.activation', name: 'activation', version: '1.1.1'
// https://mvnrepository.com/artifact/javax.mail/mail
implementation group: 'javax.mail', name: 'mail', version: '1.4.7'

2. Service

Property에 SMTP 서버 정보 설정 후 세션 연결

  • imaps 방법과 pop3 방법이 있음
Properties props = System.getProperties();
// smtp 서버 설정
// props.put("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.store.protocol", "imaps");

Session session = Session.getInstance(props, null); // 세션 smtp 시작

Store 연결

// Store store = session.getStore("pop3");
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", username, password);

Folder 설정

  • pop3: 폴더가 INBOX만 있음
    imaps: INBOX 말고도 사용자 폴더가 따로 있음
// 받은편지함을 INBOX 라고 한다.
Folder folder = store.getFolder("INBOX");
// 속성인지 혹은 수정 속성인지 설정
folder.open(Folder.READ_WRITE);

메일 가져오기

// 받은 편지함에 있는 메일 모두 읽어오기
Message[] messages = folder.getMessages();

// 발신인
messages[0].getFrom()[0].toString()
// 메일 제목
messages[0].getSubject()

필요 시 메일 삭제

messages[0].setFlag(Flags.Flag.DELETED, true);

연결 끊기

  • folder.close: 파일 삭제를 원치 않을 경우 false
// folder와 store은 조회 후 꼭 close 해주어야함
// folder.close()에는 메시지 삭제 여부를 주어야함
// 실제 메시지가 삭제되는 시점은 folder를 close하는 시점
folder.close(true);
store.close();






💡 TIPS!


Thread의 InterruptedException

  • Thread의 stop 메소드로 스레드를 종료하는 것은 스레드가 가진 모든 자원이 해제되므로 안전하지 않음 (interrupt를 이용하자)

인터럽트(Interrupt)
스레드를 종료하기 위한 메커니즘

InterruptedException

  • 기존에 쓰레드가 실행 중이나, 비정상적인 실행 또는 종료를 수행하게 될 때 발생
profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글