import java.awt.event.*; // 각 컴포넌트에 대한 이벤트를 작성하기 위한 패키지
import javax.swing.*; // 스윙 컴포넌트를 사용하기위한 패키지
import java.net.*; // 네트워크 클래스를 사용하기 위한 패키지
import java.io.*; // 입출력 스트림을 사용하기 위한 패키지

 

public class MailSender extends JFrame implements ActionListener{

    // 보낸이, 받는이, 제목을 입력 받기 위한 텍스트 상자

    //private JTextField from, to, suject;

    private JTextField from, to, subject;

    // 메일 본문 작성으로 위한 텍스트 상자
    private JTextArea data;

    // 메일보내기 버튼, 모든 텍스트상자 지우기버튼, 종료 버튼
    private JButton send, clear, exit;

    // SMTP서버에 접속하기 위한 서버주소와 도메인을 담는 변수
    private String server, domain;

   

    // MailSender 생성자(객체 생성시 자동으로 호출)

 //public void MailSender(String server, String domain) { 생성자는 반환형이 없음

    public MailSender(String server, String domain) {

         // 부모 클래스의 생성자를 호출해 창의 제목을 설정
        //Super("send Mail");

        super("send Mail");

        // 생성자로 넘어온 SMTP서버의 주소와 도메인을 각 변수에 할당
        this.server = server;
        this.domain = domain;
  

        // 각 컴포넌트를 생성해 이벤트연결
        from = new JTextField();
        to = new JTextField();
        subject = new JTextField();
        data = new JTextArea();
        send = new JButton("SEND");
        send.addActionListener(this);
        clear = new JButton("CLEAR");
        clear.addActionListener(this);
        exit = new JButton("EXIT");
        exit.addActionListener(this);

 

        // 각 컴포넌트를 패널에 위치 시킴

        JPanel c = new JPanel(new PositionLayout());
        c.add("5%, 2%, 20%, 9%", new JLabel("FROM: "));
        c.add("25%, 2%, 95%, 9%", from);
        c.add("5%, 11%, 20%, 18%", new JLabel("To: "));
        c.add("25%, 11%, 95%, 18%", to);
     //c.add("5%, 20%, 20%, 27%", new JLable("SUBJECT: "));

        c.add("5%, 20%, 20%, 27%", new JLabel("SUBJECT: "));
     //C.add("25%, 20%, 95%, 27%", subject);

        c.add("25%, 20%, 95%, 27%", subject);
        c.add("5%, 29%, 20%, 34%", new JLabel("DATA: "));
        c.add("5%, 35%, 95%, 85%", new JScrollPane(data));
        c.add("8%, 88%, 28%, 95%", send);
        c.add("40%, 88%, 60%, 95%", clear);
        c.add("72%, 88%, 92%, 95%", exit);
 

         // 컴포넌트들을 담고 있는 패널을 프레임에 추가 시킴
      //SetContentPane(c);

        setContentPane(c);

        // 기본 닫힘명령 설정
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 프레임의 사이즈 설정
        setSize(400, 450);

        // 프레임을 띄움.
        setVisible(true);
    }

    // 이벤트 핸들러
    public void actionPerformed(ActionEvent e){

        // 이벤트를 발생한 객체를 가져옴
        Object c = e.getSource();

        // 서버로 부터 수신된 응답 메시지를 담기위한 변수
        String incoming;

 

        // exit버튼을 눌렀을경우 프레임을 닫고 프로그램 종료

        if(c==exit) {
         //setvisible(false);

            setVisible(false);
            System.exit(0);

        // clear버튼을 눌렀을경우 모든 텍스트 상자 초기화
        }else if(c==clear) {
            from.setText("");
            to.setText("");
            subject.setText("");
            data.setText("");

        // send버튼을 눌렀을 경우 SMTP서버로 접속 후 메일을 보냄.
        }else if(c==send) {
            try{

                // SMTP서버에 접속 하기위한 소켓 생성(SMTP서버 Def.Port:25)
                Socket s = new Socket(server, 25);

                // 서버로 송신하기 위한 출력 스트림을 얻어온다.
                PrintStream out = new PrintStream(s.getOutputStream(), true);

                // 서버로 부터 수신된 데이터를 받기위한 입력 스트림을 얻어온다.
             //BufferedReader in = new BufferedReader(new InputStreamReader(s.GetInputStream()));

                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

 

                // 서버로 연결 요청 메시지를 송신한다.
                out.println("HELO"+domain);

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

 

                // 서버로 메일 보낸이에 대한 정보를 송신 한다.
                out.println("MAIL FROM: < "+from.getText()+" >");

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

               

                // 서버로 메일 받는이에 대한 정보를 송신 한다.
                out.println("RCPT TO:< "+to.getText()+" >");

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

               

                // 서버로 데이터를 보낸다는 메시지를 송신한다.
                out.println("DATA");

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

           

                // 서버로 메일 제목을 송신 한다.
                out.println("Subject: "+subject.getText());

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

     

                // 본문 내용의 끝에 캐리지리턴값과 라인피드값을 합친 내용을 서버에 전송
                String msg = data.getText();
               out.println(msg+"\r\n.\r\n");

               // 서버로 부터의 응답메시지를 수신 한다.
               incoming = in.readLine();

               // 서버로 종료한다는 메시지를 송신 한다.
               out.println("QUIT");

             

               // 각 텍스트 상자들의 값을 초기화 한다.

               to.setText("");
               subject.setText("");
               data.setText("");

           // try{}구문에서 예외 발생시 예외 처리 부분..
           }catch(Exception ex){
               ex.printStackTrace();

           }
        }

    }

    public static void main(String args[]) {

        // 프로그램을 실행시 아규먼트 2개가 넘어오지 않았을경우
     //if(args.length(2)){  length는 메소드가 아님

        if(args.length != 2){

            // SMTP서버의 주소와 도메인을 객체에 생성자를 통해 객체 생성
            new MailSender("localhost", "mokpo.ac.kr");
        }else{ // 프로그램을 실행시 아규먼트가 넘어 왔다면

            // SMTP서버의 주소와 도메인을 객체에 생성자를 통해 객체 생성
         //new MailSender(args[0], arg[1]);

            new MailSender(args[0], args[1]);
        }
    }
}


/*
* @(#)PositionLayout.java       98/02/18
*      - written by 최종명(CHOI JONG MYUNG)
*
* Copyright by Choi Jong Myung, CS Dept. of Soongsil Univ., Seoul, Korea.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Choi Jong Myung.  You shall not disclose such Confidential
* Information and shall use it only non-commercial purpose.
*/

import java.awt.*;
import java.util.*;

public class PositionLayout implements LayoutManager {
    Vector  positions = new Vector(10);
    Vector  components = new Vector(10);
    private  boolean   leftRatio;
    private  boolean   topRatio;
    private  boolean   rightRatio;
    private  boolean   bottomRatio;

    public void addLayoutComponent(String p, Component c) {
        positions.addElement(p);
        components.addElement(c);
    }


    public void removeLayoutComponent(Component c) {

        int i = components.indexOf(c);
        if(i != -1) {
            positions.removeElementAt(i);
            components.removeElementAt(i);
        }
    }


    public Dimension preferredLayoutSize(Container parent) {
        Dimension dim = new Dimension(0,0);
        int ncomponents = parent.getComponentCount();
        Insets  insets = parent.getInsets();
        dim.width += insets.left + insets.right;
        dim.height += insets.top + insets.bottom;

        int maxW = dim.width;
        int maxH = dim.height;
        for(int i = 0; i < ncomponents; i++) {
            Component  com = parent.getComponent(i);
            if(com.isVisible() == false)
                continue;
            int  w = com.getPreferredSize().width + dim.width;
            int  h = com.getPreferredSize().height + dim.height;
            if( w > maxW )
                maxW = w;
            if( h > maxH )
                maxH = h;
        }
        //System.out.println("prefer Size: width="+maxW+"\t\theight="+maxH);
        return  new Dimension(maxW, maxH);
    }


    public Dimension minimumLayoutSize(Container target) {
        return  target.getSize();
    }


    public void layoutContainer(Container target) {
        Insets insets = target.getInsets();
        int    ncomponents = target.getComponentCount();
        Dimension d = target.getSize();
        d.width  -= insets.left + insets.right;
        d.height  -= insets.top + insets.bottom;
        int  startX =0, startY =0, endX =0, endY =0;
        int  left = 0, top =0, right = 0, bottom =0;
        for(int i=0; i< ncomponents; i++) {
            Component comp = target.getComponent(i);
         StringTokenizer token = new StringTokenizer((String)positions.elementAt(i), ", \t");
            String  leftSt = token.nextToken();
            if(leftSt.endsWith("%")) {
                leftRatio = true;
                left  = Integer.parseInt(leftSt.substring(0, leftSt.length()-1));
            } else {
                left  = Integer.parseInt(leftSt);
            }

            String  topSt = token.nextToken();
            if(topSt.endsWith("%")) {
                topRatio = true;
                top  = Integer.parseInt(topSt.substring(0, topSt.length()-1));
            } else {
                top  = Integer.parseInt(topSt);
            }

            String  rightSt = token.nextToken();
            if(rightSt.endsWith("%")) {
                rightRatio = true;
                right  = Integer.parseInt(rightSt.substring(0, rightSt.length()-1));
            } else {
                right  = Integer.parseInt(rightSt);
            }

            String  bottomSt = token.nextToken();
            if(bottomSt.endsWith("%")) {
                bottomRatio = true;
                bottom  = Integer.parseInt(bottomSt.substring(0, bottomSt.length()-1));
            } else {
                bottom  = Integer.parseInt(bottomSt);
            }

            if(leftRatio)
                startX = (d.width * left)/100;
            else
                startX = left;

            if(topRatio)
                startY = (d.height * top)/100;
            else
                startY = top;

            if(rightRatio)
                endX = (d.width * right)/100;
            else
                endX = right;

            if(bottomRatio)
                endY = (d.height * bottom)/100;
            else
                endY = bottom;

            if(startX > endX) {
                int temp = startX;
                startX = endX;
                endX = temp;
            }
            if(startY > endY) {
                int temp = startY;
                startY = endY;
                endY = temp;
            }
            int  w = endX - startX;
            int  h = endY - startY;
            comp.setBounds(startX+insets.left, startY+insets.top, w, h);
            topRatio = false;
            leftRatio = false;
            rightRatio = false;
            bottomRatio = false;
        }
    }

    public String toString() {
        return getClass().getName();
    }
}

+ Recent posts