JSP 메일 보내기

JAVA,JSP 2015. 5. 22. 02:10


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
JSP 메일 보내기  (8) 2015.05.22
[Java]Eclipse 설치 및 기본설정  (0) 2015.04.04
[Java] JAVA 사용 환경 구축  (0) 2015.04.04

댓글을 달아 주세요

  • ㅇㅅㅇ 2016.01.29 15:02  댓글주소  수정/삭제  댓글쓰기

    감사합니다.

  • ㅇ_ㅇ 2016.03.08 10:58  댓글주소  수정/삭제  댓글쓰기

  • Lee 2016.03.20 17:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    올려주신 강좌 참고해서 비밀번호 찾기 시스템을 만들어 볼수 있었네요 ^^
    감사합니다.

  • 정태명 2016.12.10 16:02  댓글주소  수정/삭제  댓글쓰기


    return new PasswordAuthentication("ID","Password"); 이부분과
    mail.html 에서 id 네모칸에

    @naver.com 까지 포함하여 적어야하나요?
    아니면 아이디만 적으면되나요?

  • 김진오 2017.12.05 00:06  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다 덕분에 인증번호 시스템을 구현하는데 도움이 되었어요!

  • 새내기 개발자 2019.03.18 23:30  댓글주소  수정/삭제  댓글쓰기

    다른곳 아무리 해도 구글계정으론 안되서 여기서 네이버 smtp 로 했는데..잘되네요.
    정말감사합니다.

    하다보니
    return new PasswordAuthentication("ID","Password"); 이부분에 네이버 아이디와 패스워드를 넣어야 하더군요.;;;
    책보다 보기가 쉽습니다. 감사합니다.

  • 문의드립니다. 2019.06.08 06:50  댓글주소  수정/삭제  댓글쓰기

    전 구글을 smtp로 사용하는 걸로 해서 사용했는데요
    에러가 나거든요^^
    어디가 잘못된걸까요? 아무리 검색을 해봐도..제가 워낙 초짜라...원인을 모르겠습니다. 도움좀받을수있을까용?!
    아...부디 제 글을 보셨으면 좋겠습니다만....

    참고로 저는
    SMTPAuthenticator.java 이 파일은 /lib, /bin, /root 에도 다 넣고 실행해봤는데 에러가나네요..ㅠㅠ


    Type Exception Report

    Message Unable to compile class for JSP:

    Description The server encountered an unexpected condition that prevented it from fulfilling the request.

    Exception
    org.apache.jasper.JasperException: Unable to compile class for JSP:

    An error occurred at line: [14] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.Transport resolves to a package

    An error occurred at line: [15] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.Message resolves to a package

    An error occurred at line: [16] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.Address resolves to a package

    An error occurred at line: [17] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.internet.InternetAddress resolves to a package

    An error occurred at line: [18] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.internet.MimeMessage resolves to a package

    An error occurred at line: [19] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.Session resolves to a package

    An error occurred at line: [20] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. mail.SMTPAuthenticatior resolves to a package

    An error occurred at line: [21] in the generated java file: [C:\Program Files\Apache Software Foundation\Tomcat 8.5\work\Catalina\localhost\ROOT\org\apache\jsp\sendMail_jsp.java]
    Only a type can be imported. javax.mail.Authenticator resolves to a package

    An error occurred at line: [69] in the jsp file: [/sendMail.jsp]
    Authenticator cannot be resolved to a type
    66:
    67: try{
    68:
    69: Authenticator auth = new SMTPAuthenticatior();
    70:
    71: Session ses = Session.getInstance(p, auth);
    72:


    An error occurred at line: [69] in the jsp file: [/sendMail.jsp]
    SMTPAuthenticatior cannot be resolved to a type
    66:
    67: try{
    68:
    69: Authenticator auth = new SMTPAuthenticatior();
    70:
    71: Session ses = Session.getInstance(p, auth);
    72:


    An error occurred at line: [71] in the jsp file: [/sendMail.jsp]
    Session cannot be resolved to a type
    68:
    69: Authenticator auth = new SMTPAuthenticatior();
    70:
    71: Session ses = Session.getInstance(p, auth);
    72:
    73:
    74:


    An error occurred at line: [71] in the jsp file: [/sendMail.jsp]
    Session cannot be resolved
    68:
    69: Authenticator auth = new SMTPAuthenticatior();
    70:
    71: Session ses = Session.getInstance(p, auth);
    72:
    73:
    74:


    An error occurred at line: [79] in the jsp file: [/sendMail.jsp]
    MimeMessage cannot be resolved to a type
    76:
    77:
    78:
    79: MimeMessage msg = new MimeMessage(ses); // 메일의 내용을 담을 객체
    80:
    81: msg.setSubject(subject); // 제목
    82:


    An error occurred at line: [79] in the jsp file: [/sendMail.jsp]
    MimeMessage cannot be resolved to a type
    76:
    77:
    78:
    79: MimeMessage msg = new MimeMessage(ses); // 메일의 내용을 담을 객체
    80:
    81: msg.setSubject(subject); // 제목
    82:


    An error occurred at line: [85] in the jsp file: [/sendMail.jsp]
    Address cannot be resolved to a type
    82:
    83:
    84:
    85: Address fromAddr = new InternetAddress(from);
    86:
    87: msg.setFrom(fromAddr); // 보내는 사람
    88:


    An error occurred at line: [85] in the jsp file: [/sendMail.jsp]
    InternetAddress cannot be resolved to a type
    82:
    83:
    84:
    85: Address fromAddr = new InternetAddress(from);
    86:
    87: msg.setFrom(fromAddr); // 보내는 사람
    88:


    An error occurred at line: [91] in the jsp file: [/sendMail.jsp]
    Address cannot be resolved to a type
    88:
    89:
    90:
    91: Address toAddr = new InternetAddress(to);
    92:
    93: msg.addRecipient(Message.RecipientType.TO, toAddr); // 받는 사람
    94:


    An error occurred at line: [91] in the jsp file: [/sendMail.jsp]
    InternetAddress cannot be resolved to a type
    88:
    89:
    90:
    91: Address toAddr = new InternetAddress(to);
    92:
    93: msg.addRecipient(Message.RecipientType.TO, toAddr); // 받는 사람
    94:


    An error occurred at line: [93] in the jsp file: [/sendMail.jsp]
    Message.RecipientType.TO cannot be resolved to a type
    90:
    91: Address toAddr = new InternetAddress(to);
    92:
    93: msg.addRecipient(Message.RecipientType.TO, toAddr); // 받는 사람
    94:
    95:
    96:


    An error occurred at line: [101] in the jsp file: [/sendMail.jsp]
    Transport cannot be resolved
    98:
    99:
    100:
    101: Transport.send(msg); // 전송
    102:
    103: } catch(Exception e){
    104:


    Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:212)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:549)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:350)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:595)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


    Note The full stack trace of the root cause is available in the server logs.

  • 유학생 2019.09.04 23:30  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 과제때문에 구글링해보다 들어왔습니다
    구글 smtp를 이용할 경우에는 gmail-smtp.l.google.com 이걸 넣어줘야 작동이 되더라고요