본문 바로가기

밥벌이1 - S/W/Java

JavaMail API

JavaMail

SMTP, NNTP로 메시지를 전달하는 기능

IMAP, POP3로부터 메일을 읽어올 수 있는 기능 제공

MIME형식을 지원해주므로 여러 가지 형식의 데이터를 주고 받을 수 있습니다.

n      송신자와 수신자 모두 이메일 서버의 클라이언트가 된다.

q     송신자는 메시지를 작성하여 이메일 서버로 보낸다.

q     서버는 SMTP(Simple Mail Transfer Protocol)를 사용해서 인터넷 상의 다른 이메일 서버에 있는 수신자의 메일 박스에 메시지를 보낸다.

q     메시지 수신자는 POP3(Post Office Protocol)이나 IMAP(Internet Message Access Protocol)등의 수신 프로토콜을 사용해 자신의 이메일 서버에서 메시지를 가져온다.

 

 

 

개발 환경 설정

J2EE를 설치했다면 JavaMail API를 사용할 준비가 된 것입니다.

J2EE를 설치하지 않았다면

http://java.sun.com/products/javamail/downloads/index.html에서 javamail-1_3_2-upd.zip 다운로드

JavaMail 패키지는 임의적으로 커질 수 있는 데이터 덩어리를 다루기 위해JavaBeans Activation Framework (JAF)를 필요로 하므로 http://java.sun.com/products/javabeans/glasgow/jaf.html에서 jaf1_0_2.zip 다운로드

압축을 풀어 activation.jar와 mail.jar파일을 classpath로 지정

 

n      메시지 구성

q     헤더(header)

n      메시지의 발신자, 메시지 발송 시각 등의 특정 메시지에 대한 속성을 정의하는 name-value의 쌍

q     바디(body)

n      실제 이메일 메시지

n      128 문자의 ASCII 문사셋

n      SMTP

q     Simple Mail Transfer Protocol

q     메일 서버가 다른 메일 서버와 메시지를 주고받기 위해 사용하는 프로토콜

q     TCP 포트 25에서 네 문자로 이루어진 클라이언트 명령문과 세 자리수의 서버 응답 코드를 통해 일어난다.

q     매우 제한적인 서버 측 처리를 허용

n      POP3

q     Post Office Protocol 3

q     메시지 수신자가 메일 서버의 메일함에 저장된 이메일 메시지를 가져올 수 있게 해주는 프로토콜

q     TCP 포트 110에서 작동

q     일련의 요청과 응답 코드 사용

q     메일함에서 메시지를 내려 받으려면 사용자는 ID와 암호를 입력하는 식의 인증과정을 거쳐야 한다.

q     클라이언트에서 사용

q     이메일 서버의 메시지를 나열, 삭제 또는 자기 메일함으로 가져올 수 있다.

n      IMAP

q     Internet Message Access Protocol

q     메시지를 가져오는 데 사용하는 프로토콜

q     요청, 응답 방식으로 작동

q     TCP 포트 143번

q     POP3보다 훨씬 많은 클라이언트 측 작업 요청을 서버에 전달

q     어떤 메시지를 자신의 컴퓨터에 내려받기 전에 메시지의 제목과 크기, 보낸이의 메일 주소를 확인할 수 있다.

q     폴더의 작성, 삭제, 조작이 가능하고 폴더 간에 메시지를 이동할수 있다.

n      MIME

q     메시지 body에서 US-ASCII이외의 문자 사용

q     메시지 바디에서 이미지와 같은 비-텍스트 메시지 사용 가능

q     멀티 부분 메시지 body

q     헤더 정보에서 US-ASCII 이외의 문자 사용 가능

q     메시지 body의 길이 제한 없음

q     GIF 이미지나 MPEG 동영상과 같은 다양한 종류의 데이터에 대한 표준 인코딩을 제공

q     클라이언트가 메시지의 body에 담긴 데이터를 압축 해제, 디코딩, 번역할 수 있도록 추가적인 메시지 헤더를 정의하고 있다.

 

JavaMail API

