자바 이메일 전송 완벽 가이드: JavaMail API 활용법
자바 애플리케이션에서 이메일을 전송하려면 JavaMail API와 JAF(Java Activation Framework)가 필요합니다. 이 가이드에서는 기본 텍스트 이메일부터 HTML 이메일, 첨부 파일 전송, 인증 설정까지 단계별로 설명합니다.
필수 라이브러리 설치
다운로드 후 압축을 해제하면 mail.jar와 activation.jar 파일이 있습니다. 이 두 파일을 프로젝트의 CLASSPATH에 추가해야 합니다.
기본 텍스트 이메일 전송
로컬호스트가 인터넷에 연결되어 있고 SMTP 서버 역할을 할 수 있다고 가정합니다.
예제 코드
// 파일명: SendEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail {
public static void main(String[] args) {
// 수신자 이메일
String to = "recipient@gmail.com";
// 발신자 이메일
String from = "sender@gmail.com";
// SMTP 서버 (로컬호스트 사용 시)
String host = "localhost";
// 시스템 속성 가져오기
Properties properties = System.getProperties();
// 메일 서버 설정
properties.setProperty("mail.smtp.host", host);
// 세션 객체 생성
Session session = Session.getDefaultInstance(properties);
try {
// MimeMessage 객체 생성
MimeMessage message = new MimeMessage(session);
// 발신자 설정
message.setFrom(new InternetAddress(from));
// 수신자 설정
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// 제목 설정
message.setSubject("자바 이메일 테스트");
// 본문 설정
message.setText("자바에서 보내는 테스트 이메일입니다.");
// 전송
Transport.send(message);
System.out.println("이메일 전송 성공!");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
실행 결과
$ java SendEmail
이메일 전송 성공!
다중 수신자 지정 방법
여러 수신자에게 전송하려면 addRecipients() 메서드를 사용합니다.
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
type: TO, CC, BCC 중 지정 (예: Message.RecipientType.TO)
addresses: 이메일 주소 배열 (InternetAddress[] 타입)
HTML 이메일 전송
HTML 형식의 이메일을 보내려면 setContent() 메서드의 두 번째 인자로 "text/html"을 지정합니다.
예제 코드
// 파일명: SendHTMLEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendHTMLEmail {
public static void main(String[] args) {
String to = "recipient@gmail.com";
String from = "sender@gmail.com";
String host = "localhost";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("HTML 이메일 테스트");
// HTML 콘텐츠 설정
String htmlContent = "환영합니다!
이것은 HTML 이메일입니다.
";
message.setContent(htmlContent, "text/html");
Transport.send(message);
System.out.println("HTML 이메일 전송 성공!");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
첨부 파일 포함 이메일 전송
MimeMultipart와 MimeBodyPart를 사용하여 텍스트와 파일을 함께 전송합니다.
예제 코드
// 파일명: SendFileEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.io.*;
public class SendFileEmail {
public static void main(String[] args) {
String to = "recipient@gmail.com";
String from = "sender@gmail.com";
String host = "localhost";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("첨부 파일 테스트");
// 본문 파트 생성
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("첨부 파일이 포함된 이메일입니다.");
// 멀티파트 컨테이너 생성
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// 첨부 파일 파트 생성
messageBodyPart = new MimeBodyPart();
String filename = "document.pdf";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// 메시지에 멀티파트 설정
message.setContent(multipart);
Transport.send(message);
System.out.println("첨부 파일 이메일 전송 성공!");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
SMTP 인증 설정
메일 서버가 인증을 요구하는 경우 사용자 ID와 비밀번호를 설정합니다.
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.user", "your_username");
props.setProperty("mail.password", "your_password");
인증이 필요한 경우 Session.getInstance(properties, authenticator)를 사용하여 Authenticator 구현체를 전달해야 합니다.
실무 팁
실제 운영 환경에서는 Gmail, Outlook 등 외부 SMTP 서버를 사용하며 TLS/SSL 설정 필요
대량 메일 발송 시 스레드 풀과 연결 풀 활용 권장
예외 처리와 로깅을 철저히 하여 전송 실패 시 재시도 로직 구현