YONG-MIN

JavaMail을 이용한 메일 전송 (javax.mail)

개발언어/Java, Spring 2018. 2. 28. 20:12

JavaMail을 이용한 단순한 메일전송 방법입니다.

Naver, Google과 같은 곳의 SMTP 서버를 이용합니다.

(당연히 사용할 계정이 있어야 합니다.)

ajax, @ResponseBody를 이용해서 결과에 대한 분기도 가능하고 다양한 방식으로 응용가능합니다.




1. Depency 추가

pom.xml


	javax.mail
	mail
	1.4.7



2. 전송페이지 구성

전송할 내용을 간단히 입력받을 수 있는 화면을 구성합니다.


mailSender.jsp

...생략...

<form name="contact-form" class="form" action="<c:url value='/sendMail'/>" method="POST">
	<div class="col-xs-12">
		<label>
			<span>제목:</span>
			<input type="text" name="subject" value="" placeholder="제목" required>
		</label>
	</div>
	<div class="col-xs-12">
		<label>
			<span>내용:</span>
			<textarea name="message" rows="4" placeholder="메시지" required></textarea>
		</label>
		<button type="submit" class="button">
			<span class="default">Send <i class="icon fa fa-paper-plane"></i></span>
		</button>
	</div>
</form>

...생략...


3. Controller에서 메일전송 로직 구현하기

Controller에서 메일을 전송하는 실제 로직을 작성합니다.

@ResponseBody를 이용해서 전송 결과를 View Page에 출력할 수도 있고 다양하게 활용가능하지만, 여기에선 단순히 "전송"만을 위한 로직을 작성했습니다.

주의하실 부분은 보내는 사람 이메일을 실제 사용하는 SMTP 서버 이메일 주소를 적어야 오류가 나지 않습니다. 

(보내는 주소가 유효하지 않을경우 SMTP 서버에서 보안상 차단되는 경우가 있음)


SamplerController.java

@RequestMapping(value="/sendMail")
public void mailSender(HttpServletRequest request) throws AddressException, MessagingException{
	
	String subject = (String) request.getParameter("subject"); // 메일 제목
	String message = (String) request.getParameter("message"); // 메일 내용
	
	// SMTP 서버 설정
	final String host = "smtp.gmail.com"; // 사용할 smtp host, naver라면 smtp.naver.com
	final String accountId = "#사용자 아이디#";
	final String accountPwd = "#사용자 비밀번호#";
	final int port = 465; // SMTP 포트
	
	String receiver = "#받는사람 이메일#"; // 받는사람 이메일
	String sender = "#보내는사람 이메일#"; // 보내는사람 이메일
	
	// Property 정보 생성
	Properties props = System.getProperties();
	props.put("mail.smtp.host", host);
	props.put("mail.smtp.port", port);
	props.put("mail.smtp.auth", "true");
	props.put("mail.smtp.ssl.enable", "true");
	props.put("mail.smtp.ssl.trust", host);
	
	// 사용자 인증
	Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
		protected javax.mail.PasswordAuthentication getPasswordAuthentication(){
			return new javax.mail.PasswordAuthentication(accountId, accountPwd);
		}
	});
	session.setDebug(true);
	
	Message mimeMessage = new MimeMessage(session); //MimeMesage 생성
	mimeMessage.setFrom(new InternetAddress(sender)); // 보내는 EMAIL (정확히 적어야 SMTP 서버에서 인증 실패되지 않음)
	mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver)); 
	
	// Message Setting
	mimeMessage.setSubject(subject);
	mimeMessage.setText(message);
	Transport.send(mimeMessage); // Transfer
}


4. 결과확인

정상적으로 메일함에 전송되었음을 확인합니다.

Mailbox


콘솔창도 오류없이 잘진행되었습니다.

Console