본문 바로가기
Java

[펌] 자바메일┃02. 주요 class

by 사우람 2010. 7. 12.

자바누리(http://www.javanuri.com/)에서 퍼왔습니다.

강사명: 유용근

소속: 제이컴텍(주)

E-mail: ykyu@javanuri.com

 

 

 

JavaMail API 추상적 구조 계층 근간을 이루는 패키지는 javax.mail 패키지이다.

 

실제 주로 사용되는 패키지는

javax.mail을 인터넷 메일로 구현하고 있는javax.mail.internet 패키지 이지만

JavaMail API의 전체적인 구조를 파악하기 위해서는 우선 javax.mail 패키지를 알아야 한다.

 

javax.mail 패키지의 주요 클래스는

Session, Message, Address, Authenticator, Transport Store, Folder 등이 있다.

이들은 메시지를 만들고 전송하고 또 메일 서버에 있는 메시지를 꺼내오는데 개념적으로 중요한 역할을 한다. 이러한 클래스들의 주요 기능과 역할은 다음과 같다.

 

Session

메일 처리를 시작하는데 필요한 클래스로서 메일 처리 환경을 설정하고, 처리에 필요한
객체들을 생성해내는 역할을 한다. 메일 작업을 시작하려면 우선 Session 객체가 필요하다.
환경 설정을 위하여 java.util.Properties 를 사용하여 파라미터를 사용하며, 새로 객체를 생성하는 constructor는 private이기 때문에 사용할 수 없고, 다음과 같이 getDefaultInstance 메소드를 통하여 객체를 얻을 수 있다.

 

Properties props = new Properties(); // props 에 적절한 파라미터를 채움

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

 

getDefaultInstance의 두번째 파라미터는 Authenticator인데 이는 차 후에 다루도록 하겠다.

 

Message

메일의 메시지를 의미하는 클래스로서 수신자/송신자/유형 등 헤더 부분과 본문 부분등 을 처리할 수 있도록 만들어진 클래스이다. 메시지의 기초 부분을 의미하는 Part 인터페이스를
implement 하고 있으며 Part는 메시지가 갖추어야한 기본적 요소를 정의하고 있다. Message는 기본적으로 추상 클래스이므로 실제 이를 상속받아 구체적 인터넷 메일 메시지를 구현한 클래스를 사용하기 위해서는 javax.mail.internet.MimeMessage를 주로 사용한다.

다음은 간단한 메시지를 생성해내는 예제이다.

MimeMessage message = new MimeMessage(session);
message.setSubject("테스트 제목");
message.setText("테스트 메일 입니다.");

 

Address

메시지를 송/수신하는 메일 주소를 추상한 클래스이다. 이 클래스도 추상 클래스이므로
인테넷 메일을 주소 클래스를 사용하려면 javax.mail.internet.InternetAddress를 사용한다.

다음은 "xxx@javanuri.com"이라는 인터넷 주소를 InternetAddress클래스를 사용하한 객체로 만들어 Message의 setFrom 메소드를 이용하여 송신자를 표시하는 예제이다.

 

Address address = new InternetAddress("xxx@javanuri.com", "홍길동");
message.setFrom(address);

 

메일 메시지의 수신자를 지정하는데는 Message 클래스의 addRecipient 메소드를 사용하는데
이 메소드 역시 Address 객체를 파라미터로 받아들인다. 송신자의 구분은 Message 객체에
RecipientType 이라는 상수로 정의되어 있다. 다음은 송신자, 참조자, 숨김 참조자를 메시지에 지정하는 예제이다.

Address toAddr = new InternetAddress("xxx@javanuri.com");
Address ccAddr = new InternetAddress("yyy@javanuri.com");
Address bccAddr = new InternetAddress("zzz@javanuri.com");

message.addRecipient(Message.RecipientType.TO, toAddr);
message.addRecipient(Message.RecipientType.CC, ccAddr);
message.addRecipient(Message.RecipientType.BCC, bccAddr);

 

Authenticator

주로 네트웍이나 서버에 연결할 때 사용자 아이디 및 암호 확인에 사용되는 추상 클래스이다. 사용자 인증을 위하여 Authenticator 클래스를 사용하려면 이 클래스를 상속을 받아 자신만의 클래스를 만들어 인증 방법을 구현해야 한다. 주로 사용자 인증에 관한 자신만의 고유 방법이 있거나 사용자 아이디와 암호를 묻는 화면을 만들때 사용한다. 상속하는 클래스를 만들 때는Authoticator에 있는 getXXX() 메소드를 override 하면 된다.

get 메소드 중에서 getPasswordAuthentication()은 사용자 아이디와 암호가 있는
PasswordAuthentication 객체를 리턴하도록 되어 있는데 PasswordAuthentication 객체는 화면 또는 적절한 방법에 의하여 아이디와 암호를 얻은 후에 생성하여 리턴하면 된다.

Session 생성시에 Authenticator를 파라미터로 주면 session이 필요한 시점에 사용자 아이디와
암호를 묻을 수 있도록 응용프로그램을 작성할 수 있다. 다음은 MyAuthenicator라는 새로운
클래스를 Authenticator로부터 상속받아 만들었다고 가정하고 session을 생성하는 예제이다.

Properties props = new Properties();
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);


