====================================
Bean을 이용한 SMTP 메일 보내는 예제
====================================
1. 파일구성
SMTPBean.java : 메일 보내는 기능을 하는 Java Bean
SMTPException.java : 메일발송시 예외상황 처리를 하는 Bean
BeanMailer.jsp : HTML에서 넘어오는 값을 SMTPBean을 이용
해 Property에 set, 및 메일보내는 메소드등을 Call
BeanMailer.html : 메일 발송을 위한 html
2. 소스파일
[SMTPBean.java]
/* SMTPBean.java
실제 메일을 보내는 Bean */
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
public class SMTPBean implements Serializable{
private Socket smtp; //SMTP서버에 접속하기 위한것
private BufferedReader input; //서버의 응답을 저장하기 위한것
private PrintStream output; //
private String smtpServer; //SMTP서버 주소
private String serverReply; //
private int port = 25; // Default SMTP Port
private String from;
private String to;
private String subject;
private String message;
// value set
public void setFrom(String from) {
this.from = from;
}
public void setTo(String to) {
this.to = to;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setMessage(String message) {
this.message = message;
}
// JSP의 <jsp:useBean> Table 에 의해 빈이 처음 Laod될때 실행
public SMTPBean() { }
// 메일을 보내기 위한 모든 메소드를 Call
public void sendMail() throws SMTPException{
connect();
hail(from, to);
sendMessage(from, to, subject, message);
logout();
}
// PrintStream을 서버에 보냄
// 접속후 서버로 부터의 응답을 파악(200인 경우 서비스 준비OK
// input을 위한 BufferedReader와 함께 새로운 서버 소켓을 생성
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("Error connecting to SMTP server " + smtpServer + " on port " + port);
}
}
catch(Exception e) {
throw new SMTPException(e.getMessage());
}
}
//메일 보낸는이, 받는이등을 메일서버에게 알림...
public void hail(String from, String to) throws SMTPException {
if (submitCommand("HELO " + smtpServer))
throw new SMTPException("Error occurred during HELO command.");
if (submitCommand("MAIL FROM: " + from))
throw new SMTPException("Error during MAIL command.");
if (submitCommand("RCPT TO: " + to))
throw new SMTPException("Error during RCPT command.");
}
// 실제 메일을 전송, 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) { }
}
//서버에 명령을 보낸후 응답을 반다 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) {
throw new SMTPException(e.getMessage());
}
}
// SMTP서버의 최근의 응답을 돌려줌
public String getServerReply() {
return serverReply;
}
// SMTP 서버의 포트번호를 돌려줌
public int getPort(){
return port;
}
// SMTP 서버의 port를 port변수에 set
public void setPort(int newPort){
port = newPort;
}
//SMTP 서버를 돌려줌
public String getSmtpServer(){
return smtpServer;
}
//SMTP서버를 set
public void setSmtpServer(String newSmtpServer){
smtpServer = newSmtpServer;
}
// SMTP 서버로 부터 LogOut
public void logout() throws SMTPException {
try {
if (submitCommand("Quit"))
throw new SMTPException("Error during QUIT command");
input.close();
output.flush();
output.close();
smtp.close();
}
catch(Exception e) {
}
}
public static String han(String Unicodestr) throws UnsupportedEncodingException {
if( Unicodestr == null) return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
----------------------------
[SMTPException.java]
/* SMTPException.java
SMTPBean에서 예외상황 발생시 에러를 Catch 하기위한 Class
error내용을 String으로 저장한후 getMessage() 메소드에 돌려준다. */
public class SMTPException extends Exception {
private String message;
//SMTPBean우로 부터 발생되어 던져지는 에러를 String형 message에 저장
public SMTPException(String message) {
this.message = message;
}
// 에러메시지를 Return
public String getMessage() {
return message;
}
}
-------------------------------
[BeanMailer.jsp]
<!-- 아래는 SMTPClient를 이용한 메일 보내기 예제입니다. 간단하죠~~ -->
<HTML>
<HEAD>
<TITLE>EmailForm Example</TITLE>
</HEAD>
<BODY>
<p align="center">BeanMailer.jsp</p>
<jsp:useBean id="email" class="SMTPBean"/>
<jsp:setProperty name="email" property="*" />
<%
try{
email.sendMail();
out.println("Sending your mail...<br>");
}
catch (SMTPException e){
out.println(e.getMessage() + "<br>");
}
%>
</BODY>
</HTML>
------------------------------
[BeanMailer.html]
<!-- BeanMailer.html -->
<form action="/jsp/BeanMailer.jsp" method="POST">
<table>
<tr>
<td>Form Mail Sending Example</td>
<td>Examples</td>
</tr>
<tr>
<td>SMTP Server</td>
<td><input type="text" size= "20"name="smtpServer"></td>
</tr>
<tr>
<td>From</td>
<td><input type="text" size= "20"name="from"></td>
</tr>
<tr>
<td>To</td>
<td><input type="text" size= "30"name="to"></td>
</tr>
<tr>
<td>Subject</td>
<td><input type="text" size= "40"name="subject"></td>
</tr>
<tr>
<td>Msg Body</td>
<td><textarea name= "message" rows="20" cols="38"></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name= "B1"value="Submit"></td>
</tr>
</table>
</form>