JSP 페이지에서 JavaMail API를 활용하면 별도의 외부 프로그램 없이도 웹 애플리케이션에서 직접 첨부 파일이 포함된 이메일을 전송할 수 있습니다. 이 글에서는 로컬 환경(localhost)의 SMTP 서버를 통해 파일을 첨부하여 메일을 발송하는 전체 과정을 예제 코드와 함께 단계별로 살펴보겠습니다.
핵심 개념 정리
첨부 파일이 있는 이메일은 일반 텍스트 메일과 달리 여러 개의 본문 파트를 하나로 묶어야 하므로 MimeMultipart 구조를 사용합니다. 즉, 첫 번째 파트에는 메시지 본문을 담고, 두 번째 파트에는 FileDataSource를 통해 읽어 들인 첨부 파일을 담아 하나의 메일로 조립하는 방식입니다.
전체 예제 코드
<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%
String result;
// 수신자의 이메일 주소를 지정합니다.
String to = "abcd@gmail.com";
// 발신자의 이메일 주소를 지정합니다.
String from = "mcmohd@gmail.com";
// localhost에서 메일을 발송한다고 가정합니다.
String host = "localhost";
// 시스템 속성 객체를 가져옵니다.
Properties properties = System.getProperties();
// 메일 서버(SMTP 호스트)를 설정합니다.
properties.setProperty("mail.smtp.host", host);
// 기본 Session 객체를 가져옵니다.
Session mailSession = Session.getDefaultInstance(properties);
try {
// 기본 MimeMessage 객체를 생성합니다.
MimeMessage message = new MimeMessage(mailSession);
// From 헤더를 설정합니다.
message.setFrom(new InternetAddress(from));
// To 헤더(수신자)를 설정합니다.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// 메일 제목(Subject)을 설정합니다.
message.setSubject("This is the Subject Line!");
// 메시지 본문 파트를 생성합니다.
BodyPart messageBodyPart = new MimeBodyPart();
// 본문 내용을 작성합니다.
messageBodyPart.setText("This is message body");
// 멀티파트(Multipart) 메시지를 생성합니다.
Multipart multipart = new MimeMultipart();
// 텍스트 본문 파트를 추가합니다.
multipart.addBodyPart(messageBodyPart);
// 두 번째 파트는 첨부 파일입니다.
messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// 완성된 멀티파트를 메시지에 설정합니다.
message.setContent(multipart);
// 메시지를 전송합니다.
Transport.send(message);
String title = "Send Email";
result = "Sent message successfully....";
} catch (MessagingException mex) {
mex.printStackTrace();
result = "Error: unable to send message....";
}
%>
<html>
<head>
<title>Send Attachment Email using JSP</title>
</head>
<body>
<center>
<h1>Send Attachment Email using JSP</h1>
</center>
<p align = "center">
<%out.println("Result: " + result + "\n");%>
</p>
</body>
</html>코드 동작 흐름 설명
- 세션(Session) 생성: 시스템 속성에 SMTP 호스트 정보를 설정한 뒤 기본
Session객체를 가져옵니다. - 메시지 구성:
MimeMessage객체에 발신자, 수신자, 제목을 지정합니다. - 본문 추가:
MimeBodyPart에 텍스트 본문을 담습니다. - 첨부 파일 추가:
FileDataSource와DataHandler를 이용해 파일을 읽어 새로운MimeBodyPart에 담고 파일명을 지정합니다. - 멀티파트 조립 및 전송: 본문 파트와 첨부 파트를
MimeMultipart로 묶어 메시지에 설정한 후Transport.send()로 발송합니다.
위 JSP를 실행하면 지정된 이메일 주소로 메시지 본문과 함께 file.txt가 첨부되어 전송됩니다. 성공 여부는 화면에 출력되는 결과 문자열로 확인할 수 있습니다.
사용자 인증(User Authentication) 처리
메일 서버가 인증을 요구하는 경우, 즉 사용자 ID와 비밀번호를 제출해야 하는 환경이라면 아래와 같이 속성을 추가로 설정하기만 하면 됩니다.
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");마무리
JSP와 JavaMail API를 조합하면 회원 가입 확인 메일, 문의 폼 알림, 리포트 자동 발송 등 다양한 시나리오에서 첨부 파일이 포함된 이메일을 손쉽게 구현할 수 있습니다. 실무에서는 Gmail이나 사내 SMTP 서버의 TLS/SSL 설정, 포트 번호(465 또는 587) 지정 등 추가적인 보안 구성이 필요할 수 있으니 운영 환경에 맞게 속성 값을 조정하는 것이 좋습니다.