Transport

메세지를 최종적으로 전달하는 클래스이다. 이 클래스도 추상 클래스로서 구체적 구현은 프로토콜 마다 다르게 할 수 있도록 구성되어 있다. 하지만 인터넷 메일을 일반적으로 SMTP 프로토콜에 의하여 전달된다. 메시지를 기본 SMTP 프로토콜을 이용하여 전달하려면 static 메소드인 Transport.send(Message msg)를 이용하면 된다. 프로토콜에 의하여 메시지를 전달하려면 다음 예제와 같이 Session 객체의 getTransport 메소드를 이용한다.

Transport trans = session.getTransport("smtp");
trans.connect("www.javanuri.com", "xxxx", "yyyy");
trans.sendMessage(message, message.getAllRecipients());
trans.close();


Store

메시지를 저장하고 있는 장소를 추상화한 클래스인데, 메시지 저장은 메일 서버에서 하게된다. Store는 메일 서버와 연결이 되어 있어 저장된 메시지를 Store 객체를 통하여 가져올 수 있다. 다음은 Session 객체에서 POP3 프로토콜을 이용하여 Store 객체를 가져와 서버와 연결하는 예제이다.

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

 

Folder

메시지를 분류해 놓은 장소를 추상화한 클래스이다.

서버에 따라 메시지는 수신함 "INBOX", 발신함 "OUTBOX" 등 여러가지 폴더를 갖을 수 있다.

하지만 POP3 프로토콜을 "INBOX" 폴더만을 지원한다.

폴더는 메시지를 저장하고 있는 Store 객체 안에서 찾을 수 있다.

다음은 Store 객체로부터 "INBOX" 폴더를 가져와 그 안에 있는 메시지를 가져오는 예제이다.

Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

 

Part

Message 와 BodyPart등의 메일을 이루는 부분들을 공통적 기반이되는 interface로서 내용과 그 내용에 대한 속성들로 이루어져 있다. 하나의 메일에는 여러 부분의 내용이 서로 형식을 달리하여 있을 수 있고 또 첨부 화일이나 자료가 여러가지가 있을 수 있다. 이러한 하나 하나의 구성요소가 Part라 볼 수 있고, 여러가지 형태가 복합되어 있는 것을 multipart라 한다. 이러한 메일 메시지의 기반을 이루고 있는 것이 바로 Part interface이다.

 

위에서 다룬 javax.mail 패키지들의 모두 추상 클래스이거나 인터페이스 이다.

이를 상속 받아 인터넷 메일 쪽으로 구현한 패키지는 javax.mail.internet 패키지이다.

한지만 javax.mail.internet 패키지에서도 구체적 MIME 형태의 메시지인 MimeMessage를 주로 다룬다. 즉 메시지 내용을 어떻게 구성하는지에 관한 클래스들이다. 메일에서 중요한 전송과 수신 즉 Transport와 Store에 관한 구현클래스는 없다. 기본적으로 Transport와 Store는 제 3의 제공자 (Provider)가 해당 프로토콜에 맞도록 구현하여 제공하도록 되어 있다. JavaMail 패키지에는 SUN사가 Provider가 되어 Transport와 Store 클래스를 상속받아 만든 com.sun.mail 패키지가 클래스 형태로 포함되어 있고 디폴트로 이 클래스를 사용하도록 설정되어 있다. 어떤 Provider가 제공하는 클래스들을 사용할 것인가는 Session 객체가 설정된 환경 및 properties를 가지고 결정을 한다. Session 객체는 다음 이름의 파일들을 읽어들여 Provider를 결정하고 제공하는 클래스들을 사용한다.

javamail.providers
javamail.default.providers

위의 파일들의 위치를 찾는 순서는 우선 JRE의 홈디렉토리, 다음의 Jar 파일의 META-INF 등의 순서로 다음과 같이 찾는다.

1. java.home/lib/javamail.X
2. META-INF/javamail.X
3. META-INF/javamail.default.X

 

다음의 JavaMail 패키지의 mail.jar안에 있는 META-INF/javamail.default.providers의 내용이다.
이러한 내용이 기본적으로 설정되어 있기 때문에 Session 객체는 com.sun.mail 패키지의 클래스들을 사용하는 것이다. 만일 제3의 Vendor가 제공하는 클래스를 사용하려면 다음 내용을 바꾸어주면 된다.

javamail.default.providers
====================================================

# JavaMail IMAP provider Sun Microsystems, Inc
protocol=imap; type=store; class=com.sun.mail.imap.IMAPStore; vendor=Sun Microsystems, Inc;
# JavaMail SMTP provider Sun Microsystems, Inc
protocol=smtp; type=transport; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc;
# JavaMail POP3 provider Sun Microsystems, Inc
protocol=pop3; type=store; class=com.sun.mail.pop3.POP3Store; vendor=Sun Microsystems, Inc;