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