개요
안녕하세요 빈코입니다. 오늘은 메일 발송 기능인 SMTP에 대해 자세히 알아보려고 합니다. SMTP 프로토콜은 Simple Mail Transfer Protocol의 약자로 인터넷에서 이메일을 전송하는 통신 규약 중 하나를 일컫습니다. 그럼 하단에서 자세히 알아볼까요?
SMTP📙
SMTP는 개요에서 설명한 바와 같이 이메일을 전송하는 통신 규약입니다. 주로 이메일 클라이언트와 서버 간, 그리고 서버와 서버 간의 이메일 전송을 관리하는 역할을 합니다. SMTP의 주요 기능은 이메일 전송, 서버 간 이메일 릴레이, 포트와 연결 등이 있습니다. 여기서 서버 간 이메일 릴레이는 이메일이 발신자의 메일 서버에 도착하면, 이 서버는 수신자의 메일 서버로 이메일을 전송하게 되는데 해당 과정을 서버 간의 릴레이라 칭하며 이메일이 최종 목적지에 도달할 때까지 계속됩니다.
SMTP의 동작 과정으로는 클라이언트에서 서버로 연결하고 발신자와 수신자를 지정한 후에 메일 데이터를 전송하는 과정을 거칩니다.
SMTP의 제약 사항으로는 기본적으로 인증을 요구하지 않기 때문에, 스팸 메일이 쉽게 전송될 수 있는 취약점이 있으며 해당 문제를 방지하기 위해 SMTP-AUTH(사용자 인증)를 사용하는 방식이 도입되었습니다. 또한, 기본 SMTP는 암호화되지 않은 텍스트로 이메일을 전송하기에 중간에 이메일이 가로채질 수 있는 위험이 있었는데, 해당 문제도 SSL/TLS를 통한 암호화 전송 방식이 도입되었습니다.
그럼 이제 하단에서 Java에서 SMTP를 사용하는 방법을 간단한 예시와 함께 설명할게요😁
SMTP Java 적용📘
SMTP를 사용하기 위해서는 JavaMail 라이브러리를 아래와 같이 추가해야 합니다.
pom.xml 사용 시
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
gradle 사용 시
dependencies {
implementation 'com.sun.mail:javax.mail:1.6.2'
}
메일 발송 테스트 Frontend📒
테스트용으로 앞단에서는 메일 테스트를 할 버튼과 해당 버튼을 눌렀을 때 주소를 입력할 Modal을 생성했습니다. 각 코드는 사진 하위에 첨부했습니다.
html 코드
<button type="button" id="btnMailTest" class="btn btn-info btn-sm" data-toggle="tooltip" data-placement="bottom" title="메일 테스트"><i class="fa fa-envelope-o" aria-hidden="true"></i><span class="text">메일 테스트</span></button>
js 코드 (메일 테스트 버튼 클릭 시 이벤트)
$('#btnMailTest').click( function () {
$('#mailTestModal').modal('show');
}
html 코드
<div class="modal fade" id="mailTestModal" data-backdrop="static" role="dialog" aria-hidden="true" tabindex='-1'>
<div class="modal-dialog modal-sm">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title"><span>메일 테스트</span></h4>
</div>
<div class="modal-body" style="padding:10px;">
<div class="wrap-loading" style="display:none;">
<div><img src="resources/img/common/ajax-loader.gif" alt="loading"/></div>
</div>
<div class="form-group"><label for="target_mail">메일 받을 주소</label>
<input type="text" class="form-control" id="target_mail" name="target_mail"></div>
</div>
<div class="modal-footer">
<button type="button" id="confirm_ok" class="btn btn-success btn-sm" data-toggle="tooltip" data-placement="bottom" title="메일 보내기"><i class="fa fa-send-o" aria-hidden="true"></i><span class="text">메일 보내기</span></button>
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal"><i class="fa fa-times" aria-hidden="true"></i><span class="text">닫기</span></button>
</div>
</div>
</div>
</div>
js 코드 (메일 보내기 버튼 클릭 시 이벤트)
$('#mailTestModal #confirm_ok').click( function () {
...유효성 검사 실행(이메일 정규식, 빈 값 체크 등)
$.ajax({
type : "POST",
async : true,
url : "mail/test.do",
dataType : "json",
timeout : 30000,
cache : false,
data : {
"target_mail": $("input[id=target_mail]").val()
},
error : function(request, status, error) {
console.log("error:"+error);
},
success : function(response, status, request) {
$('#mailTestModal').modal('hide');
}
},
beforeSend : function() {
$('.wrap-loading').css('display','');
},
complete : function() {
$('.wrap-loading').css('display','none');
}
});
});
메일 발송 테스트 Backend📗
아래 코드를 분석해 보면 테스트 메일이기 때문에 대부분 테스용으로 작성하였지만, 실제로 메일 발송할 때는 제목, 내용 등 param으로 넘어온 값들로 지정을 하시면 됩니다.
각각의 메일 요소들의 정의가 끝났다면 SMTP 서버의 속성을 설정하기 위해 Properties를 생성하고 호스트, 포트, 전송 계층 보안(TLS) 설정 등을 진행합니다.
이후에, SMTP 서버와의 연결을 관리하는 Session 객체를 생성하고 인증을 위해 PasswordAuthentication 객체를 사용했습니다.
메시지 구성으로는 MimeMessage 객체를 생성하여 이메일 메시지를 구성했습니다. setFrom(), setRecipients(), setSubject(), setText() 등의 메서드를 사용하여 발신자, 수신자, 제목, 본문 등을 설정합니다.
이후에 Transport.send() 메서드를 이용하여 메시지를 발송합니다.
@PostMapping(value = "mail/test.do")
public String jsonMailTest(@RequestParam Map<String, Object> paramMap, Model model, HttpSession session, HttpServletRequest request) {
String result = "success";
String title = "테스트 메일입니다";
String content = "테스트 내용입니다";
String host = "smtp.gmail.com";
String port = "465";
String to = paramMap.get("target_mail").toString();
String user = "userTest@test.com";
String pw = "pwTest";
// SMTP 서버 설정
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.starttls.enable", "true"); // TLS 설정
props.put("mail.smtp.auth","true"); // 인증이 필요한 경우 설정
Session session = Session.getInstance(props); // Session
session = Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, AES128.decryptPassword(user,pw));
});
}
try {
// 이메일 메시지 객체 생성
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(title);
message.setText(content);
// 이메일 전송
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
result = "fail";
}
return result;
}
💡 SSL VS TLS
SSL은 초기 암호화 프로토콜로서 인터넷 보안의 기초를 마련했지만, 여러 보안 문제로 인해 대부분의 서버에서 더 이상 사용되지 않습니다. 해당 문제를 개선한 프로토콜인 TLS는 현재 인터넷상의 보안 통신에서 표준으로 자리 잡고 있습니다. 더 강력한 암호화 알고리즘, 개선된 핸드셰이크 과정 등을 제공하면서 SSL의 단점을 극복했습니다.
마치며
지금까지 Java에서 메일을 보내는 방법에 대해 알아보았습니다. 처음 접할때는 많이 어려워 보였지만 사실 흔히 사용하는 기능이기 때문에 인터넷상 참고할 자료도 많고, 생각보다 복잡하지 않아 쉽게 적용이 가능했던 것 같습니다.
다음 포스팅은 HTTP 서버에 대한 이야기를 해보려 합니다😊
👨👩👦👦 오픈채팅방 운영
취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁
참여코드 : 456456
https://open.kakao.com/o/gVHZP8dg
비전공 개발자 취업 준비방(질문&답변)
#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql
open.kakao.com
'TIL' 카테고리의 다른 글
Java Spring Scheduler 정의 및 사용법 예시 (1) | 2024.09.13 |
---|---|
Java HTTP Server 쉽게 이해하기 및 예제 (1) | 2024.09.09 |
리눅스 파티션 추가 및 디스크 포맷 & 마운트 설정하는 방법(예시포함) (0) | 2024.04.30 |
HTTP와 HTTPS의 차이점 (0) | 2024.04.25 |
HTTP Method 종류 및 사용 방법(GET, POST, PUT, DELETE) (1) | 2024.04.19 |