Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Java WebMail System Implementation(3)
 
아시는 분은 알겠지만 2001년에 모모 사이트에 돈(무려 900원)받고 올라간 내용인데 요청에 의하여 자바패턴사이트에 다시 공개합니다. ( 2003/04/29 ) 481
Written by ienvyou - 최지웅
1 of 3
 


Session/Store Class

원래 순서상으로 File Attachment부분부터 해야 하지만 사실 그쪽은 javax.activation패키지에 

관련된 내용이라 그부분들에 대해서는 추후에 다루겠다.

* Store class & Folder class


메시지를 받아오는 것은 세션을 사용하여 메시지를 보내는 것과 거의 유사하다고 보면 된다. 

어찌됐든 세션을 얻어온후에, Store객체로 서버에 접속한후

 Authenticator클래스를 통해 접속하면 되기 때문이다. 

Transport 클래스처럼 Store클래스를 통해서 서버에 접속할수 있는 코딩을 아래와 같이 할수 있다. 

IMAP or POP3를 이용하는 경우를 세션을 통해서 모두 보여준다.

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

Store클래스를 통해 서버로 접속후 Folder클래스를 

통해 메시지를 얻어올수 있는데, 여기서 주의할점은 메시지를 얻어내기 전에 

반드시 폴더 클래스가 열려있어야 한다.

아래는 해당 서버의 메시지를 얻어내는 방법을 코딩으로서 보여준다.

Folder folder = store.getFolder("INBOX"); // POP3의 경우 INBOX폴더 만을 가지고 있다.

folder.open(Folder.READ_ONLY);  // 읽기전용으로 폴더를 연다.

Message message[] = folder.getMessages();  // 폴더안의 메시지들을 얻어온다.

POP3를 위해 사용하는 것은 단지 INBOX폴터 뿐이다. 

만약 IMAP을 사용한다면 여러개의 폴더를 얻어올수가 있다.

메시지를 읽기 위해서는 getContent()메소드를 사용하거나 writeTo()메소드를 이용하여 

스트림에 content를 쓸수도 있다. 

getContent()메소드는 단순히 메시지의 내용만을 꺼내오는 역할을 하지만, 

writeTo()메소드는  header를 포함 내용을 얻어내는 역할을 한다.

System.out.println(((MimeMessage)message).getContent());

프로그래밍시 메일을 모두 읽었다면, folder와 store를 모두 닫아주는 내용을 아래와 같이 작성하여 한다.

folder.close(aBoolean);
store.close();

기본적으로 지금까지 설명한 7개의 클래스를 이해하는 것이 JavaMailAPI의 거의 

전부라 해도 과언이 아니다. 7개 이외의 클래스들은 단지 파일첨부, 검색 등등 관련된 것인데 

나중에 그것들에 대하여 알아보도록 하자.

아래의 코드는 메시지를 얻어오는 프로그램을 작성하기 위한 기본골격코드이다.


import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class GetMessageExample {
  public static void main (String args[]) throws Exception {
    String host = args[0];
    String username = args[1];
    String password = args[2];

    // Create empty properties

    // Get session

    // Get the store

    // Connect to store

    // Get folder

    // Open read-only

    BufferedReader reader = new BufferedReader (
      new InputStreamReader(System.in));

    // Get directory

    for (int i=0, n=message.length; i < n; i++) {

       // Display from field and subject

      System.out.println("Do you want to read message? [YES to read/QUIT to end]");
      String line = reader.readLine();
      if ("YES".equals(line)) {

        // Display message

      } else if ("QUIT".equals(line)) {
        break;
      }
    }

    // Close connection 
  }
}
위의 순서를 보고서 채워넣을 수 있다면 API를 잘 활용한 코딩이 될것이다. 문제가 가까운 코딩이 아닐까? 자.. 이제 위 골격코드의 소스코드를 보도록 하자.


import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class GetMessageExample {
  public static void main (String args[]) throws Exception {
    String host = args[0];
    String username = args[1];
    String password = args[2];

    // Create empty properties
    Properties props = new Properties();

    // Get session
    Session session = Session.getDefaultInstance(props, null);

    // Get the store
    Store store = session.getStore("pop3");

    // Connect to store
    store.connect(host, username, password); //단순히 이 내용만으로도 서버로 접속한다.

    // Get folder
    Folder folder = store.getFolder("INBOX");// INBOX폴더로 접근한다.

    // Open read-only
    folder.open(Folder.READ_ONLY); // 당근읽으려면 폴더를 오픈해야 한다.

    BufferedReader reader = new BufferedReader (
      new InputStreamReader(System.in));

    // Get directory
    Message message[] = folder.getMessages(); // 폴더의 메시지를 담아온다.

    for (int i=0, n=message.length; i < n; i++) {

       // Display from field and subject
       System.out.println(i + ": " + message[i].getFrom()[0] 
         + "\t" + message[i].getSubject());

      System.out.println("Do you want to read message? [YES to read/QUIT to end]");
      String line = reader.readLine();

	  //YES를 누르게 되면 해당되는 메일이 내용을 가져온다.
	  // 아래의 경우 POP3 INBOX폴더의 내용을 다운하지 않고 계속 가지고 있게 된다.
      if ("YES".equals(line)) {

        // Display message content
        System.out.println(message[i].getContent());

      } else if ("QUIT".equals(line)) {
        break;
      }
    }

    // Close connection 
    folder.close(false);
    store.close();
  }
}
아고아고.. 쉽지 않은가?? 이제 7개 클래스에 대하여 모두 알아봤다. 이젠 무엇을 할것인가? 아직도 많이 많이 남았다.
 
1 2 3
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD