[JavaMail]

Android/Libraries 2014. 7. 24. 18:18 |

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

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


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

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

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

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

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



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.store.protocol 디폴트 메일 서버. 디폴트는 로컬 머신
 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());
        }
    }
}


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 부분의 내용을 파일로 만드는 역할



* JavaMail 라이브러리를 사용하려면..

1. http://java.sun.com/products/javamail/downloads/index.html 에서 

javamail-1_3_2-upd.zip 라이브러리 다운로드

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




Posted by 소망아기
: