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(1)
 
아시는 분은 알겠지만 2001년에 모모 사이트에 돈(무려 900원)받고 올라간 내용인데 요청에 의하여 자바패턴사이트에 다시 공개합니다. ( 2003/04/24 ) 1279
Written by ienvyou - 최지웅
4 of 4
 


우선 중요한 클래스들부터 살펴보도록 하자.

 상속도

Major Java Mail API Component를 보면 interface와 해당 클래스를 extends받은 클래스들로 정의된다.

최상위 interface Part가 존재하며 javax.mail.internet.MimePart interface가 이 클래스를 extends받아 사용한다.

 Part 인터페이스는 Message와 BodyPart에 의해 implements되어진다.

 또한 MimePart는 MimeMessage와 MimeBodyPart에 의해 implements되어진다.

 위의 클래스들을 상속받은 많은 클래스들이 core API를 구성하고 있으며, service provider에 의한

 확장이 용이해지는 장점을 가지고 있다. 

 메시지를 보낼때는 Message클래스와 Transport클래스에 의한 구현을 할수 있으며,

 메시지를 받을때는 Store클래스와 Folder클래스를 통하여 해당 시스템의 메일박스(보통 INBOX)를 통해

 Message타입의 데이터를 우리 눈으로 볼수 있는 결과가 된다.



위의 형태로 메시지를 전달할수 가 있다.

여러분들이 중요하게 봐야 할 클래스는 Message와 Transport, Store, Folder, Session 클래스들이다.

또한 Data Handling을 위해서는 javax.activation패키지의 클래스들을 유심히 봐야할 것이다.

사실상 메일은 위 클래스의 메소드를 유효적절하게만 활용을 해도 전달 또는 메일시스템을 구축할수 있다.

자 이제 SMTP를 사용하여 간단한 메일을 전송하여 보도록 하자.

일반적으로 arguments값을 외부로부터 입력받아 사용해야 하지만 바쁜 관계로

String의 배열안에 모두 입력한후 처리하였다.

사실 눈여겨 볼부분은 몇줄 안되며 catch블록이하는 Exception을 처리하기 위한 부분이다.

소스코드를 보도록 하자.



import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class msgsendsample {
     static String msgText = "This is a message body.\nHere's the second line.";
     public static void main(String[] args) {
        // 스트링의 배열값으로 보낼 property값들을 세팅한다. 
        String arg [] ={"ienvyou@orgio.net","ienvyou@javapattern.info", "localhost", "true"};

        System.out.println();

        String to = arg[0]; // 보낼 사람의 주소이다.
        String from = arg[1]; // 보내는 사람의 주소이다.
        String host = arg[2]; // SMTP서버가 돌고 있는 곳의 주소이다. 
        boolean debug = Boolean.valueOf(arg[3]).booleanValue(); //  
        
        Properties props = new Properties();
        props.put("mail.smtp.host", host);

        // 메일을 보낼때 디버깅코드를 화면에 보여줄지를 세팅한다. 
        if (debug) props.put("mail.debug", arg[3]); 
        Session session = Session.getDefaultInstance(props, null);
        session.setDebug(debug); // 해당 세션클래스의 디버깅 옵션을 argument값으로 설정한다.

        try {
            // create a message
            /**
            * MimeMessage는 Message를 extends받고 있으며 메일을 보낼때 필요한 핵심 메소드들을
            * abstract method 또는
            * general method형태로 가지고 있다.
            // MimeMessage객체를 생성하여 javax.mail.Message타입에 넣는다 */
            Message msg = new MimeMessage(session); .
            msg.setFrom(new InternetAddress(from));
            // 보낼 사람의 주소를 InternetAddress형태의 배열로 변환한다.
            //(수신자가 여러명될수 있으므로..); 
            InternetAddress[] address = {new InternetAddress(arg[0])};

            // 수신인을 Message에 세팅한다.
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject("JavaMail APIs Test");
            msg.setSentDate(new Date());
            // If the desired charset is known, you can use
            // setText(text, charset)
            msg.setText(msgText);
            // 아래의 static메소드에 의해 메일발송
            Transport.send(msg);
        } catch (MessagingException mex) {
            System.out.println("\n--Exception handling in msgsendsample.java");
            mex.printStackTrace();
            System.out.println();
            Exception ex = mex;
            do {
                if (ex instanceof SendFailedException) {
                    SendFailedException sfex = (SendFailedException)ex;
                    Address[] invalid = sfex.getInvalidAddresses();
                    if (invalid != null) {
                    System.out.println(" ** Invalid Addresses");
                    if (invalid != null) {
                        for (int i = 0; i < invalid.length; i++) 
                        System.out.println(" " + invalid[i]);
                    }
                }
                Address[] validUnsent = sfex.getValidUnsentAddresses();
                if (validUnsent != null) {
                    System.out.println(" ** ValidUnsent Addresses");
                    if (validUnsent != null) {
                        for (int i = 0; i < validUnsent.length; i++) 
                        System.out.println(" "+validUnsent[i]);
                    }
                }
                Address[] validSent = sfex.getValidSentAddresses();
                if (validSent != null) {
                    System.out.println(" ** ValidSent Addresses");
                    if (validSent != null) {
                        for (int i = 0; i < validSent.length; i++) 
                        System.out.println(" "+validSent[i]);
                        }
                    }
                }
                System.out.println();
                if (ex instanceof MessagingException)
                ex = ((MessagingException)ex).getNextException();
                else
                ex = null;
            } while (ex != null);
        }
    }
    private static void usage() {
       System.out.println("usage: java msgsendsample <to> <from> <smtp> true|false");
    }
}

위의 코드에서 잘 살펴보아야 할부분은 MimeMessage를 생성한후 정보를 세팅하는 일들이다. setXXX메소들에 의해 세팅되어 지며, Transport클래스의 메소들에 의해 실질적인 network infrastructure를 통해 메일이 발송되어 지게 된다. 유심히 본 사람은 Properties클래스가 존재하는데, 왜 있을까? 라는 궁금증이 생길것이다.. 원래 보는 사람들이 후편을 기다리게 만들어야 만드는 사람도 재미있지 않을까? 다음 시간에는 Properties의 역할과 SMTP가 local에 없을경우(orgio나 chollian같은 곳의 smtp)를 인증을 통하여 사용하고 싶을때의 JavaMail에 대하여 이야기할 것이다..
 
1 2 3 4
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD