본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

Spring에서 (전자정부) Mail 발송하기

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 5. 14.

 

 

smtp 서버가 따로 존재한다는 가정이 필요하다. smtp 서버는 여기서는 네이버 smtp를 사용하였다.

네이버에서 smtp를 활용하는 방법은 어렵지 않다. (구글이나 다음도 거의 비슷하다)

메일로 이동해서 맨 하단의 환경설정을 클릭한다.
POP3/IMPA을 클릭한다. 이후 사용함을 선택하여 준다.

 

위 세팅이 끝나면 맨 하단의 SMTP 정보를 기록하자.

 

스프링(전자정부)에서는 간단하게 구현하였다.

Bean 객체로 등록해서 사용하도록 하였다.

여기서는 maven을 활용한 라이브러리 추가를 하였다.

가장 먼저 pom.xml 을 열어 mail 라이브러리를 추가한다. 혹시 버전에러가 생기면 자신의 프로젝트 버전에 맞추어서 버전을 바꾸도록 한다.

		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>

 

기능구현은 어렵지 않다. 구글링을 해 보면 정말 잘 나와있다.

setter와 getter 메소드를 추가해서 bean 객체로 등록 할 준비를 한다.

package 패키지명;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class TestMailer {
	private static final int port= 465;  //어짜피 포트번호는 대부분 465를 사용한다. 아닐경우 변경하여주자.
	private String host;
	private String user;
	private String tail;
	private String password;
        //하단 setter, getter를 활용한 정보 주입
	public String getHost() {
		return host;
	}
	public void setHost(String host) {
		this.host = host;
	}
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public String getTail() {
		return tail;
	}
	public void setTail(String tail) {
		this.tail = tail;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	private Properties props = System.getProperties();
	private boolean setEnv(){
		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);  
		return true;
	}
	
    //파일 없이 전송
	public boolean sendMail(String receiver,String title, String text) throws Exception{
		setEnv();
		Message msg = sendingHead();
		sendingBody(msg, receiver, title, text);
		
		msg.setText(text);
        Transport.send(msg);	
		return true;
	}

	//파일과 함께 전송
	public boolean sendMail(String receiver,String title, String text, String filePath, String fileName) throws Exception{
		
		setEnv();
		Message msg = sendingHead();
		sendingBody(msg, receiver, title, text);
		
		if(filePath != null && filePath.length() > 0){  
	        Multipart multipart = new MimeMultipart();
	        MimeBodyPart textBodyPart = new MimeBodyPart();
	        textBodyPart.setText(text,"UTF-8");
	        MimeBodyPart attachmentBodyPart= new MimeBodyPart();
	        DataSource source = new FileDataSource(filePath); 
	        attachmentBodyPart.setDataHandler(new DataHandler(source));
	        attachmentBodyPart.setFileName(MimeUtility.encodeText(fileName, "UTF-8", null));
	        multipart.addBodyPart(textBodyPart);  // add the text part
	        multipart.addBodyPart(attachmentBodyPart); // add the attachement part
	        msg.setContent(multipart);			
		}	
		Transport.send(msg);	
        return true;
	}
	
	private Message sendingHead(){
		Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
			String un = user;
			String pw = password;
			protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
				return new javax.mail.PasswordAuthentication(un, pw);
			}
		});
		session.setDebug(true); //for debug  
		Message msg = new MimeMessage(session); //MimeMessage 생성 
		return msg;
	}

	private void sendingBody(Message msg, String receiver, String title, String text) throws Exception{
		msg.setFrom(new InternetAddress(user + tail)); //발신자 셋팅 , 보내는 사람의 이메일주소를 한번 더 입력합니다. 이때는 이메일 풀 주소를 다 작성해주세요.  
		msg.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver)); //수신자셋팅  
		msg.setSubject(title); //제목셋팅  
	}
}

 

람다식을 활용하면 더 깔끔해 질 것 같은데..개발환경이 1.7에 맞추어 진 점이 매우 아쉽다.

위와같이 클래스를 만들고 설정을 기록할 xml에 해당 객체를 추가하여 주자.

서블릿-context.xml도 되고 기타 원하는 xml에 등록해도 된다.

	<bean id='testMailer' class="패키지명.TestMailer">
		<property name="host" value="smtp.naver.com" />
		<property name="password" value="계정비밀번호" />
		<property name="tail" value='@naver.com'/>
		<property name="user" value='계정아이디'/>
	</bean> 	

 

컨트롤러 또는 서비스에서는 간단하게 사용 가능 하다.

아래는 컨트롤러 예제이다.

	@Autowired
	private TestMailer testMailer;  //사용

	@RequestMapping(value = "/sendmail.do")
	@ResponseBody
	public String sendmail(@RequestParam HashMap<Object, Object> param) {
		try {
			testMailer.sendMail("받는대상", "이것은 제목", "스프링으로 구현해서 보내본다.\n파일없이 보낸다.");
		} catch (Exception e) {
			e.printStackTrace();
			return "FAIL";			
		}
		
		try {
			testMailer.sendMail("받는대상", "이것은 제목", "스프링으로 구현해서 보내본다.","E:/파일위치","보낼파일명.확장자");
		} catch (Exception e) {
			e.printStackTrace();
			return "FAIL";			
		}		
		return "SUCC";
	}	

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글