이메일을 전송하기 위해선 SMTP(Simple Mail Transfer Protocol) 서버가 필요하기 때문에 여기선 포털 사이트인 네이버 메일 서버를 이용하겠습니다. 

네이버 SMTP 설정

네이버 SMTP서버를 이용하려면 네이버 메일에서 설정을 조금 바꿔줘야합니다. 

  1. 네이버 로그인
  2. [메일] 메뉴로 들어간 후 [환경설정] 클릭
  3. [환경설정] 메뉴 중 [POP/IMAP 설정]을 클릭
  4. [POP/IMAP 설정] 탭에서 [POP/IMAP 사용] 항목을 사용함으로 설정하고 저장
  5. 화면 아래쪽에 [메일 프로그램 환경 설정 안내]를 보시면 SMTP를 사용하기 위한 서버명과 포트 등의 정보가 있습니다

아래는 POP3와 IMAP에 대한 설명입니다

더보기
POP3와 IMAP
SMTP는 메일을 보내는 역할만 합니다.
한편, 메일을 받을 때는 대표적으로 다음과 같은 프로토콜을 이용합니다.

POP3(Post Office Protocol3)
클라이언트가 메일 서버에서 메일을 받아오는 프로토콜입니다. 즉, 메일 서버에 저장된 메일을 사용자 컴퓨터로 가져와서 확인할 수 있게 해줍니다. 사용자 컴퓨터로 가져온 메일은 옵션에 따라 삭제하거나, 메일 서버에 그대로 저장해둘 수 있습니다.

IMAP(Internet Message Access Protocol)
POP3와 마찬가지로 사용자가 메일 서버에서 메일을 내려받는 프로토콜 중 하나입니다. 다른 점이라면 중앙서버에서 동기화가 이뤄지기 때문에 같은 계정으로 연결된 모든 장치에서 똑같은 내용이 보이게 됩니다.

간단 요약
POP3 : 클라이언트 <--  서버 
IMAP : 클라이언트 <--> 서버 *스마트폰에서 특정 메일을 지웠다면 테블릿에서도 지워짐

 

이메일 작성 화면

간단한 형태의 이메일 작성 페이지

아래는 코드입니다

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SMTP 이메일 전송</title>
</head>
<body>
<h2>이메일 전송하기</h2>
<form method="post" action="SendProcess.jsp">
<table border=1>
    <tr>    
        <td>
            보내는 사람 : <input type="text" name="from" value="" />
        </td>
    </tr>
    <tr>    
        <td>
            받는 사람 : <input type="text" name="to" value="" />
        </td>
    </tr>
    <tr>    
        <td>
            제목 : <input type="text" name="subject" size="50" value="" />
        </td>
    </tr>
    <tr>    
        <td>
            형식 :
            <input type="radio" name="format" value="text" checked />Text
            <input type="radio" name="format" value="html" />HTML
        </td>
    </tr>
    <tr>
        <td>
            <textarea name="content" cols="60" rows="10"></textarea>
        </td>
    </tr>
    <tr>
        <td>
            <button type="submit">전송하기</button>
        </td>
    </tr>
</table>
</form>
</body>
</html>

이메일 전송 클래스

라이브러리 설치

이메일을 보내기 위해서는 확장 라이브러리인 자바메일자바빈스 액티베이션 프레임워크 2가지가 필요합니다

  • 자바메일은 메일 서비스와 관련한 전반적인 기능을 수행합니다. JAVA EE 플랫폼에 기본 포함되는 라이브러리지만 JAVA SE에서는 추가로 설치해줘야 합니다.
    다운로드_javax.mail-1.6.2.jar )
  • 자바빈즈 액티베이션 프레임워크는 자바메일 API가 MIME 데이터를 관리하기 위해 사용됩니다.
    ( 다운로드_activation-1.1.1.jar )

이메일 전송 클래스 작성

자바메일에서 메일 전송은 다음 순서로 이루어집니다

  1. 세션 생성(메일 서버에 사용자 인증)
  2. 메시지 작성
  3. 전송

이메일을 전송해줄 클래스입니다 메일 서버에 대한 인증 처리와 전송 처리를 담당합니다

아래는 코드입니다.

더보기
import java.util.Map;
import java.util.Properties;

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

// 네이버 SMTP 서버를 통해 이메일을 전송하는 클래스
public class NaverSMTP {
    private final Properties serverInfo; // 서버 정보
    private final 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.starttls.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 Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("네이버 ID", "네이버 PW");
            }
        };
    }

    // 주어진 메일 내용을 네이버 SMTP 서버를 통해 전송합니다.
    public void emailSending(Map<String, String> mailInfo) throws MessagingException {
        // 1. 세션 생성
        Session session = Session.getInstance(serverInfo, auth);
        session.setDebug(true);

        // 2. 메시지 작성
        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"));  // 내용

        // 3. 전송
        Transport.send(msg);
    }
}

Point 

  • 네이버 SMTP 서버 정보 인증 정보는 변하지 않기 때문에 final 인스턴스 변수로 만들어 두고, 생성자에서 값을 할당합니다.
  • 단, 네이버 2단계 인증을 사용한다면 이 방식으로는 인증이 되지 않습니다, 같은 이유로 구글로 메일을 보낼 때도 보안 수준을 낮게 설정해야 합니다.

 

HTML 형식 메일 템플릿 준비

메일 본문을 HTML형식으로 전송하려면 기본적인 HTML 문서의 형태를 갖춰야 합니다.

아래는 코드입니다

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MustHave 메일 템플릿</title>
</head>
<body>
    <h2>MustHave 메일 템플릿</h2>
    <table border=1 width="100%">
        <tr>
            <td width="50">내용</td>
            <td>__CONTENT__</td>
        </tr>
        <tr>
            <td>이미지</td>
            <td><img src="https://github.com/goldenrabbit2020/musthave_jsp/blob/main/GOLDEN-RABBIT_LOGO_150.png?raw=true" alt="골든래빗" /></td>
        </tr>
    </table>
</body>
</html>

이메일 전송 처리 페이지 작성

준비한 템플릿과 클래스를 이용해 이메일을 전송해줄 JSP 페이지를 생성하겠습니다 이메일 작성 페이지에서 [전송하기] 버튼을 누르면 이 JSP로 전달되어야 합니다

아래는 코드입니다.

더보기
<%@ page import="java.io.BufferedReader"%>
<%@ page import="java.io.FileReader"%>
<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.Map"%>
<%@ page import="smtp.NaverSMTP"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
// 폼값(이메일 내용) 저장
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"));  // 제목

// 내용은 메일 포맷에 따라 다르게 처리
String content = request.getParameter("content");  // 내용
String format = request.getParameter("format");    // 메일 포맷(text 혹은 html)
if (format.equals("text")) {
    // 텍스트 포맷일 때는 그대로 저장
    emailInfo.put("content", content);
    emailInfo.put("format", "text/plain;charset=UTF-8");
}
else if (format.equals("html")) {
    // HTML 포맷일 때는 HTML 형태로 변환해 저장
    content = content.replace("\r\n", "<br/>");  // 줄바꿈을 HTML 형태로 수정

    String htmlContent = ""; // HTML용으로 변환된 내용을 담을 변수
    try {
        // HTML 메일용 템플릿 파일 읽기
        String templatePath = application.getRealPath("/16EmailSend/MailForm.html");
        BufferedReader br = new BufferedReader(new FileReader(templatePath));

        // 한 줄씩 읽어 htmlContent 변수에 저장
        String oneLine;
        while ((oneLine = br.readLine()) != null) {
            htmlContent += oneLine + "\n";
        }
        br.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    // 템플릿의 "__CONTENT__" 부분을 메일 내용 대체 (변환 완료)
    htmlContent = htmlContent.replace("__CONTENT__", content);
    // 변환된 내용을 저장
    emailInfo.put("content", htmlContent);
    emailInfo.put("format", "text/html;charset=UTF-8");
}

try {
    NaverSMTP smtpServer = new NaverSMTP();  // 메일 전송 클래스 생성
    smtpServer.emailSending(emailInfo);      // 전송
    out.print("이메일 전송 성공");
}
catch (Exception e) {
    out.print("이메일 전송 실패");
    e.printStackTrace();
}
%>

Point

  • 전달받은 제목과 내용 등의 폼값을 Map 타입인 emailContent 변수에 저장합니다 
    Text를 선택한 경우에는 입력한 내용만 저장하고, HTML을 선택한 경우 HTML 형태로 변환해줘야 합니다
  • HTML 형태로 변환하기 위해선 일련의 과정을 거쳐야합니다
    1. 줄바꿈 문자를 <br/>태그로 바꿉니다
    2. HTML 메일용 템플릿의 파일을 하나씩 읽어들입니다
    3. HTML템플릿 __CONTENT__부분을 메일 내용으로 변경해 emailContent에 저장합니다
    4. NaverSMTP 객체를 생성하고 이메일 전송을 요청합니다
  • HTML 형식으로 발송시 이미지를 사용하는 경우 반드시 "http"나 "https"를 포함한 절대 경로를 사용해야 합니다

 


참고한 문헌

성낙현의 JSP 웹 프로그래밍

+ Recent posts