n      일반적인 이메일 모델을 제공

n      플랫폼과 프로토콜 독립적인 코딩 가능

n      텍스트 단독 메시지, 첨부 파일이 추가된 메시지 또는 binary 데이터가 혼합된 메시지와 같이 다양한 메시지를 간단히 작성할수 있게 해준다.

n      SMTP, POP3, IMAP 프로토콜을 지원

n      javax.mail  패키지는 이메일 시스템에 해당하는 클래스 제공

n      javax.mail.internet 패키지는 인터넷 이메일과 관련한 클래스들을 제공

n      SMTP 호스트를 시스템 프로퍼티로서 설정할 수 있게 해주는 java.util.Properties 패키지

n      SMTP 호스트는 smtp.host 또는 mail.host 형식을 갖는다.

n      메일 환경 속성

속성

설명

Mail.store.protocol

디폴트 메시지 액세스 프로토콜

Mail.transport.protocol

디폴트 메시지 전송 프로토콜

Mail.host

디폴트 메일 서버. 디폴트는 로컬 머신

Mail.user

메일 서버에 접속할 때에 사용되는 기본 사용자 명

Mail.protocol.host

특정 프로토콜에 대한 메일 서버.디폴트는 mail.host

Mail.protocol.user

특정 프로토콜에 대한 메일 서버 접속용 사용자 명, 디폴트는 mail.user

Mail.from

현재 사용자의 답장을 받을 주소,(즉 보내는 이의 이메일 주소) 디폴트는 username@host

Mail.debug

디버그가 가능한지 불가능한지를 정한다, 디폴트는 false로 디버깅 블가능

 

n      메일의 Session 객체 생성

n      Message 클래스는 하나의 이메일 메시지를 나타낸다.

n      추상 클래스이므로 서브 클래스로 구현해야 한다.

n      MimeMessage객체의 setText()메소드는 메시지 내용만 설정하는 것이 아니라 메시지의 컨텐트 타입을 설정

n      setSubject() 메시지의 제목

n      setFrom() 발신자의 주소

n      RecipientType 내부 클래스 이메일 메시지의 수신자의 종류를 정의

n      BCC : Blind carbon copy(숨은 참조인)

n      CC : Carbon copy (참조인)

n      TO : TO (받는 사람)

n      addRecipient() 수신자 주소를 정한다.

n      MessagingExcepion

n      Transport 클래스

n      메시지를 보낼수 있게 해준다

n      send()

n      MessagingException, SendFailedException

import java.util.Properties;

import javax.mail.*;

import javax.mail.internet.*;

 

public class SendMail {

    public static void main(String[] args) {

        if (args.length!=3) {

            System.out.println("Usage: SendMail SMTPHost ToAddress FromAddress");

            System.exit(1);

        }

 

        String smtpHost = args[0];

        String to = args[1];

        String from = args[2];

 

        //  properties object 얻기

        Properties props = System.getProperties();

 

        // SMTP host property 정의

        props.put("mail.smtp.host",smtpHost);

 

        try {

            //  session 얻기

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

 

            // 새로운  message object 생성

            MimeMessage message = new MimeMessage(session);

 

            // 일반적인  message object 채우기

            message.setText("안녕하세요? 자바 세상입니다.^^");

            message.setSubject("Hi!");

            message.setFrom(new InternetAddress(from));

            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

            System.out.println("Message Sent");

 

            // message 보내기

            Transport.send(message);

        }

        catch (MessagingException me) {

            System.err.println(me.getMessage());

        }

    }

}

 

//실행방법

//java SendMail mail.자신의 SMTP 호스트.com 받는 주소 보내는 주소

 

n      HTML 메시지 생성

q     HTML 코드가 보여지는 이미지의 위치를 URL로서 참조하도록 만든다.

n      클라이언트에 메일 메시지가 존재하는 동안 이미지가 계속해서 그 위치에 존재해야 한다.

n      이메일 클라이언트가 항상 인터넷에 연결되어 있거나 그 이미지를 자신의 컴퓨터에 복사하여 가지고 있어야 한다.      

