백엔드 (Back-End)/자바 ( JAVA )

[JAVA] SMTP를 이용하여 메일 보내기

xxvigrufv 2022. 7. 1. 09:48
반응형

 
이번 주제는 Spring framework에서 메일서버(SMTP Server)를 이용하여 메일을 전송하는 방법에 대해서 기술한다.
 
SMTP => Simple Mail Transfer Protocol ( 간이 전자 우편 전송 프로토콜 ) 
기본적으로 사용하는 포트는 TCP 25번 이다. 상대 서버를 지시하기 위해서 DNS의 MX레코드가 사용된다.
SMTP Server란 이메일을 송신하는 서버이다. 
(메일서버는 SMTP Server와 POP3 Server가 있고 POP3 Server는 이메일을 수신하는 서버입니다.)
문자 표현에 8비트 이상의 코드를 사용하는 언어나 첨부파일과 자주 사용되는 각종 바이너리는 마임(MIME)이라고 불리는 방식으로 7비트로 변환되어 전달된다.
 



 메일 전송 기능을 구현하기 위해선 아래의 4가지 필요.

     1. pom.xml 설정
     2. mailSender Bean 등록(root-context.xml or servlet-context.xml)
     3. Controller 메서드 추가
     4. 메일 계정 보안 설정
 
 
pom.xml 설정
javax.mail 라이브러리를 추가 (220630 기준)

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>


java에서 메일을 보내기 위해 필요로한 라이브러리이다. 

 

주요 클래스로 Session, Message, Address, Authenticator, Tranport 등이 있다.
해당 라이브러리만으로도 메일 전송 기능이 구현 가능하다.


*** spring-context-support 라이브러리를 추가합니다.

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${org.springframework-version}</version>
</dependency>


spring-context-support 추가 이유 
- JavaMailSender 인터페이스(JavaMailSenderImpl)를 사용하기 위해 추가한다. 하나하나 세팅할 필요 없이 몇 가지의 설정만으로 사용될 수 있도록 해준다.
- JavaMailSender 인터페이스는 MIME 형식의 메일을 보낼 수 있다.(javax.mail.MimeMessage 클래스 사용 가능)
* SimpleMailMessage는 단순한 텍스트 메시지만 사용할 수 있고, MimeMessage는 텍스트와 더불어 이미지와 같은 첨부파일을 같이 메시지에 포함시킬 수 있다.
   
  MailSender Bean 등록
 Bean 등록은 root-context.xml에 설정한다. 
- root-context.xml에 아래의 코드를 추가해줍니다.

<!-- Naver Mail SMTP Config -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
 <property name="host" value="smtp.naver.com"/> <!-- 메이서버 호스트 -->
 <property name="port" value="465"/> <!-- 메이서버 포트번호 -->
 <property name="username" value="your_email"/> <!-- 자신의 이메일 아이디 -->
 <property name="password" value="your_password"/> <!-- 자신의 비밀번호 -->
<!-- 보안연결 SSL과 관련된 설정 -->
 <property name="javaMailProperties">
  <props>
  <prop key="mail.smtp.auth">true</prop>
  <prop key="mail.smtp.starttls.enable">true</prop>
  <prop key="mail.smtps.checkserveridentity">true</prop>
  <prop key="mail.smtps.ssl.trust">*</prop>
  <prop key="mail.debug">true</prop>
  <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
  </props>
 </property>
</bean>

- host : "smtp.naver.com" 입력
- port : "465" 입력
- username : 자신의 이메일 아이디 입력
- password : 자신의 이메일 비밀번호 입력
- javaMailProperties인 <property> 태그에 삽입된 코드는 SSL 인증 코드

================================

메일전송을 위해 필요로한 정보를 세팅하였던 "mailSegnder" Bean을 의존성 주입하여 사용한다. 
 

@Autowired
private JavaMailSender mailSender;



MimeMessage 객체를 직접 생성하여 메일을 발송하는 방법

import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;

@RequestMapping(value = "/sendMail", method = RequestMethod.GET)
public void sendMailTest2() throws Exception{

    String subject = "test 메일";
    String content = "메일 테스트 내용.";
    //String content = "메일 테스트 내용" + " <img src=\"이미지 경로\"> ";


    String from = "보내는이 아이디@도메인주소";
    String to = "받는이 아이디@도메인주소";


    final MimeMessagePreparator preparator = new MimeMessagePreparator() {

        public void prepare(MimeMessage mimeMessage) throws Exception{
            final MimeMessageHelper mailHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); // 멀티파트 메세지 허용

            mailHelper.setFrom(from);
            mailHelper.setTo(to);
            mailHelper.setSubject(subject);
            mailHelper.setText(content, true); //html 사용

   		 }

	};

    try {    
    mailSender.send(preparator);

    } catch(Exception e) {
    e.printStackTrace();
        }        

}



파일 업로드 기능 추가 

import org.springframework.core.io.FileSystemResource;
import java.io.File;


FileSystemResource file = new FileSystemResource(new File("경로\업로드할파일.형식")); 
helper.addAttachment("업로드파일.형식", file);




(참고)
https://ko.wikipedia.org/wiki/%EA%B0%84%EC%9D%B4_%EC%9A%B0%ED%8E%B8_%EC%A0%84%EC%86%A1_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

반응형