[Java] SMTP를 이용한 메일 발송 기능 구현

 

✅ Java에서 SMTP를 이용한 메일 발송 기능 구현하기

  • 최근에 업무 중 시스템 알림 메일을 자동으로 발송하는 기능이 필요해져서, Java로 SMTP 기반의 메일 발송 기능을 구현하게 되었다.
  • 이 글에서는 내가 개발한 내용을 바탕으로 Java에서 어떻게 메일을 보내는지, 어떤 부분을 주의해야 하는지를 정리해보았다.

1. 사용한 환경

  • Java 17
  • Jakarta Mail (JavaMail) API
  • SMTP 서버 (사내 SMTP 사용 / 인증 불필요)
  • Maven 기반 프로젝트

2. Jakarta Mail 라이브러리 추가

SMTP로 메일을 보내기 위해서는 JavaMail API가 필요하다.
최근에는 javax.mail 대신 jakarta.mail을 사용하는 추세이므로, 나는 아래와 같이 추가했다.

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>

3. SMTP 설정 및 메일 발송 코드

💡 인증 없이 사용하는 SMTP (사내 SMTP 등)

내 경우, SMTP 서버가 인증을 요구하지 않는 환경이라 아래와 같이 간단하게 구현할 수 있었다.

import jakarta.mail.*;
import jakarta.mail.internet.*;

import java.util.Properties;

public class EmailSender {
    public static void main(String[] args) {
        String host = "smtp.mycompany.com"; // 사내 SMTP 서버
        int port = 25; // 인증 없는 경우 보통 25번 포트 사용

        String from = "noreply@mycompany.com";
        String to = "recipient@mycompany.com";
        String subject = "Java 메일 발송 테스트";
        String content = "안녕하세요.\n\nJava에서 SMTP를 이용해 보내는 테스트 메일입니다.";

        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", String.valueOf(port));
        props.put("mail.smtp.auth", "false");
        props.put("mail.smtp.starttls.enable", "false");

        Session session = Session.getInstance(props);

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject(subject);
            message.setText(content); // 일반 텍스트

            Transport.send(message);
            System.out.println("이메일 전송 성공!");
        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("이메일 전송 실패: " + e.getMessage());
        }
    }
}

4. HTML 메일로 예쁘게 꾸미기

일반 텍스트도 좋지만, 시스템 알림 메일은 가독성이 중요한 경우가 많다.
그래서 HTML 형식으로 메일을 보내는 기능도 함께 구현했다.

message.setContent(htmlContent, "text/html; charset=UTF-8");

HTML 내용은 아래처럼 자유롭게 꾸밀 수 있다:

📌 시스템 알림

새로운 작업이 완료되었습니다.

상세 보기

주의할 점은 인라인 스타일을 사용해야 대부분의 메일 클라이언트에서 정상적으로 보인다는 것!


5. 오류 경험 및 해결

❌ Illegal address in string ""

→ 수신자 주소가 null이거나 빈 문자열일 때 발생. 값 확인 필수!

❌ failed to connect, no password specified?

→ SMTP 서버가 인증을 요구하는데 비밀번호를 설정하지 않았을 때 발생.
내 경우는 auth가 필요 없었으므로 mail.smtp.auth = false로 해결했다.


6. 마무리하며

JavaMail을 이용하면 생각보다 간단하게 SMTP 메일 기능을 구현할 수 있다.
사내 시스템 알림, 자동 리포트 전송, 에러 알림 등에 정말 유용하게 활용할 수 있다.

다음에는 HTML 템플릿을 외부에서 불러오거나, 첨부파일 추가하는 방법도 정리해볼 계획이다.


📎 관련 링크


7. HTML 내용으로 발송

import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.util.Properties;

public class HtmlEmailSender {

    public static void main(String[] args) {
        // SMTP 서버 정보 (인증 없이 사용하는 경우)
        String host = "smtp.yourcompany.com";
        int port = 25;
        String fromEmail = "noreply@yourcompany.com";
        String toEmail = "recipient@yourcompany.com";
        String subject = "📌 PLM-VAULT 연계 알림 메일";

        // HTML 본문 내용
        String htmlContent = """
                <html>
                <body style="font-family: Arial, sans-serif; line-height: 1.6;">
                    <h2 style="color: #2F5597;">🔔 PLM-VAULT 연계 알림</h2>
                    <p>안녕하세요,</p>
                    <p>다음과 같이 시스템 연계 작업이 진행되었음을 안내드립니다:</p>
                    <ul>
                        <li><strong>연계 일시:</strong> 2025-03-24</li>
                        <li><strong>적용 시스템:</strong> PLM → VAULT</li>
                        <li><strong>적용 내용:</strong> 도면 라이프사이클 동기화</li>
                    </ul>
                    <p>자세한 내용은 <a href="https://vault-in.hdel.co.kr:8070/china/findReleasedParts" style="color: #1a73e8;">여기</a>를 참고해주세요.</p>
                    <p style="margin-top: 30px;">감사합니다.<br><strong>시스템 운영팀 드림</strong></p>
                    <hr style="margin-top: 40px;"/>
                    <small style="color: #888;">※ 본 메일은 시스템에서 자동 발송된 메일입니다.</small>
                </body>
                </html>
                """;

        // SMTP 속성 설정
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", String.valueOf(port));
        props.put("mail.smtp.auth", "false"); // 인증 없음
        props.put("mail.smtp.starttls.enable", "false"); // TLS 사용 안함

        try {
            Session session = Session.getInstance(props);

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(fromEmail));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
            message.setSubject(subject);
            message.setContent(htmlContent, "text/html; charset=UTF-8");

            Transport.send(message);
            System.out.println("HTML 이메일이 성공적으로 전송되었습니다.");

        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("이메일 전송 중 오류 발생: " + e.getMessage());
        }
    }
}

Designed by JB FACTORY