회원가입 인증, 비밀번호 찾기, 알림 메일 등
다양한 곳에서 이메일 발송이 활용되는데,
이번 글에서는 Gmail SMTP를 이용해서
Java에서 이메일을 발송하는 방법을 정리해본다.
1. 필요한 JAR 파일
JavaMail을 사용하기 위해서는 두 개의 라이브러리가 필요하다.
- mail-1.4.7.jar
- activation-1.1.jar
이 라이브러리들을 프로젝트에 추가해야 한다.
2. Eclipse에 JAR 파일 추가하기
Eclipse에서 외부 JAR 파일을 추가하는 방법은 다음과 같다.
- 프로젝트 우클릭 → Properties
- Java Build Path → Libraries 탭
- Add External JARs... 클릭
- 다운받은 두 개의 JAR 파일 선택
- Apply and Close
추가가 완료되면 Referenced Libraries에서 확인할 수 있다.
3. Gmail 앱 비밀번호 발급받기
일반 Gmail 비밀번호로는 SMTP 인증이 되지 않는다.
반드시 앱 비밀번호를 발급받아야 한다.
발급 순서
- Google 계정 관리 → 보안 메뉴
- 2단계 인증 활성화 (필수)
- 앱 비밀번호 검색 → 새 앱 비밀번호 생성
- 나오는 16자리 코드를 복사
이 16자리 코드가 실제 코드에서 사용할 비밀번호다.
4. 전체 코드 구현
package controller.member;
import java.util.Date;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class Mailsend {
public static void main(String args[]) {
sendMail();
}
public static void sendMail() {
// 메일 인코딩
final String bodyEncoding = "UTF-8";
String subject = "메일 발송 테스트"; // 메일 제목
String fromEmail = "보내는사람@gmail.com"; // 보내는 사람 Gmail
String fromUsername = "발신자명"; // 보내는 사람 이름
String toEmail = "받는사람@naver.com"; // 받는 사람 이메일
final String username = "보내는사람@gmail.com"; // Gmail 주소
final String password = "xxxx xxxx xxxx xxxx"; // 발급받은 앱 비밀번호 16자리
// 메일 본문 내용 (HTML 형식)
StringBuffer sb = new StringBuffer();
sb.append("<h3>안녕하세요</h3>\n");
sb.append("<h4>Java 이메일 발송 테스트입니다</h4>\n");
String html = sb.toString();
// Gmail SMTP 서버 설정
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.protocols", "TLSv1.2");
try {
// 메일 서버 인증 계정 설정
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
};
// 메일 세션 생성
Session session = Session.getInstance(props, auth);
session.setDebug(true);
// 메일 송/수신 옵션 설정
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromEmail, fromUsername));
message.setRecipients(RecipientType.TO, InternetAddress.parse(toEmail, false));
message.setSubject(subject);
message.setSentDate(new Date());
// 메일 콘텐츠 설정
Multipart mParts = new MimeMultipart();
MimeBodyPart mTextPart = new MimeBodyPart();
mTextPart.setText(html, bodyEncoding, "html");
mParts.addBodyPart(mTextPart);
message.setContent(mParts);
// MIME 타입 설정
MailcapCommandMap MailcapCmdMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
MailcapCmdMap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
CommandMap.setDefaultCommandMap(MailcapCmdMap);
// 메일 발송
Transport.send(message);
System.out.println("✅ 이메일이 성공적으로 발송되었습니다.");
} catch (Exception e) {
System.err.println("❌ 이메일 발송 중 오류 발생:");
e.printStackTrace();
}
}
}
참고로 위 코드를 그대로 복사해서 사용하면 안 된다.
다음 항목들은 본인의 정보로 꼭 변경해야 한다.
▼ 변경 필요한 코드
String fromEmail = "보내는사람@gmail.com"; // 본인의 Gmail 주소
String toEmail = "받는사람@naver.com"; // 받을 사람 이메일
final String username = "보내는사람@gmail.com"; // 본인의 Gmail 주소
final String password = "xxxx xxxx xxxx xxxx"; // 발급받은 앱 비밀번호
핵심 체크리스트
- fromEmail과 username은 반드시 같은 Gmail 주소여야 한다
- password는 Gmail 로그인 비밀번호가 아닌 앱 비밀번호 16자리
- toEmail은 Gmail이 아니어도 상관없다 (네이버, 다음 등 가능)
5. 실행 방법
[ Java Application ] 으로 실행
> Eclipse에서 java 파일을 우클릭
→ Run As → Java Application
또는 Ctrl + F11 단축키로 실행하면 된다.
※ 주의사항
이 코드는 톰캣 서버로는 실행되지 않는다.
톰캣은 웹 애플리케이션 서버라서
Servlet이나 JSP 같은 웹 컴포넌트만 실행한다.
main 메서드가 있는 일반 Java 클래스는
Java Application으로 실행해야 한다.
웹에서 메일 발송 기능을 사용하려면?
만약 웹 페이지에서 버튼 클릭 시 메일을 보내고 싶다면
Servlet으로 변경해야 한다.
@WebServlet("/sendMail")
public class MailServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
sendMail(); // 메일 발송
response.setContentType("text/html; charset=UTF-8");
response.getWriter().println("메일이 발송되었습니다!");
}
private void sendMail() {
// 위의 sendMail() 메서드 내용을 그대로 복사
}
}
이렇게 하면 http://localhost:8080/프로젝트명/sendMail
주소로 접속했을 때 메일이 발송된다.
실무에서는 Ajax 비동기 처리를 많이 사용한다
실제 프로젝트에서는 페이지 새로고침 없이
이메일 인증을 처리하기 위해 Ajax + Servlet 조합을 사용한다.
프론트엔드 (JavaScript)
$("#emailCheckBtn").click(function(){
let userEmail = $("#userEmailInfo").val();
$.ajax({
url : "email.do",
type : "POST",
data : { userEmailInfo : userEmail },
success : function(result){
if(result === "true"){
alert("인증번호가 발송되었습니다!");
}
}
});
});
백엔드 (Servlet)
else if(command.equals("/email.do")) {
String emailInfo = request.getParameter("userEmailInfo");
String authCode = EmailService.sendMail(emailInfo);
if (authCode != null) {
session.setAttribute("emailAuthNum", authCode);
response.getWriter().print("true"); // Ajax에 응답
}
return; // 페이지 이동 없이 종료
}
이렇게 하면 사용자는 페이지 이동 없이
실시간으로 이메일 발송 결과를 확인할 수 있다.
핵심은 다음과 같다.
- response.getWriter().print() - Ajax에 결과 반환
- return; - 페이지 새로고침 없이 종료
- 세션 활용 - 인증번호를 서버에 임시 저장
6. 실행 결과
성공하면 콘솔에 다음과 같이 출력된다.
✅ 이메일이 성공적으로 발송되었습니다.
그리고 받는 사람 메일함에 메일이 정상적으로 도착한다.
디버그 모드(session.setDebug(true))를 켜두었다면
SMTP 통신 과정도 콘솔에 자세히 출력된다.
7. 자주 발생하는 오류
인증 실패 (Authentication failed)
- Gmail 앱 비밀번호가 틀렸을 가능성이 높다
- 2단계 인증이 활성화되어 있는지 확인한다
ClassNotFoundException
- JAR 파일이 제대로 추가되지 않은 것이다
- Build Path에서 Referenced Libraries를 확인한다
연결 실패 (Connection refused)
- 방화벽이나 네트워크 문제일 수 있다
- 포트 587이 막혀있지 않은지 확인한다
8. 추가 팁
여러 명에게 보내기
String toEmail = "user1@naver.com,user2@gmail.com,user3@daum.net";
콤마로 구분해서 여러 이메일 주소를 넣으면 된다.
HTML 스타일 적용하기
sb.append("<div style='color: blue; font-size: 16px;'>");
sb.append("<h3>제목</h3>");
sb.append("<p>내용입니다</p>");
sb.append("</div>");
HTML 태그와 CSS 스타일을 자유롭게 사용할 수 있다.
[ 최종 정리 ]
Java에서 이메일 발송 기능을
구현하는 것은 생각보다 간단하다.
Gmail SMTP를 이용하면
별도의 메일 서버 없이도 쉽게 구현할 수 있고,
회원가입 인증 메일, 비밀번호 찾기, 알림 메일 등
다양한 곳에 활용할 수 있다.
핵심은 다음 세 가지다.
- JavaMail 라이브러리 추가
- Gmail 앱 비밀번호 발급
- SMTP 설정과 메일 발송 로직 구현
이번 포스팅에서는 가장 기본적인
이메일 발송 방법을 다루었는데,
실제 프로젝트에서는 이를 Servlet으로 구현하거나
Spring Framework와 연동하여 사용하게 된다.
'개주 훈련일지 > 🏋️ 전집중 호흡 훈련' 카테고리의 다른 글
| CKEditor5 커스텀 빌드 만들기(이미지 업로드 구현) (0) | 2025.12.13 |
|---|---|
| CKEditor5 기초 가이드 (0) | 2025.12.12 |
| OAuth 기반 카카오 로그인 API (0) | 2025.12.10 |
| 카카오페이 API 단건 결제 방법 정리 (0) | 2025.12.05 |
| 간단한 용어 정리 - 프론트 / 백 (0) | 2025.12.02 |