본문 바로가기

JAVA,JSP

JSP 메일 보내기

JSP 메일 보내기

안녕하세요. 이번에는 JSP 메일 보내기에 대해 포스팅하겠습니다.


먼저, JSP로 메일을 보내기 위해선 mail.jaractivation.jar 라는 두개의 라이브러리가 필요합니다.

Accept License Agreement 체크하시고 두개 다 받으시면 됩니다.

두 파일의 압축을 푸시면 바로 mail.jar 파일과 activation.jar 파일이 보이실 겁니다.

귀찮으신 분들을 위한 ~~

mail.jar

activation.jar

위의 파일들을 라이브러리에 추가해줍니다.


그럼 이제 메일을 보내기위한 Form 부분을 작성합니다.


mailForm.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		<form action="SendMail.jsp" method="post">
			<table>
				<tr><th colspan="2">JSP 메일 보내기</th></tr>
				<tr><td>from</td><td><input type="text" name="from" /></td></tr>
				<tr><td>to</td><td><input type="text" name="to" /></td></tr>
				<tr><td>subject</td><td><input type="text" name="subject" /></td></tr>
				<tr><td>content</td><td><textarea name="content" style="width:170px; height:200px;"></textarea></td></tr>
				<tr><td colspan="2" style="text-align:right;"><input type="submit" value="Transmission"/></td></tr>
			</table>
		</form>
	</div>
</body>
</html>


이제 메일 전송을 처리할 sendMail.jsp 파일을 작성해야 하는데요.

작성하기 전에 SMTP 서버의 인증정보를 담고있는 클래스를 먼저 생성해주어야 합니다.

javax.mail.Authenticator 클래스를 상속하고, getPasswordAuthentication() 메서드를 오버라이딩 해야 합니다.

이름은 SMTPAuthenticator로 하여 작성하겠습니다.


SMTPAuthenticator.java

package mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SMTPAuthenticatior extends Authenticator{

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("ID","Password");
    }
}

ID,Password 부분에 SMTP 서버에 로그인하기 위한 계정정보를 입력해줍니다.


이제 메일발송을 처리할 sendMail.jsp 파일을 만듭니다.


sendMail.jsp

<%@page import="javax.mail.Transport"%>
<%@page import="javax.mail.Message"%>
<%@page import="javax.mail.Address"%>
<%@page import="javax.mail.internet.InternetAddress"%>
<%@page import="javax.mail.internet.MimeMessage"%>
<%@page import="javax.mail.Session"%>
<%@page import="mail.SMTPAuthenticatior"%>
<%@page import="javax.mail.Authenticator"%>
<%@page import="java.util.Properties"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");

String from = request.getParameter("from");
String to = request.getParameter("to");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
// 입력값 받음

Properties p = new Properties(); // 정보를 담을 객체

p.put("mail.smtp.host","smtp.naver.com"); // 네이버 SMTP

p.put("mail.smtp.port", "465");
p.put("mail.smtp.starttls.enable", "true");
p.put("mail.smtp.auth", "true");
p.put("mail.smtp.debug", "true");
p.put("mail.smtp.socketFactory.port", "465");
p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
p.put("mail.smtp.socketFactory.fallback", "false");
// SMTP 서버에 접속하기 위한 정보들

try{
    Authenticator auth = new SMTPAuthenticatior();
    Session ses = Session.getInstance(p, auth);
    
    ses.setDebug(true);
    
    MimeMessage msg = new MimeMessage(ses); // 메일의 내용을 담을 객체
    msg.setSubject(subject); // 제목
    
    Address fromAddr = new InternetAddress(from);
    msg.setFrom(fromAddr); // 보내는 사람
    
    Address toAddr = new InternetAddress(to);
    msg.addRecipient(Message.RecipientType.TO, toAddr); // 받는 사람
    
    msg.setContent(content, "text/html;charset=UTF-8"); // 내용과 인코딩
    
    Transport.send(msg); // 전송
} catch(Exception e){
    e.printStackTrace();
    out.println("<script>alert('Send Mail Failed..');history.back();</script>");
    // 오류 발생시 뒤로 돌아가도록
    return;
}

out.println("<script>alert('Send Mail Success!!');location.href='mailForm.html';</script>");
// 성공 시
%>

Properties 객체에 SMTP 서버 접속에 필요한 정보를 저장하여 인증하고 세션을 얻어오고,

(현재 Properties 객체에 넣는 정보들은 naver SMTP 서버에 인증하기 위한 정보들입니다.

네이버 메일에서 설정 - POP3/SMTP 설정에 가시면 확인하실 수 있습니다.)

MimeMessage 클래스에 전달한 입력값들을 저장하여

Transport 객체의 send 메서드를 이용하여 메일을 보냅니다.

현재 SMTP 서버를 만들어둔게 없어 naver의 SMTP 서버를 사용하였습니다.

smtp.naver.com이 naver smtp서버의 주소이며 구글은 smtp.google.com 입니다.

원래는 이 두개의 smtp 서버를 사용해도 메일보내기 기능을 구현하는데 문제가 없었으나..

어느 순간부터 제약적이게 바뀌었습니다.. 그것은 아래에서 언급하겠습니다.


메일 전송이 잘 됩니다.

제 gmail 계정으로 메일을 전송하였으니 잘 전달되었는지 확인해보겠습니다.


메일이 잘 전달되었음을 확인할 수 있습니다.


Naver나 Google의 SMTP 사용을 위한 설정

SMTP 서버를 Naver나 Google의 것을 쓸 경우 추가적으로 설정해줘야 할 부분이 있습니다.


1. Naver

네이버의 경우 왼쪽의 설정버튼을 클릭한 후, POP3/SMTP설정에서 POP3/SMTP 사용사용함으로 체크해주셔야 합니다.


2. Google

계정정보 설정으로 들어갑니다.

로그인 설정 부분에 보안 수준이 낮은 앱의 액세스 라는 부분이 차단됨으로 설정되어 있습니다.

이를 클릭합니다.

이를 사용 으로 바꿔주면, 무리없이 메일 전송이 가능합니다.


하나의 안타까운 사실..

Naver나 Google의 SMTP 서버는 메일 보내기를 대행해주는 역할만을 수행해왔었습니다.

위의 SMTP 서버를 이용하여 메일보내기 로직을 처리하는 페이지를 만드는데 무리가 없었죠.

그러나 어느 순간부터, 저희가 위에서 만들었던 SMTPAuthenticator 클래스 내의 인증정보와

mailForm.html에 입력하는 from 부분의 계정이 같지 않으면 전송이 불가능해졌습니다. ㅠㅠ

즉, 보내는 사람의 주소는 SMTP 서버에 인증하는 계정과 같아야만 전송이 가능합니다..


그러므로 저희가 SMTP 서버를 따로 구축해야만 메일보내기 기능이 구현 가능하게 되었습니다.

안타깝네요.


이상 포스팅을 마치겠습니다. 감사합니다.

'JAVA,JSP' 카테고리의 다른 글

System.out 출력 포맷  (0) 2016.06.10
String 클래스 matches 메서드  (0) 2015.09.20
이미지 태그 src 값 추출  (0) 2015.06.02
[Java]Eclipse 설치 및 기본설정  (0) 2015.04.04
[Java] JAVA 사용 환경 구축  (0) 2015.04.04