n      Message객체의 setContent(msg, contentType)을 이용하여 MIME 타입 정의

q     메일 메시지에 이미지를 통합하는 것

n      수신자가 항상 이미지를 볼 수 있도록 하는 방법

n      용량이 큰 메시지의 전송시에 메일 서버 부하에 걸린다.

n      HTML 메시지를 나타내는 부분과 이미지를 나타내는  부분으로 구성되는 multi-part 메시지를 만든다.

n      BodyPart 객체 생성

q     setDataHandler()를 이요해서 BodyPart 오브젝트에 이미지를 추가

n      MimeMultipart 객체 생성

q     BodyPart오브젝트를 추가

q     setHeader() 이용, 헤더 설정

import java.util.Properties;

import javax.mail.*;

import javax.mail.internet.*;

import java.io.*;

 

public class SendHTMLMail {

    public static void main(String[] args) {

        if (args.length!=3) {

        System.out.println("Usage: SendHTMLMail SMTPHost ToAddress FromAddress");

            System.exit(1);

        }

 

        String smtpHost = args[0];

        String to = args[1];

        String from = args[2];

        String contentType = "text/html";

        String htmlFile = "HTMLSource1.html";

 

        // properties object 얻기

        Properties props = System.getProperties();

 

        //  SMTP host property 정의

        props.put("mail.smtp.host",smtpHost);

 

        try {

            // session 얻기

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

 

            // 새로운 message object 생성

            MimeMessage message = new MimeMessage(session);

 

            // 일반적인  message object 채우기

            message.setSubject("Hi!");

            message.setFrom(new InternetAddress(from));

            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

 

            // HTML source  읽기

            String msg="";

            String line=null;

            FileReader fr = new FileReader(htmlFile);

            BufferedReader br = new BufferedReader(fr);

            while ((line=br.readLine())!=null) {

                msg+=line;

            }

 

            //  message 객체에 내용 추가

            message.setContent(msg,contentType);

 

            //  message 보내기

            Transport.send(message);

        }

        catch (MessagingException me) {

            System.err.println(me.getMessage());

        }

        catch (IOException ioe) {

            System.err.println(ioe.getMessage());

        }

    }

}

 

n      첨부물이 있는 이메일

q     MimeMultipart 오브젝트 생성

q     MimeMultipart 생성자에게 related(MIME의 서브 타입)파라미터를 넘겨준다.

n      서로 다른 body부분들이 하나의 복합 오브젝트를 형성하기 위해 연결

q     MimeMultipart 오브젝트 추가하기 전에 바디 부분과 연관된 파일 이름을 설정

n      MimeBodyPart 의 setFileName() 사용

q     IllegalWriteExeption 예외는 기본을 이루는 구현부가 수정되었을 때 발생

import java.util.Properties;

import javax.mail.*;

import javax.mail.internet.*;

import javax.activation.*;

 

public class SendAttachmentMail {

    public static void main(String[] args) {

        if (args.length!=4) {

        System.out.println("Usage: SendAttachmentMail SMTPHost ToAddress FromAddress AttachmentName");

            System.exit(1);

        }

 

        String smtpHost = args[0];

        String to = args[1];

        String from = args[2];

        String contentType = "text/html";

        String fileName = args[3];

 

        // Get properties object

        Properties props = System.getProperties();

 

        // Define SMTP host property

        props.put("mail.smtp.host",smtpHost);

 

        try {

            // Get a session

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

 

            // Create a new message object

            MimeMessage message = new MimeMessage(session);

 

            // Populate message object

            message.setSubject("Hi!");

            message.setFrom(new InternetAddress(from));

            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

 

            // Create the message body part

            BodyPart messageBodyPart = new MimeBodyPart();

            messageBodyPart.setText("Here's an attachment!");

            Multipart multipart = new MimeMultipart();

            multipart.addBodyPart(messageBodyPart);

 

            // Create the attachment body part

            messageBodyPart = new MimeBodyPart();

            DataSource source = new FileDataSource(fileName);

            messageBodyPart.setDataHandler(new DataHandler(source));

            messageBodyPart.setFileName(fileName);

            multipart.addBodyPart(messageBodyPart);

 

            // Put parts in message

            message.setContent(multipart);

 

           // Send the message

           Transport.send(message);

        }

        catch (MessagingException me) {

            System.err.println(me.getMessage());

        }

        catch (IllegalStateException ise) {

            System.err.println(ise.getMessage());

        }

    }

}

 

