개주 훈련일지/🏋️ 전집중 호흡 훈련

Java로 이메일 발송 구현하기(Gmail SMTP 사용)

lshfood2 2025. 12. 11. 12:52

회원가입 인증, 비밀번호 찾기, 알림 메일 등

다양한 곳에서 이메일 발송이 활용되는데,

 

이번 글에서는 Gmail SMTP를 이용해서

Java에서 이메일을 발송하는 방법을 정리해본다.

 

1. 필요한 JAR 파일

JavaMail을 사용하기 위해서는 두 개의 라이브러리가 필요하다.

  • mail-1.4.7.jar
  • activation-1.1.jar

mail-1.4.7.jar
0.50MB
activation-1.1.jar
0.06MB

 

이 라이브러리들을 프로젝트에 추가해야 한다.


2. Eclipse에 JAR 파일 추가하기

Eclipse에서 외부 JAR 파일을 추가하는 방법은 다음과 같다.

  1. 프로젝트 우클릭 → Properties
  2. Java Build Path → Libraries 탭
  3. Add External JARs... 클릭
  4. 다운받은 두 개의 JAR 파일 선택
  5. Apply and Close

추가가 완료되면 Referenced Libraries에서 확인할 수 있다.


3. Gmail 앱 비밀번호 발급받기

일반 Gmail 비밀번호로는 SMTP 인증이 되지 않는다.

반드시 앱 비밀번호발급받아야 한다.

 

발급 순서

  1. Google 계정 관리 → 보안 메뉴
  2. 2단계 인증 활성화 (필수)
  3. 앱 비밀번호 검색 → 새 앱 비밀번호 생성
  4. 나오는 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"; // 발급받은 앱 비밀번호

 

핵심 체크리스트

  1. fromEmail과 username은 반드시 같은 Gmail 주소여야 한다
  2. password는 Gmail 로그인 비밀번호가 아닌 앱 비밀번호 16자리
  3. toEmail은 Gmail이 아니어도 상관없다 (네이버, 다음 등 가능)

5. 실행 방법

[ Java Application ] 으로 실행

> Eclipse에서 java 파일을 우클릭
Run AsJava 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와 연동하여 사용하게 된다.