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 ) 482
Written by ienvyou - 최지웅
2 of 3
 


Delete/Reply Message

* Deleting Messages and Flags


메시지를 삭제하는 작업은 메시지들과 연관된 플래그값을 조정함으로서 이루어진다.

메시지들을 위해 서로다른 상태를 위한 각각의 플래그들이 존재하는데, 여기에는 몇가지 

시스템정의 상태와 사용자정의 상태로 나눌수 있다.  

미리 정의된 플래그는 inner class인 Flags.Flag클래스안에 정의되어 있다.

플래그들의 리스트는 아래와 같다.

Flags.Flag.ANSWERED 
Flags.Flag.DELETED 
Flags.Flag.DRAFT 
Flags.Flag.FLAGGED 
Flags.Flag.RECENT 
Flags.Flag.SEEN 
Flags.Flag.USER 

위의 플래그값들은 모든 메일서버또는 provider가 제공해주지는 않는다. 

예를 들면 메시지를 삭제하는 측면에서 POP프로토콜은 그러한 플래그값들을 

제공해주지 않기때문이다. 

새로운 메일을 체크하는 것은 POP task가 아니라 하나의 메일클라이언트이기 때문이다.

만약 플래그값을 지원하는 지 알아보려면 folder클래스의getPermanentFlags()메소드를 

사용하여 값을 얻어보면 된다.

이제 실질적인 메시지들을 삭제하기 위해서는 DELETED플래그가 아래처럼 세팅되어져 있어야 한다.

message.setFlag(Flags.Flag.DELETED, true);

위의 경우처럼 하기 위해서는 당연히 folder가 READ_WRITE형태로 오픈되어 있어야 함은 물론이다.

folder.open(Folder.READ_WRITE);

모든 메시지에 대한 처리가 끝났다면 다시 폴더를 닫아주는 일을 처리해야 할것이다.

folder.close(true);

Folder의 expunge()메소드를 메시지를 삭제하기 위하여 유용하게 사용된다.

(Sun의 POP3 provider는 제공하지 않는다.)

플래그값을 해제시킬때에는 setFlag()메소드에 false값만 세팅시키면 된다.

현재 플래그의 세팅값을 알아보려면 isSet()메소드를 사용하여 알아보면 된다.

* Reply Message

Message클래스는 reply()라는 메소드를 포함하고 있는데, 새로운 메시지를 수신자, 

제목에 "Re:"를 포함하게 한다. 여기에는 메시지를 위해 어떠한 content도 추가되지 않으며, 

단지 새로운 수신자를 위한 reply-to헤더 또는 from(발신인)의 정보만 복사하게 된다.
 
 이 메소드는 true또는 false값을 가질수 있는 모든 사람에게 reply할경우에는 true값을 세팅하며, 

단지 보낸 한 사람에게 reply할경우에는 false값을 세팅하면 된다.

 아래의 보기이다.

MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("president@chungwadae.go.kr"));
reply.setText("Thanks");
Transport.send(reply);

메시지를 보낼때  reply-to주소를 설정하는것은 setReplyTo()메소드를 사용하면 된다.

아래는 핵심골격코드이다.. 주석으로 막아논 부분이 Reply시킬때 사용하는 부분이며, 

회신하기 위해서는 폴더의 메시지들을 가져와야 하는것은 당연하다.


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

public class ReplyExample {
  public static void main (String args[]) throws Exception {
    String host = args[0];
    String sendHost = args[1];
    String username = args[2];
    String password = args[3];
    String from = args[4];

    // Create empty properties
    Properties props = System.getProperties();
    props.put("mail.smtp.host", sendHost);

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

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

    // Get folder
    Folder folder = store.getFolder("INBOX");
    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++) {
       System.out.println(i + ": " + message[i].getFrom()[0] 
         + "\t" + message[i].getSubject());

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

        // Set the from field

        // Create the reply content, copying over the original if text

        // Set the content

        // Send the message
      } else if ("QUIT".equals(line)) {
        break;
      }
    }

    // Close connection 
    folder.close(false);
    store.close();
  }
}
아래는 store인증 및 send인증을 모두 결합한 코드이며 현재 가지고 있는 놀새계정으로 테스트해볼수 있으며, 복사만 하여도 돌아가게끔 만들었다. 모두 테스트해보기 바란다.


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

public class ReplyExample {
  public static void main (String args[]) throws Exception {
    String host = "openitech.co.kr";
    String sendHost = "openitech.co.kr";
    String username = "ienvyou";
    String password = "0000";
    String from = "ienvyou@orgio.net";

    // Create empty properties
    Properties props = System.getProperties();
    props.put("mail.smtp.host", sendHost);
	props.put("mail.smtp.auth","true");

	Authenticator auth = new MyAuthentication();
    // Get session
    Session session = Session.getDefaultInstance(props, auth);
	session.setDebug(true);


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

    // Get folder
    Folder folder = store.getFolder("INBOX");
    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++) {
       System.out.println(i + ": " + message[i].getFrom()[0] 
         + "\t" + message[i].getSubject());

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

        // Create a reply message
        MimeMessage reply = (MimeMessage)message[i].reply(false);

        // Set the from field
        reply.setFrom(new InternetAddress(from));

        // Create the reply content, copying over the original if text
        MimeMessage orig = (MimeMessage)message[i];
        StringBuffer buffer = new StringBuffer("Thanks\n\n");
        if (orig.isMimeType("text/plain")) {
          String content = (String)orig.getContent();
          StringReader contentReader = new StringReader(content);
          BufferedReader br = new BufferedReader(contentReader);
          String contentLine;
          while ((contentLine = br.readLine()) != null) {
            buffer.append("> ");
            buffer.append(contentLine);
            buffer.append("\r\n");
          }
        }

        // Set the content
        reply.setText(buffer.toString());

        // Send the message
        Transport.send(reply);

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

    // Close connection 
    folder.close(false);
    store.close();
  }
}


class MyAuthentication extends Authenticator {
	PasswordAuthentication pa;
	public MyAuthentication(){
		pa = new PasswordAuthentication("ienvyou","0000");
	}
	public PasswordAuthentication getPasswordAuthentication() {
		return pa;
	}
}
다음편에는 메시지포워딩에 대해 알아보겠다.
 
1 2 3
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD