SMTP(Simple Mail Transfer Protocol)는 단순한 메일 전송 프로토콜로서
보통 인터넷 서비스 업체에서 SMTP 서버를 메일 송신 서버로 POP(Post Office Protocol) 서버를 메일 수신 서버로 두며 하나의 호스트에 두 서비스를 두기도 하지만 보통 두 서버를 나눕니다. SMTP는 안정적인 메일의 전송을 위해 TCP 세션을 이용하는것은 다아시죠...
다음의 예를 보도록 하자구요...
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class SendMailApplication extends JFrame{
private JTextField from;
private JTextField to;
private JTextField subject;
private JTextArea message;
private JButton sendButton, exitButton;
private Socket smtp; //SMTP서버에 접속하기 위한 소켓
private BufferedReader input; //서버의 응답을 저장하기 위한것
private PrintStream output; // 서버와의 통신을 위한 PrintStream
private String serverReply; // 서버응답
private String smtpServer = "211.209.7.147"; //SMTP서버 주소
private int port = 25;
// --------------------------------------------------------------------------
// 1. 생성자에서 기본적인 윈도우 화면을 그린다.
// --------------------------------------------------------------------------
public SendMailApplication() {
Container cp = getContentPane();
cp.setLayout(new GridLayout(5,1));
from = new JTextField("",20);
from.setCaretColor(Color.blue);
to = new JTextField("",20);
to.setCaretColor(Color.blue);
subject = new JTextField("",20);
subject.setCaretColor(Color.blue);
message = new JTextArea(20,20);
message.setCaretColor(Color.blue);
sendButton = new JButton("전송하기...");
sendButton.setToolTipText("여길 누르시면 메일이 발송 됩니다...");
exitButton = new JButton("종료");
exitButton.setToolTipText("프로그램 종료...");
cp.add(new JLabel("From : ")); cp.add(from);
cp.add(new JLabel("To : ")); cp.add(to);
cp.add(new JLabel("subject : ")); cp.add(subject);
cp.add(new JLabel("message : ")); cp.add(message);
cp.add(sendButton);
cp.add(exitButton);
//메일발송 버튼에 이벤트 검
sendButton.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent ae) {
send();
}
}
);
//종료버튼에 이벤트 검
exitButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
}
);
setSize(300, 150); setVisible(true);
}
// --------------------------------------------------------------------------
// 1. main 메소드(프로그램 시작 부분)
// --------------------------------------------------------------------------
public static void main(String[] args) {
new SendMailApplication();
}
// --------------------------------------------------------------------------
// 1. "메일발송" 버튼을 클릭 했을때 호출되는 메소드
// 2. 메일을 보내기 위한 모든 메소드를 Call
// --------------------------------------------------------------------------
public void send() {
try {
connect();
hail(from.getText(), to.getText());
sendMessage(from.getText(), to.getText(), subject.getText(), message.getText());
logout();
new MyDialog(this,"전송완료", "메일 전송이 완료 되었습니다...");
}
catch (SMTPException se) {
new MyDialog(this,"전송오류(send)", se.getMessage());
}
catch (Exception e) {
new MyDialog(this,"전송오류(send)", e.toString());
}
}
// --------------------------------------------------------------------------
// 메일서버에 접속을 하는 메소드
// 1. 접속후 서버로 부터의 응답을 파악(200인 경우 서비스 준비OK)
// --------------------------------------------------------------------------
public void connect() throws SMTPException {
try {
smtp = new Socket(smtpServer, port);
input = new BufferedReader(new InputStreamReader(smtp.getInputStream()));
//접속된 서버에 출력을 보내기위한 스트림을 생성한다.
output = new PrintStream(smtp.getOutputStream());
serverReply = input.readLine();
if (serverReply.charAt(0) == '2' || serverReply.charAt(0) == '3') {
}
else {
throw new SMTPException("(connect)Error connecting to SMTP server " + smtpServer + "on port " + port);
}
}
catch (Exception e) {
System.out.println("(connect)"+e.toString());
throw new SMTPException("(connect)"+e.getMessage());
}
}
// --------------------------------------------------------------------------
// 메일 보내는이, 받는이등을 메일서버에게 알림...메일발송의 시작
// --------------------------------------------------------------------------
public void hail(String from, String to) throws SMTPException {
if (submitCommand("HELO " + smtpServer))
throw new SMTPException("(hail)Error occurred during HELO command.");
if (submitCommand("MAIL FROM: " + from))
throw new SMTPException("(hail)Error during MAIL command.");
if (submitCommand("RCPT TO: " + to))
throw new SMTPException("(hail)Error during RCPT command.");
}
// --------------------------------------------------------------------------
// 1. 실제 메일을 전송
// 2. DATA명령은 SMTP 서버에게 메일을 보낸다고 알리는 기능
// --------------------------------------------------------------------------
public void sendMessage(String from, String to, String subject, String message) throws
SMTPException {
Date ldate_today = new Date(System.currentTimeMillis());
SimpleDateFormat lgmt_date = new
SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'");
lgmt_date.setTimeZone(TimeZone.getTimeZone("GMT"));
lgmt_date.format(ldate_today);
try {
if (submitCommand("DATA"))
throw new SMTPException("Error during DATA command.");
String header = "From: " + from + "\r\n";
header += "To: " + to + "\r\n";
header += "Subject: " + han(subject) + "\r\n";
header += "Date: " + lgmt_date + "\r\n\r\n";
if (submitCommand(header + han(message) + "\r\n."))
throw new SMTPException("Error during mail transmission.");
}
catch (Exception e) {
System.out.println("(sendMessage)"+e.toString());
throw new SMTPException("(sendMessage)"+e.getMessage());
}
}
// --------------------------------------------------------------------------
// 1. 서버에 명령을 보낸후 응답을 받음
// 2. Boolean값을 return, true인 경우 에러
// --------------------------------------------------------------------------
private boolean submitCommand(String command) throws SMTPException {
try {
output.print(command + "\r\n");
serverReply = input.readLine();
if (serverReply.charAt(0) == '4' || serverReply.charAt(0) == '5') //전송실패등..
return true;
else return false;
}
catch(Exception e) {
System.out.println("(submitCommand)"+e.toString());
throw new SMTPException("(submitCommand)"+e.getMessage());
}
}
// --------------------------------------------------------------------------
// 1. 서버로 부터 접속을 끊음
// --------------------------------------------------------------------------
public void logout() throws SMTPException {
try {
if (submitCommand("Quit"))
throw new SMTPException("(logout)Error during QUIT command");
input.close(); output.flush(); output.close(); smtp.close();
}
catch(Exception e) {
System.out.println("(logout)"+e.toString());
throw new SMTPException(e.getMessage());
}
}
// -----------------------------------------------------------------------------
//
// 1. 한글 변환 함수
//
// -----------------------------------------------------------------------------
public static String han(String Unicodestr) throws UnsupportedEncodingException {
if( Unicodestr == null) return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
보통 인터넷 서비스 업체에서 SMTP 서버를 메일 송신 서버로 POP(Post Office Protocol) 서버를 메일 수신 서버로 두며 하나의 호스트에 두 서비스를 두기도 하지만 보통 두 서버를 나눕니다. SMTP는 안정적인 메일의 전송을 위해 TCP 세션을 이용하는것은 다아시죠...
다음의 예를 보도록 하자구요...
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class SendMailApplication extends JFrame{
private JTextField from;
private JTextField to;
private JTextField subject;
private JTextArea message;
private JButton sendButton, exitButton;
private Socket smtp; //SMTP서버에 접속하기 위한 소켓
private BufferedReader input; //서버의 응답을 저장하기 위한것
private PrintStream output; // 서버와의 통신을 위한 PrintStream
private String serverReply; // 서버응답
private String smtpServer = "211.209.7.147"; //SMTP서버 주소
private int port = 25;
// --------------------------------------------------------------------------
// 1. 생성자에서 기본적인 윈도우 화면을 그린다.
// --------------------------------------------------------------------------
public SendMailApplication() {
Container cp = getContentPane();
cp.setLayout(new GridLayout(5,1));
from = new JTextField("",20);
from.setCaretColor(Color.blue);
to = new JTextField("",20);
to.setCaretColor(Color.blue);
subject = new JTextField("",20);
subject.setCaretColor(Color.blue);
message = new JTextArea(20,20);
message.setCaretColor(Color.blue);
sendButton = new JButton("전송하기...");
sendButton.setToolTipText("여길 누르시면 메일이 발송 됩니다...");
exitButton = new JButton("종료");
exitButton.setToolTipText("프로그램 종료...");
cp.add(new JLabel("From : ")); cp.add(from);
cp.add(new JLabel("To : ")); cp.add(to);
cp.add(new JLabel("subject : ")); cp.add(subject);
cp.add(new JLabel("message : ")); cp.add(message);
cp.add(sendButton);
cp.add(exitButton);
//메일발송 버튼에 이벤트 검
sendButton.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent ae) {
send();
}
}
);
//종료버튼에 이벤트 검
exitButton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
}
);
setSize(300, 150); setVisible(true);
}
// --------------------------------------------------------------------------
// 1. main 메소드(프로그램 시작 부분)
// --------------------------------------------------------------------------
public static void main(String[] args) {
new SendMailApplication();
}
// --------------------------------------------------------------------------
// 1. "메일발송" 버튼을 클릭 했을때 호출되는 메소드
// 2. 메일을 보내기 위한 모든 메소드를 Call
// --------------------------------------------------------------------------
public void send() {
try {
connect();
hail(from.getText(), to.getText());
sendMessage(from.getText(), to.getText(), subject.getText(), message.getText());
logout();
new MyDialog(this,"전송완료", "메일 전송이 완료 되었습니다...");
}
catch (SMTPException se) {
new MyDialog(this,"전송오류(send)", se.getMessage());
}
catch (Exception e) {
new MyDialog(this,"전송오류(send)", e.toString());
}
}
// --------------------------------------------------------------------------
// 메일서버에 접속을 하는 메소드
// 1. 접속후 서버로 부터의 응답을 파악(200인 경우 서비스 준비OK)
// --------------------------------------------------------------------------
public void connect() throws SMTPException {
try {
smtp = new Socket(smtpServer, port);
input = new BufferedReader(new InputStreamReader(smtp.getInputStream()));
//접속된 서버에 출력을 보내기위한 스트림을 생성한다.
output = new PrintStream(smtp.getOutputStream());
serverReply = input.readLine();
if (serverReply.charAt(0) == '2' || serverReply.charAt(0) == '3') {
}
else {
throw new SMTPException("(connect)Error connecting to SMTP server " + smtpServer + "on port " + port);
}
}
catch (Exception e) {
System.out.println("(connect)"+e.toString());
throw new SMTPException("(connect)"+e.getMessage());
}
}
// --------------------------------------------------------------------------
// 메일 보내는이, 받는이등을 메일서버에게 알림...메일발송의 시작
// --------------------------------------------------------------------------
public void hail(String from, String to) throws SMTPException {
if (submitCommand("HELO " + smtpServer))
throw new SMTPException("(hail)Error occurred during HELO command.");
if (submitCommand("MAIL FROM: " + from))
throw new SMTPException("(hail)Error during MAIL command.");
if (submitCommand("RCPT TO: " + to))
throw new SMTPException("(hail)Error during RCPT command.");
}
// --------------------------------------------------------------------------
// 1. 실제 메일을 전송
// 2. DATA명령은 SMTP 서버에게 메일을 보낸다고 알리는 기능
// --------------------------------------------------------------------------
public void sendMessage(String from, String to, String subject, String message) throws
SMTPException {
Date ldate_today = new Date(System.currentTimeMillis());
SimpleDateFormat lgmt_date = new
SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'");
lgmt_date.setTimeZone(TimeZone.getTimeZone("GMT"));
lgmt_date.format(ldate_today);
try {
if (submitCommand("DATA"))
throw new SMTPException("Error during DATA command.");
String header = "From: " + from + "\r\n";
header += "To: " + to + "\r\n";
header += "Subject: " + han(subject) + "\r\n";
header += "Date: " + lgmt_date + "\r\n\r\n";
if (submitCommand(header + han(message) + "\r\n."))
throw new SMTPException("Error during mail transmission.");
}
catch (Exception e) {
System.out.println("(sendMessage)"+e.toString());
throw new SMTPException("(sendMessage)"+e.getMessage());
}
}
// --------------------------------------------------------------------------
// 1. 서버에 명령을 보낸후 응답을 받음
// 2. Boolean값을 return, true인 경우 에러
// --------------------------------------------------------------------------
private boolean submitCommand(String command) throws SMTPException {
try {
output.print(command + "\r\n");
serverReply = input.readLine();
if (serverReply.charAt(0) == '4' || serverReply.charAt(0) == '5') //전송실패등..
return true;
else return false;
}
catch(Exception e) {
System.out.println("(submitCommand)"+e.toString());
throw new SMTPException("(submitCommand)"+e.getMessage());
}
}
// --------------------------------------------------------------------------
// 1. 서버로 부터 접속을 끊음
// --------------------------------------------------------------------------
public void logout() throws SMTPException {
try {
if (submitCommand("Quit"))
throw new SMTPException("(logout)Error during QUIT command");
input.close(); output.flush(); output.close(); smtp.close();
}
catch(Exception e) {
System.out.println("(logout)"+e.toString());
throw new SMTPException(e.getMessage());
}
}
// -----------------------------------------------------------------------------
//
// 1. 한글 변환 함수
//
// -----------------------------------------------------------------------------
public static String han(String Unicodestr) throws UnsupportedEncodingException {
if( Unicodestr == null) return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
댓글 없음:
댓글 쓰기