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