자바에서 메일을 보내는 것은 생각보다 간단합니다.
자바의 확장API인 JavaMail을 사용하면 누구나 쉽게 구현할 수 있습니다. 말하자면, 굳이 HELO, CC, BCC와 같은 SMTP 명령어를 몰라도 가능하다는 것입니다. 하지만, 메일 서버를 개발한다면 SMTP 명령어를 비롯한 관련된 RFC 문서들을 참조하여 직접 개발해야 합니다. Java Mail은 MUA라고 불리우는 메일 클라이언트에 국한된다고 봐도 무방합니다. 몇 개의 클래스는 메일 서버를 개발하는 곳에도 사용할 수 있겠지만 말입니다.
각설하고 JavaMail을 사용하도록 설치해야 할 것입니다.
저는 WindowsXP professional , Tomcat4.0, JDK1.3.1_01에서 테스트 했음을 밝여둡니다.
저는 WindowsXP professional , Tomcat4.0, JDK1.3.1_01에서 테스트 했음을 밝여둡니다.
Tomcat 4.0의 common/lib 디렉토리에 가보면 mail.jar 파일과 activation.jar 파일이 이미 들어 있습니다. 하지만, Doc 문서 등과 다른 참조문서들을 얻기 위해서 Sun으로부터 파일을 다운로드 하도록 하시지요.
우선 JavaMail은 http://java.sun.com/products/javamail/index.html에서 다운로드 하실 수 있습니다. 이 글을 쓰는 시점에서 가장 최신 버전은 1.2 입니다.
그리고, JavaBeans Activation Framework (JAF)가 필요한데 아래의 주소에서 다운로드 하십시오. 역시 이 글을 쓰는 시점의 최신 버전은1.0.1입니다.
http://java.sun.com/products/javabeans/glasgow/jaf.html
http://java.sun.com/products/javabeans/glasgow/jaf.html
두 파일 모두 zip으로 묶여 있으므로 압축을 풀어 봅니다.
압축을 풀면 여러 개의 jar파일과 문서들을 볼 수 있습니다. JavaMail에서는 우선 mail.jar 파일을 JAF에서는 activation.jar 파일을 적절히 클래스 패스를 잡아줍니다.
압축을 풀면 여러 개의 jar파일과 문서들을 볼 수 있습니다. JavaMail에서는 우선 mail.jar 파일을 JAF에서는 activation.jar 파일을 적절히 클래스 패스를 잡아줍니다.
저같은 경우에는 대부분의 jar 파일은 %JAVA_HOME%(자바 설치 디렉토리)의 jre/lib/ext 폴더에 복사해 넣습니다. JVM이 자동으로 이 곳에 있는 jar 파일들을 클래스 패스로 잡기 때문에 jar 파일들을 여기에 두시면 됩니다.
아래에는 javamail, jaf의 압축을 푼 디렉토리 모습과 jar 파일을 클래스 패스에 추가한 모습을 보여줍니다. Javamail과 jaf는 공통적으로 demo 폴더와 docs 폴더가 있습니다.
Demo 폴더에는 많은 예제 소스 코드가 있으니 공부하시는데 충분한 도움이 되실 겁니다. 그리고 docs 폴더에서 스펙 PDF 문서와 JavaDoc 문서가 있으니 API를 참조하시도록 하세요.
Demo 폴더에는 많은 예제 소스 코드가 있으니 공부하시는데 충분한 도움이 되실 겁니다. 그리고 docs 폴더에서 스펙 PDF 문서와 JavaDoc 문서가 있으니 API를 참조하시도록 하세요.
그림으로 보는 것이 이해가 빠를 듯 하여 화면을 캡처하였습니다.
[ JavaMail ]

[ JavaBeans Activation Framework ]

[클래스 패스에 추가한 폴더 모습]

일단, 두가지 jar 파일이 클래스 패스에 추가되었다면 이제 코딩할 준비가 되었습니다. 우선 못생긴 JSP 페이지를 하나 만들어 보도록 하지요. 단순히 메일 송신자, 수신자, 제목, 내용을 입력하고 전송하는 것입니다.
파일 전송을 성공했는지 실패했는지는 request 객체의 key 값 success로 판단하기로 합니다. Boolean의 값이 true면 성공, 실패면 false를 반환할 것입니다.
JSP 페이지의 내용은 아래와 같습니다.
<%@ page contentType="text/html;charset=EUC-KR" %> <% Boolean success = (Boolean)request.getAttribute("success"); %> <HTML> <HEAD> <TITLE> Mailer </TITLE> </HEAD> <BODY> <center><h1> 간단한 메일 전송 </h1> <form method="post" action="/servlet/MailServlet"> <table> <tr> <td>from </td> <td><input type="text" name="from"></td> </tr> <tr> <td>to</td> <td><input type="text" name="to"></td> </tr> <tr> <td>subject </td> <td><input type="text" name="subject"></td> </tr> <tr> <td>content </td> <td><textarea name="content" rows=10 cols=30>허떱한 메일 보내기</textarea> </td> </tr> <tr> <td colspan=2 align=center><input type="submit" value="Transport"> </td> </tr> </table> </form> <% if(success != null && success.booleanValue() == false){ %> 메일 전송 실패하였습니다. <% }else if(success != null && success.booleanValue() == true){ %> 정상적으로 전송되었습니다.<%}%> </BODY> </HTML> |
얼마나 못생긴 화면인지 아래와 그림을 보시기 바랍니다.

이제 이 JSP 페이지의 action이 될 서블릿을 만들어 봅시다. 물론 이 서블릿 클래스는 JSP 페이지로 만들어도 됩니다. 테스트용이니 여러분의 마음이 끌리는 대로 하시기 바랍니다. 저는 요청 처리는 무조건 서블릿으로 하는 버릇(?)이 있어서 서블릿으로 작성하였습니다. 소스 코드는 아래와 같습니다.
우선 몇가지 설명을 하겠습니다.
자바 메일에서 Session이라는 객체가 있는데, 이는 자신의 static 메쏘드인 getDefaultInstance() 혹은 getInstance()로 얻을 수 있습니다. Session 객체는 메일 서버와 프로그램간의 하나의 통신객체라고 이해하면 좋을 듯합니다.
자바 메일에서 Session이라는 객체가 있는데, 이는 자신의 static 메쏘드인 getDefaultInstance() 혹은 getInstance()로 얻을 수 있습니다. Session 객체는 메일 서버와 프로그램간의 하나의 통신객체라고 이해하면 좋을 듯합니다.
위 두가지 메쏘드들은 java.util.Properteis 객체를 아규먼트로 받습니다. 따라서 먼저 Properties 객체를 생성하고 이 객체에 mail.host 혹은 mail.smtp.host라는 키로 메일 서버의 도메인 주소를 설정하도록 합니다. 이외에도 여러가지 설정을 할 수 있는데, 다음에 시간이 나면 정리하도록 하겠습니다.
실제적으로 메일 메시지는 Message 객체로 보내집니다. Message의 여러 메쏘드들로 값들을 설정합니다.
우선 setFrom() 으로 보내는 사람의 메일주소를 설정합니다. 아규먼트로는 InternetAddress 객체를 받게 되는데, InternetAddress 객체는 메일 주소로 생성됩니다.
우선 setFrom() 으로 보내는 사람의 메일주소를 설정합니다. 아규먼트로는 InternetAddress 객체를 받게 되는데, InternetAddress 객체는 메일 주소로 생성됩니다.
setRecipient() 메쏘드는 받을 사람을 지정하게 되는데,
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
Message.RecipientType.CC
Message.RecipientType.BCC
중 하나를 설정하게 됩니다. SMTP 명령어를 아시는 분들은 쉽게 이해하시겠지만, CC는 참조, BCC는 숨은 참조입니다. 우선 우리는 TO에만 값을 설정하기로 하지요.
setSubject()에서 제목을 String으로 지정하게 되구요. 소스에서는 한글 처리 때문에 한글 변환을 하였습니다.
setContent()에서 이제 메일의 내용을 쓰게되는데, 두번째 아규먼트에서 type을 지정하게 됩니다. 여기서는 단순 text로 가정하고 text/plain으로 설정하였습니다. 우리가 JSP에서 page 지시자에서 contentType을 지정하는 것과 같다고 생각하시면 됩니다. 따라서 charset을 지정하실 수도 있습니다.
마지막으로 전송하는 일만 남았는데, Transport클래스의 send()를 사용하시면 됩니다.
지금까지 일련의 처리는MessagingException을 처리해야하므로, try - catch를 사용하였습니다. 간단한 text 메일 보내기의 서블릿 소스는 아래와 같습니다.
import javax.servlet.*; import javax.servlet.http.*; import javax.mail.*; import javax.mail.internet.*; import java.io.*; import java.util.*; public class MailServlet extends HttpServlet{ private static final String SMTP_HOST = "localhost"; public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ String to = req.getParameter("to"); String from = req.getParameter("from"); String subject = req.getParameter("subject"); String content = req.getParameter("content"); Properties props = new Properties(); props.put("mail.host", SMTP_HOST); Boolean success = null; try{ Session session= Session.getDefaultInstance(props); Message ms = new MimeMessage(session); ms.setFrom(new InternetAddress(from)); ms.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); ms.setSubject(new String(subject.getBytes("8859_1"), "KSC5601")); ms.setContent(content, "text/plain"); Transport.send(ms); success = new Boolean(true); }catch(Exception e){ success = new Boolean(false); System.out.println(e); }finally{ req.setAttribute("success", success); gotoPage("/mail.jsp", req, res); } } public void gotoPage(String address, HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ RequestDispatcher rd = getServletContext().getRequestDispatcher(address); rd.forward(req, res); } } |
간단한 메일을 보내는 메일보내기는 여기서 마무리 짓도록 하겠습니다. JavaMail로 이메일을 보내는 것이 얼마나 간단한 것인지를 아시게 되었을 것입니다.
질문있습니다
답글삭제JSP랑 자바로 코딩을 하셨는데요
.html문서를 메일보내는 코딩을 자바로만 코딩하려고 하는데 방향제시 좀 ㅎ...