n      메시지 수신

q     수신 프로세스의 주어진 호스트에 있는 저장소에 연결

n      Session의 getStore()를 호출하여 Store 생성

n      getStore()-수신할때 사용할 프로토콜을 나타내는 파라미터를 받고 그 프로토콜을 구현할 Store 반환

q     메시지 폴더를 열기 위해 Folder 생성

n      Folder 추상 클래스이므로 Store의 getFolder() 로 생성

n      Foder의 open() 이용 READ_ONLY, READ_WRITE mode제공

q     메시지를 전달받기 위해 Folder의 getMessage() 사용

q     Message의 getITEM()을 이용하여 전체 목록을 가져온다.

q     Message는  Part 인터페이스를 구현, writeTo() 상속

n      바이트 스트림을 특정 출력 스트림으로 바꿔 화면에 표시

n      java.io.IOException

q     Folder 와 Store  해제 close()

import java.util.Properties;

import javax.mail.*;

import javax.mail.internet.*;

import java.io.*;

 

public class RetrieveMail {

    public static void main(String[] args) {

        if (args.length!=3) {

        System.out.println("Usage: RetrieveMail POPHost username password");

            System.exit(1);

        }

 

        String host = args[0];

        String username = args[1];

        String password = args[2];

 

        try {

            // Create empty properties object

            Properties props = new Properties();

 

            // Get a session

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

 

            // Get the store and connect to it

            Store store = session.getStore("pop3");

            store.connect(host, username, password);

 

            // Get folder and open it

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

            folder.open(Folder.READ_ONLY);

 

            // Get messages

            Message messages[] = folder.getMessages();

 

            for (int i=0; i<messages.length; i++) {

                System.out.println(i + ": " + messages[i].getFrom()[0] + "\t" + messages[i].getSubject() + "\t" + messages[i].getSentDate() + "\n\n");

                messages[i].writeTo(System.out);

            }

 

            // Close resources

            folder.close(false);

            store.close();

        }

        catch (MessagingException me) {

            System.err.println(me.getMessage());

        }

        catch (IOException ioe) {

            System.err.println(ioe.getMessage());

        }

    }

}

 

n      메시지 삭제

q     Flags.Flag는 미리 정의된 고정 필드로서 플래그 제공

n      POP3 메일 서버들은 전형적으로 오직 DELETED 플래그만 지원

q     Folder의 getPermanentFlags()는 서버가 지원하는 모든 플래그를 포함하는 Flags  반환

n      ANSWERED-클라이언트가 메시지에 응답했음을 나타낸다.

n      DELETED-메시지가 삭제를 위해 표시되었음을 나타낸다.

n      DRAFT-메시지가 아직 열리지 않은 초기 상태임을 나타낸다.

n      FLAGGED-메시지가 클라이언트에 의해 플래그를 지정받았음을 나타낸다.

n      RECENT-메시지가 최근에 열린 후 폴더에 도착한 것임을 나타낸다.

n      SEEN-메시지가 클라이언트에 의해 반환되었음을 나타낸다.

n      USER-폴더가 사용자가 정의한 플래그들을 지원함을 나타낸다.

q     Message의 setFlag()는 삭제할 메시지를 표시하기 위해 사용

n      첨부물 수신

q     Part 인터페이스의 getDisposition(), getFileName()

n      각 부분의 종류와 파일명을 얻기 위해 정의된 메소드

n      ATTACHMENT

n      INLINE- 코드가 body 부분에 메시지 안에 포함되어 출력

q     writeFile()

n      Body 부분의 내용을 파일로 만드는 역할