[Java] SMTP를 이용한 메일 발송 기능 구현
- 📕 Programing/Java
- 2025. 3. 22.
✅ 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());
}
}
}
'📕 Programing > Java' 카테고리의 다른 글
인텔리제이 단축키 (0) | 2025.04.04 |
---|---|
[Java] 자바 천 단위(1000) 숫자 3자리마다 콤마(,) 표시하기 (1) | 2025.02.02 |
[Java] 문자열이 숫자인지 검증하는 로직 (0) | 2025.01.01 |
[Java] Exce Library (0) | 2025.01.01 |
[Java] Java 날짜 포맷 변경 방법 (0) | 2024.11.30 |