본문 바로가기

Spring

Spring 메일 보내기 Mail 보내기

728x90

스프링의 mailx 라이브러리로 편하게 메일을 보낼 수 있다.

개발한 코드는 당연히 내 기준에 간단하면서 맘에 드는 형식이다.

 

메일을 보내기 위해선 당연히 메일서버가 필요하다.

우리가 스프링에서 해야할 것은 메일서버(smtp)로 요청을 보내는 것이다.

 

나는 네이버 메일을 사용했다. 구글x

 

먼저 네이버에서 SMTP사용 설정을 해야한다.

네이버 SMTP 사용

네이버 메일 > 환경설정(아래에 조그맣게 있음) > POP3/SMTP 설정 > 사용함 설정

밑의 환경 설정 값은 context에서 빈 설정때 쓰인다.

 

pom.xml dependency 추가

 


		<dependency>
			<groupId>com.sun.mail</groupId>
			<artifactId>javax.mail</artifactId>
			<version>1.6.2</version>
		</dependency>
		
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-context-support</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>

 

java mail 라이브러리 사용을 위한 dependency를 추가했다.

 

*** 2021-12-09 com.sun.mail로 수정

=> SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 에러가 발생해서 com.sun.mail로 수정했더니 해결

 

 

root-context.xml에 bean 설정

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
       <property name="host" value="${smtp_host}" />
       <property name="port" value="${smtp_port}" />
       <property name="username" value="${smtp_id}"/> 
       <property name="password" value="${smtp_password}"/> 
       <property name="defaultEncoding" value="utf-8" />
       
       <property name="javaMailProperties"> 
	       <props> 
	       		<prop key="mail.smtp.starttls.enable">true</prop>
			      <prop key="mail.smtp.auth">true</prop>
			      <prop key="mail.smtps.ssl.checkserveridentity">true</prop>
			      <prop key="mail.smtps.ssl.trust">*</prop>
                  <prop key="mail.smtp.ssl.enable">true</prop>
			      <prop key="mail.debug">true</prop>
			      <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
	       </props> 
       </property>
    </bean>

당연한 얘기지만, 나는 빈객체로 관리안하고 매번 new로 객체 생성해서 쓸거야 끄에에에엑 한다면 설정할 필요없다. 대신 객체 생성후 필요한 속성(호스트, 아이디, 비번, ssl관련 등)들을 설정해야할 것이다. 방법은 나도 안해봐서 모른다.

 

 

MailUtil

나는 Util패키지내에 따로 Mail유틸로 정의해서 메일 관련 메서드를 정리하려고 한다. Controller나 Service에서 빈객체로 설정한 MailSender를 @Autowired 같이 빈 객체를 주입받아 사용할 것이라면 조금 설정이 다를 것이다.

물론 메일을 보내는 로직은 동일하다.

 

package com.poozim.jobcall.util;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

@Component
public class MailUtil {
	
	private static JavaMailSender mailSender;
	
	@Autowired
	public void MailUtil(JavaMailSender mailSender) {
		this.mailSender = mailSender;
	}
	
	public static int mailSend(String title, String from, String text, String to, String cc) {
		if(from == null || from.equals("")) {
			from = 메일 주소;
		}
		
		try {
			MimeMessage message = mailSender.createMimeMessage();
			
			message.setFrom(new InternetAddress(from));
			message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
			
			if(cc != null && !cc.equals("")) {
				message.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));
			}
			
			message.setSubject(title);
			message.setText(text);
			
			mailSender.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		return 1;
	}
}

@Component => @Controller나 @Service에서 @Autowired를 사용해 빈을 받는게 아니기 때문에 추가해주어야 한다.

private static JavaMailSender mailSender, 생성자 => statice에는 @Autowired로 빈객체를 주입받는게 불가능하기 때문에 생성자로 빈객체를 돌려서 받고 있다. (mailSender.createMimeMessage()에서 NullPoint예외가 뜬다면 빈 주입이 안된것으로 의심해야한다)

 

이게 싫다면, 컨트롤러나 서비스에서 mailSend를 호출할때, @Autowired된 mailSender를 매개변수로 넘겨줘도 된다.

 

메일 구성 메서드

setFrom : 송신

setRecipient : 수신, 참조

setSubject : 제목 

setText : 내용

 

예시 : Controller에서 사용

테스트를 위해 송신과 수신을 동일하게 내 메일로 했다.

 

결과

성공

728x90