JSP

[JSP] 네이버 이메일을 이용한 SMTP

allempty_sheep 2024. 7. 15. 14:11
반응형

JSP 에서 네이버 이메일을 사용하여 이메일을 보내는 것을 만들어보자.

 

먼저 네이버 메일 환경 설정을 다음과 같이 해준다.

 

서버를 살펴보자

pop 은 받을 때의 주소이고, SMTP 서버는 보낼 때의 주소이다.

 

이메일을 보낼 form 을 하나 만들어 주자.

emailSendMain.jsp

<form method="post" action="">
			<div class="container">
				<div class="row">
					<div class="col">
						보내는 사람 : <input type="text" class="form-control" name="from" value="" />
					</div>
				</div>
				<div class="row">
					<div class="col">
						받는 사람 : <input type="text" class="form-control" name="to" value="" />
					</div>
				</div>
				<div class="row">
					<div class="col">
						제목 : <input type="text" class="form-control" name="subject" value="" />
					</div>
				</div>
				<div class="row">
					<div class="col">
						형식 : 
						<input type="radio" name="format" value="text" checked />Text
						<input type="radio" name="format" value="html" />HTML
					</div>
				</div>
				<div class="row">
					<div class="col">
						내용 : <textarea class="form-control" rows="10" cols="60" name="content"></textarea>
					</div>
				</div>
				<div class="row">
					<div class="col">
						<button class="btn" type="submit">전송하기</button>
					</div>
				</div>
			</div>
		</form>

 

jar 파일을 2개 받아주자.

https://mvnrepository.com/artifact/com.sun.mail/javax.mail/1.6.2

 

https://mvnrepository.com/artifact/javax.activation/activation/1.1.1

 

 

 

smtp 라는 패키지를 하나 만들고 NaverSMTP 클래스를 만들어 줄 것이다.

네이버 아이디, 비밀번호는 자신의 것을 사용한다.

NaverSMTP.java

package smtp;

import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.util.Map;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class NaverSMTP {
	private final Properties serverInfo;
	private final javax.mail.Authenticator auth;
	
	public NaverSMTP() {
		// 네이버 SMTP 서버 접속 정보
		serverInfo = new Properties();
		serverInfo.put("mail.smtp.host", "smtp.naver.com");
		serverInfo.put("mail.smtp.port", "465");
		serverInfo.put("mail.smtp.starttles.enable", "true");
		serverInfo.put("mail.smtp.auth", "true");
		serverInfo.put("mail.smtp.debug", "true");
		serverInfo.put("mail.smtp.socketFactory.port", "465");
		serverInfo.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		serverInfo.put("mail.smtp.socketFactory.fallback", "false");
		
		//사용자 인증 정보
		auth = new javax.mail.Authenticator() {
			
			@Override
			protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
				
				return new javax.mail.PasswordAuthentication("네이버아이디", "네이버비밀번호");
			}
		};
	}
	
	public void emailSending(Map<String, String> mailInfo) throws MessagingException {
		Session session = Session.getInstance(serverInfo, auth);
		session.setDebug(true);
		
		MimeMessage msg = new MimeMessage(session);
		msg.setFrom(new InternetAddress(mailInfo.get("from")));
		msg.addRecipient(Message.RecipientType.TO, new InternetAddress(mailInfo.get("to")));
		msg.setSubject(mailInfo.get("subject"));
		msg.setContent(mailInfo.get("content"), mailInfo.get("format"));
		
		Transport.send(msg);
	}
}

 

메일을 보내기 위한 서블렛도 만들어 준다. (smtp 패키지 안)

SendProcessServ.java

package smtp;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SendProcessServ
 */
@WebServlet("/SendProcessServ")
public class SendProcessServ extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SendProcessServ() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// doGet(request, response);

		response.setContentType("text/html; charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		ServletContext application = this.getServletContext();
		// 폼에서 받은 값
		Map<String, String> emailInfo = new HashMap<String, String>();
		emailInfo.put("from", request.getParameter("from"));
		emailInfo.put("to", request.getParameter("to"));
		emailInfo.put("subject", request.getParameter("subject"));
		
		System.out.println("from : " + request.getParameter("from"));
		System.out.println("to : " + request.getParameter("to"));
		System.out.println("subject : " + request.getParameter("subject"));
		
		// 메일 포맷에따라 처리
		String content = request.getParameter("content");
		String format = request.getParameter("format");

		System.out.println("content : " + content);
		System.out.println("format : " + format);
		if(format.equals("text")) {
			// 텍스트 포맷일 경우 그대로
			System.out.println("텍스트 포맷");
			emailInfo.put("content", content);
			System.out.println("텍스트 포맷11");
			emailInfo.put("format", "text/plain;charset=UTF-8");
			System.out.println("텍스트 포맷22");
			
		} else if (format.equals("html")) {
			System.out.println("html* 포맷");
			content = content.replace("\r\n", "<br/>");
			String htmlContent = "";
			
			try {
				// 메일용 템플릿 읽기
				String templatePath = application.getRealPath("/test/MailForm.jsp");
				BufferedReader br = new BufferedReader(new FileReader(templatePath));
				
				//한줄씩 읽어서 htmlContent 변수에 저장
				String oneLine;
				while((oneLine = br.readLine()) != null){
					htmlContent += oneLine = "\n";
				}
				br.close();
			}catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			
			// 템플릿의 __CONTENT__ 부분을 메일 내용으로 대체
			htmlContent = htmlContent.replace("__CONTENT__", content);
			//변환된 내용 저장
			emailInfo.put("content", htmlContent);
			emailInfo.put("format", "text/html;charset=UTF-8");
		}
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/test/mail_process.jsp");
		try {
			System.out.println("실행 전");
			NaverSMTP smtpServer = new NaverSMTP();
			smtpServer.emailSending(emailInfo);
			System.out.println("이메일 전송 성공");
			request.setAttribute("rs", "1");
			dispatcher.forward(request, response);
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("이메일 전송 실패");
			e.printStackTrace();
			request.setAttribute("rs", "0");
			dispatcher.forward(request, response);
		}
	}

}

 

HTML 포맷일 경우 사용할 폼도 하나 만들어준다.

mailForm

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>메일 템플릿</h2>
	<div class="container">
		<div class="row">
			<div class="col-6">내용</div>
			<div class="col-6">__CONTENT__</div>
		</div>
		<div class="row">
			<div class="col-6">이미지</div>
			<div class="col-6"><img /></div>
		</div>
	</div>
</body>
</html>

 

완료 시 처리 될 페이지도 만들어 준다.

mail_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="/include/header.jsp"%>
<link href="/css/member/login.scss" rel="stylesheet" type="text/css">
<fmt:bundle basename="resource.language">
	<%
	// write_prop1 : '<fmt:message key="Write.prop1" />'
	//<fmt:message key="Login" />
	%>
	<%
		String rs = "0";
		try{
			rs = (request.getAttribute("rs").toString());
		} catch(Exception e) {
			rs = null;
		}
		
		System.out.println("process rs : " + rs);
	%>
	<% if( rs == "0") { %>
		<script>
			alert("메일 전송 실패");
			var editErrorMsg = '';
	    	editErrorMsg = '<fmt:message key="Signup.Fail"/>';
			history.back();
		</script>	
	<% } else if(rs == "1") { %>
		<script>
			alert("메일 전송 성공");
			var editErrorMsg = '';
	    	editErrorMsg = '<fmt:message key="Signup.Success"/>';
			location.href="/index.jsp";
		</script>	
	<% } else {}%>

	</fmt:bundle>
<%@ include file="/include/footer.jsp"%>

 

 

메일 보내는 폼으로 이동하여 실행 하여 보자.

메일이 잘 가는 것을 볼 수 있다.