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

Authenticator

java.net 패키지에도 Authenticator도 있다. JavaMail API는 java.net패키지처럼 사용자이름과 

패스워드정보등을 통해 자원에 접근하게 하는 장점도 가지고 있다.

여기서 말하는 자원(resource)는 즉 메일 서버를 말하는 것인데, Authenticator는

javax.mail 패키지에 정의되어 있다(당근 java.net패키지와는 다르다)

Authenticator를 사용하기 위해서는 해당 Authenticator클래스를 상속한 PasswordAuthenticator

클래스로부터 인스턴스를 생성하고 getPasswordAuthentication() 메소드를 리턴시켜야 한다.

Authenticator를 사용하기 위해서는 반드시 세션을 생성하여 사용해야 하며, 

인증이 필요한경우 해당 세션이 Authenticator에게 인증시도를 통보하게 된다.


인증시에는 환경설정파일에 저장되어 있는 username과 password 또는 윈도우의 팝업창을 

띄움으로서 해당값을 입력받게 되고, PasswordAuthentication의 객체를 리턴할수 있도록 한다.

Properties props = new Properties(); // 프로퍼티 생성
Authenticator auth = new MyAuthenticator();  // Authenticator를 상속받은 클래스객체의 생성
Session session = Session.getDefaultInstance(props, auth); //세션생성

class MyAuthentication extends Authenticator {
    PasswordAuthentication pa;
    public MyAuthentication(){
        pa = new PasswordAuthentication("your_id","your_password");
    }
    public PasswordAuthentication getPasswordAuthentication() {
        return pa;
    }
}

위의 내용이 필요할 경우 세션객체에 인증을 해야된다는 걸 시스템측으로 통지하기 위해 
props.put("mail.smtp.auth","true");
라인이 반드시 들어가 있어야 한다.

자.. 예전에 했던 msgsendsample클래스를 local smtp가 아닌 외부 smtp서버에 인증을 

시도함으로서 사용하도록 해보겠다.




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 msgsendsample() {
   String arg [] ={"ienvyou@orgio.net","ienvyou@openitech.co.kr", "openitech.co.kr", "true"};
	
   System.out.println();
		
   String to = arg[0];
   String from = arg[1];
   String host = arg[2];
   System.out.println("babo!!");
   boolean debug = Boolean.valueOf(arg[3]).booleanValue();
    // create some properties and get the default Session
    Properties props = new Properties();
    props.put("mail.smtp.host", host);
	
     // 반드시 프로퍼티에 세팅되어 있어야 한다. 아니면 인증을 시도하지 않는다.
    props.put("mail.smtp.auth","true");  
	
    Authenticator auth = new MyAuthentication();
		
    if (debug) props.put("mail.debug", arg[3]);

    Session session = Session.getDefaultInstance(props, auth);
    session.setDebug(debug);
		
    try {
    // create a message
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(from));
        InternetAddress[] address = {new InternetAddress(arg[0])};
        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);

        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);
        }
    }

       public static void main(String[] args) {
            new msgsendsample();
        }
    private static void usage() {
        System.out.println("usage: java msgsendsample <to> <from> <smtp> true|false");
    }
}


class MyAuthentication extends Authenticator {
    PasswordAuthentication pa;
    public MyAuthentication(){
        pa = new PasswordAuthentication("your_id","your_password");  
    // 여러분들이 사용하고 있는 smtp server의 아이디와 패스워드를 입력한다.
}

	// 아래의 메소드는 시스템측에서 사용하는 메소드이다.
    public PasswordAuthentication getPasswordAuthentication() {
        return pa;
    }
}
 
1 2 3 4
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD