주요글: 도커 시작하기
반응형
Java Mail API를 이용하여 웹 기반의 메일 전송 어플리케이션을 작성해보자.

JavaMail API와 SMTP

SMTP는 Simple Mail Transfer Protocol의 약자로서 메일을 전송할 때 사용되는 프로토콜이다. 현재 우리가 흔히 사용하고 있는 이메일은 모두 SMTP 프로토콜을 사용하여 메일을 전송하고 메일을 전달받는다. JavaMail API는 기본적으로 STMP 프로토콜을 지원해준다. 따라서, JavaMail API를 사용하면 어렵지 않게 SMTP를 사용하여 메일을 전송할 수 있게 된다.

JavaMail API를 이용하여 메일을 전송하는 과정은 다음과 같다.

  1. javax.mail.Session 클래스의 인스턴스를 구한다.
  2. javax.mail.Message 클래스를 사용하여 전송하고자 하는 메일 메시지를 작성한다.
  3. javax.mail.Transport 클래스를 사용하여 작성한 메일을 전송한다.
세션 생성

JavaMail API는 메일과 관련된 모든 작업을 처리하기 위해서는 먼저 세션을 생성해야 한다. STMP와 관련된 세션을 생성하기 위해서는 STMP 서버와 관련된 정보를 지정해주어야 한다. 일반적으로, java.util.Properties 클래스를 사용하여 세션을 생성할 때 필요한 값을 설정한 후, javax.mail.Session을 사용하여 세션을 생성한다. 다음은 세션을 생성하는 코드이다.

Properties prop = new Properties();
prop.put("mail.smtp.host", "mail.myHost.com");
prop.put("mail.smtp.user", "webmaster");

Session session = Session.getDefaultInstance(prop, null);

위 코드에서 "mail.smtp.host" 속성은 이메일 발송을 처리해줄 STMP 서버를 나타낸다. "mail.smtp.user" 속성은 SMTP 서버에 있는 사용자의 계정(또는 아이디)를 나타낸다. Session 클래스의 getDefaultInstance() 메소드는 파라미터로 전달받은 Properties에 저장되어 있는 속성값을 사용하여 세션을 생성한다.

메시지 작성

세션을 생성했다면, 그 다음으로 해야 할 일은 메시지를 작성하는 것이다. 메시지 작성은 javax.mail.Message 클래스를 통해서 이루어진다. 오늘날 사용되는 대부분의 이메일은 다양한 Mime 타입을 지원하기 때문에, MimeMessage 클래스를 사용해야 할 것이다. MimeMessage 클래스는 Message 클래스를 상속받았으며, Message 메시지는(즉, MimeMessage 클래스는) 보내는 사람, 받는 사람, 제목, 내용과 같이 메일과 관련된 내용을 지정할 수 있도록 해 준다.

다음 코드는 MimeMessage 클래스를 사용하여 전송할 메시지를 작성하는 코드를 보여주고 있다.

MimeMessage message = new MimeMessage(session);
InternetAddress from = new InternetAddress("webmaster@myHost.com");
message.setFrom(from);

InternetAddress to = new InternetAddress("era13@hanmail.net", "beom-kyun");
InternetAddress[] toList = { to };
message.setRecipients(Message.RecipientType.TO, toList);
message.setSubject("mail subject");
message.setContent("메일의 내용", "text/plain");

위 코드에서 InternetAddress 클래스는 이메일 주소를 나타낼 때 사용되는 클래스로서, Message 클래스의 수취인과 발신인을 지정할 때 사용된다. Message 클래스는 setRecipients() 메소드와 setFrom() 메소드를 사용하여 수취인과 발신인을 설정하며 setSubject() 메소드와 setContent() 메소드를 사용하여 메시지의 주제(또는 제목)과 내용을 설정할 수 있다.

단순한 텍스트 뿐만 아니라 HTML 형식을 비롯한 다양한 MIME 타입을 메일의 내용을 지정할 수 있다. 예를 들어, HTML 형식의 메일을 전송하고자 할 경우 다음과 같이 Message의 setContent() 메소드를 호출해주면 된다.

message.setContent("메일 내용..", "text/html");

동시에 여러 개의 MIME 타입을 전송할 수도 있다. 이를 위해서는 MultiPart 클래스를 사용하면 된다. 이 뿐만 아니라 다양한 형태의 데이터를 전송하기 위해서 JavaBean Activation Framework API를 사용할 수도 있다. JAF API를 사용하면 파일 첨부와 같이 바이너리 데이터를 비롯한 모든 데이터를 원하는 형태로 전송할 수 있게 된다.

메시지 전송

메시지 전송은 단순히 Transport 클래스의 send() 메소드를 호출함으로써 이루어진다. 예를 들어, 앞에서 생성한 메시지 객체인 message를 전송하고자 할 경우 다음과 같이 Transport.send() 메소드를 호출하면 된다.

Transport.send(message);

웹 기반의 메일 전송

다음을 비롯한 많은 사이트에서 기본적으로 이메일 서비스를 제공해주고 있다. 이러한 사이트들은 대부분 이메일 전송을 위해 SMTP를 사용하고 있다. 이 뿐만 아니라 대부분의 메일링 리스트 역시 SMTP를 이용하여 메일을 발송한다. 그 외에도 몇몇 사이트는 게시판에 답변글이 올라올 경우 그 답변글을 메일로 전송해주기도 한다.

이런 기능들을 구현하기 위해서는 웹 어플리케이션이 메일을 전송할 수 있어야 한다. 웹 기반의 메일 전송은 이 글의 앞에서 살펴본 내용만으로도 충분히 구현할 수 있다. 이 글에서는 마지막으로 간단하게 웹 기반의 메일 전송 어플리케이션을 작성해보도록 하자.

최대한 간단하게 구현하기 위해서 메일의 내용을 입력할 수 있는 폼을 보여주는 MailInputForm.html과 메일을 전송해주는 sendMail.jsp의 두 페이지만 사용해서 구현해볼 것이다. 먼저, MailInputForm.html은 다음과 같다.

<html><head><title>메일 작성 폼</title></head>
<body>
<form action="sendMail.jsp" method="post">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
   <td>SMTP서버</td>
   <td><input type="text" name="smtpServer" size="20"></td>
</tr>
<tr>
   <td>STMP 서버 계정</td>
   <td><input type="text" name="serverAccount" size="10"></td>
</tr>
<tr>
   <td>보내는 이메일</td>
   <td><input type="text" name="senderEmail" size="30"></td>
</tr>
<tr>
   <td>받는 이메일</td>
   <td><input type="text" name="receiverEmail" size="30"></td>
</tr>
<tr>
   <td>제목</td>
   <td><input type="text" name="subject" size="50"></td>
</tr>
<tr>
   <td>내용</td>
   <td><textarea name="content" rows="8" cols="50"></textarea></td>
</tr>
<tr>
   <td colspan="2"><input type="submit" value="전송"></td>
</tr>
</table>
</form>
</body></html>

위 HTML의 각 입력란에 알맞게 정보를 입력한 후, [전송] 버튼을 클릭하면 sendMail.jsp가 실행된다. sendMail.jsp는 다음과 같다.

<%@ page import = "javax.mail.*" %>
<%@ page import = "javax.mail.internet.*" %>
<%@ page import = "java.util.*" %>
<%   
   Properties prop = new Properties();
   prop.put("mail.smtp.host", request.getParameter("smtpServer"));
   prop.put("mail.smtp.user", request.getParameter("serverAccount"));   
   javax.mail.Session mailSession = 
             javax.mail.Session.getDefaultInstance(prop, null);
   
   MimeMessage message = new MimeMessage(mailSession);
   InternetAddress from = new InternetAddress(request.getParameter("senderEmail"));
   message.setFrom(from);   
   InternetAddress to = new InternetAddress(request.getParameter("receiverEmail"));
   InternetAddress[] toList = {to};
   message.setRecipients(Message.RecipientType.TO, toList);
   message.setSubject(request.getParameter("subject"), "iso8859-1");
   message.setContent(request.getParameter("content"), "text/plain");   
   Transport.send(message);
%>
<html>
<head><title>메일전송완료</title></head>
<body>
메일을 전송하였습니다.
</body>
</html>

sendMail.jsp를 보면 특별히 어려운 코드가 없다는 것을 알 수 있다. 모든 코드가 이미 앞에서 설명한 코드를 모아 놓은 것에 불과하다. sendMail.jsp에서 이메일 메시지의 제목을 설정하는 코드를 살펴보면 제목의 인코딩 타입을 "iso8859-1"로 설정해주는 부분이 있다. 이는 서블릿/JSP 엔진이 기본적으로 파라미터를 "iso8859-1" 인코딩으로 읽어오기 때문이다.

결론

2부에서는 SMTP 서버를 사용하여 메일을 전송하는 것에 대해서 알아보았다. 이번 글을 통해서 어렵지 않게 메일링 리스트와 같은 것을 구현할 수 있게 되었을 것이다. 이제 남은 것이 있다면, 메일에 파일 첨부를 하는 방법과 POP3를 통해 메일을 읽어오는 것이다. POP3를 사용하여 메일을 읽어오는 것은 이미 이 시리즈의 1부에서 간단하게 구현해보았으므로, 이 시리즈의 마지막인 3부에서는 파일첨부 기능을 구현해보도록 하자

관련링크:

+ Recent posts