최신 게시글(JAVA)
2018.06.29 / 21:47

JavaMail 을 이용하여 pop3로 메일 가져오기

aichatbot
추천 수 3


테스트 성공.

* Blocking 문제
java 프로세스 실행 시, I/O 가 끝날 때까지 thread 가 run 상태이다. blocking 이 문제가 된다면 thread 를 따로 생성해서 사용하자.
만약 web 에서 구현 시 servlet 을 사용한다면, 문제가 되겠지. application 을 스케쥴걸어서 동작시키는 것이 좋겠다.
http://okjsp.pe.kr/bbs?act=VIEW&seq=46721&bbs=bbs3&keyfield=content&keyword=pop3&pg=
K사에서 구현 시, 스케쥴러 돌려달라고 요청했음.

http://okjsp.pe.kr/bbs?act=VIEW&bbs=bbs3&keyfield=content&keyword=pop3&seq=23441&pg=2


JavaMail을 찾다가 본 소스 입니다. 실제 실행되는지는 잘 모르겠고요.
한번 해보시기 바랍니다.

일단 메일함에 접근을 하기 위해서는 session과 store, folder라는 세가지가 필요합니다.
그러기 위해선 다음과 같이 import해야 합니다.

import javax.mail.*;
import javax.mail.internet.*;
import javax.actication.*;

private Session sess;
private Store store;
private Folder folder;

그리고 나선 smtp 서버와 pop3 서버에 연결을 해야 겠지요 다음과 같습니다.

Properties prop = System.getProperties();
prop.put("mail.smtp.host",smtp 서버);
sess = Session.getInstance(prop, null); // 세션 smtp 시작

store = sess.getStore("pop3");
store.connect(pop3서버, user, pwd); // pop3 에 스토어로 연결됨

folder = store.getFolder("INBOX"); // store를 통해 편지함에 접근합니다.
folder.open(Folder.READ_ONLY); // Inbox 받은편지함을 엽니다.

이렇게 하면 이제 편지들을 가져 올준비가 됐습니다.
folder.open 메소드에 쓰인 상수는 Javamail API에서 찾아보시기 바랍니다.

가져오는 간단한 예제를 보지여.
Message[] messages = folder.getMessages(); // Message 는 편지를 의미합니다.

//내용을 뽑아내는 부분은 반복문으로 뽑아내시는게 좋을겁니다. for문을 쓰면
for (int i=0;i<messages.length;i++) 이하는 대충 넘어가고

보낸 날짜 받기.. 는 String date = messages[i].getSentDate() // 날짜 포맷에 맞춰 바꾸세요.
사이즈 뽑아내기는 String size = messages[i].getSize() // 사이즈도 포맷에 맞춰 바꾸세요.
보낸 사람 주소 Address addr = messages[i].getFrom()[0];
제목  String subject[] = messges[i].getHeader("subject");
      subject[0] 이 제목입니다.

모든 데이터는 한글 변환 처리 해주셔야 할겁니다.
그리고 연결을 끝낼때는 folder와 store를 닫아 주셔야 합니다.

그리고 위에 코드들을 쓰는 method는 모두 MessageException 처리를 해주셔야 합니다.
꼭 성공하세요.. 저도 소스는 구했지만 테스트를 해볼곳이 없어서 아직 못해봤습니다.


* 메일 내용 받기

Part p = body.getBodyPart(0); 
  
 if(p.isMimeType("text/*")){ 
  Object content = p.getContent();             <------- 요기 
        if (content instanceof String) { 
          mail.contents = (String) content; 
        } else if (content instanceof InputStream) { 
          InputStream in = (InputStream) content; 
          ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
          byte[] buffer = new byte[8192]; 
          int amount = 0; 
          while ((amount = in.read(buffer)) >= 0) { 
            bout.write(buffer, 0, amount); 
          } 
          mail.contents = new String(bout.toString()); 
        } 
 }
 


* 특정 경로의 첨부파일 가져오기


try{  
    Properties props = new Properties();  
    Session session = Session.getDefaultInstance(props, null);  
    Store store = session.getStore("pop3");  
    store.connect(host, user, password);  

    Folder folder = store.getFolder("INBOX");  
    folder.open(Folder.READ_ONLY);  

    Message message[] = folder.getMessages(); 
    for (int i=0, n=message.length; i<n; i++) {  
        if(message[i].isMimeType("text/plain")){ 
            System.out.println("일반텍스트메일입니다."); 
        }else if(message[i].isMimeType("multipart/*")) {   // 첨부파일일때 
            System.out.println("첨부메일입니다."); 
            filename =  part.getFileName();  
            if(filename != null){  
                InputStream in = part.getInputStream();  
                FileOutputStream fout = new FileOutputStream(new File(filename));  
                while(c!=-1){  
                    fout.write(c);  
                    c=in.read();  
                }  
                fout.close();  
                in.close();  
            } 
        } 
    } 
    folder.close(true);  
    store.close();  
}catch(Exception e){  
    System.out.print(e);  
}