본문 바로가기
JAVA

JavaMail API

by oncerun 2021. 10. 24.
반응형

오랜만에 자바 포스팅이다.  빌어먹을 성격 때문에 개발할 때 사용하는 API 세부를 알지 못하고 구현하면 정신병 걸릴 것 같아서, 주말에 Mail 관련 API를 좀 살펴보기로 했다. 

사실 SMTP 서버까지는 고객사에 구축되어 있는 상태고 그냥 정보만 받아와서 메일 쏴주면되는데, 궁금하니까 못 참치

 

 

JavaMail API

 

JavaMail API는 메일 및 메시징 응용프로그램을 빌드하기 위해 플랫폼과 프로토콜에 독립적인 프레임워크를 제공합니다.

메일 시스템을 구성하는 객체를 정의하는 추상 클래스 세트를 제공합니다. 전자 메시지를 읽고, 작성하고, 보내기 위한 옵션 패키지입니다.

 

이 API는 시스템 구성 요소 및 인터페이스를 포함하여 메시징 시스템에 대한 인터페이스를 구성하는 데 사용되는 요소를 제공합니다.  

 

JavaMail API에서 지원되는 일부 프로토콜입니다.

SMTP (전송), POP(수신), IMAP(수신을 위한 고급 프로토콜), MIME( 메시지 형식으로, 전송되는 내용을 정의)

 

다음은 JavaMail의 아키텍처입니다.

 

자바 애플리케이션에서 MailAPI를 통해 각 프로토콜을 구현한 서버에 요청을 통해 처리되는 아키텍처 같습니다.

 

이러한 추상 메커니즘은 JDBC, JNDI 및 JMS와 같은 다른 J2EE API와 유사합니다. 

JavaMail API는 두 가지 주요 부분으로 나눠지는데, 

 

  • 응용 프로그램에 독립적인 부분: 응용 프로그램 요소에서 API를 사용하여 사용되는 기본 공급자 또는 프로토콜에 관계없이 메일 메시지를 보내고 받습니다. 실제 어떻게 데이터를 포맷하고, 서버에 전송되는 부분을 감추고
  • 서비스 종속 부분:  SPI는 SMTP, POP, IMAP 및 NNTP와 같은 프로토콜별 언어를 사용합니다. J2EE 플랫폼에 전자 메일 서비스 공급자를 연결하는 데 사용됩니다. 이때 공급자는 이러한 요청을 처리할 수 있는 서버를 뜻합니다.

 

* 서비스 제공자 인터페이스 ( SPI )는 제3자가 구현하거나 확장하기 위한 API 입니다. 프레임워크 확장 및 교체 가능한 구성 요소를 활성화하는 데 사용할 수 있습니다. 

 

 

 

JavaMail API 환경설정

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.6.2</version>
        </dependency>

 

JAVA 응용 프로그램을 사용하여 전자 메일을 보내는 것을 위해  JavaMail API와 JAF가 필요한데, JAF는 Java SE 6 이상을 사용한다면, 내부에 포함되어 있기 때문에 별도로 설치할 필요가 없습니다.

별도의 jar파일을 classpath에 추가하는 것 말고 저는 메이븐을 사용하여 종속성을 추가했습니다.

 

 

 

SMTP 서버

이메일을 보내려면 메일을 보내는 역할을 하는 SMTP 서버가 있어야 합니다. 

gmail. yahoo 등과 같은 회사에서 제공하는데 저는 naver를 사용하겠습니다.

naver의 SMTP 주소는 다음과 같습니다. smtp.naver.com

다만 하루에 몇 통 이상은 보내지 못한다는 제약조건이 있을 것으로 예상합니다.

 

 

 

JavaMail API 핵심 클래스

 

javaMail API는 전자 메일 메시지를 보내고 읽고 삭제하는 데 사용되는 일부 인터페이스와 클래스로 구성됩니다.

많은 패키지 중 자주 사용되는 두 가지 주요 패키지인 javax.mail 및  javax.mail.internet 패키지를 살펴봅니다. 이 패키지에는 모든 javaMail 핵심 클래스가 포함되어 있습니다.

 

 

javax.mail.Session API의 키 클래스입니다. 다중 스레드 개체는 연결 팩토리를 나타냅니다.
세션 객체의 생성자는 private 입니다. 따라서 별도의 Session 객체를 가져오는 메서드를 제공합니다.
javax.mail.Message 전자 메일 메시지를 모델링하는 추상 클래스입니다. 서브클래스는 실제 구현을 제공합니다. 추상 클래스이기 때문에 하위 클래스인 javax.mail.internet.MimeMessage 클래스가 주로 사용됩니다.  이러한 메시지 객체안에 , 메시지 정보를 저장할 수 있는 메소드를 제공합니다.  from 헤더필드, 지정된 주소 추가,  title 헤더 필드, MIME 유형을 사용한 메시지 콘텐츠로 설정된 내용 등을 셋팅합니다.
javax.mail.Address 메시지의 주소(from 및 to 주소)를 모델링하는 추상 클래스입니다. 서브클래스는 특정 구현을 제공합니다.
하위 클래스인 javax.mail.internet.InternetAddress 클래스가 주로 사용됩니다.
  • 다음과 같이 To, From, CC, BCC 필드를 설정할 수도 있습니다.
    • message.setFrom(주소)
    • message.addRecipient(유형, 주소)
    • 미리 정의된 세 가지 주소 유형은 다음 값 중 하나를 가진 개체입니다.
      • 메시지.수신자 유형.TO
      • 메시지.수신자 유형.CC : 참조
      • 메시지.수신자 유형.BCC : 메시지 복사하여 전달, 보낸이들의 참조리스트가 나타나지 않음
javax.mail.Authenticator 메일 서버의 메일 리소스를 보호하는 데 사용되는 추상 클래스입니다.
 사용자 이름과 암호를 생성자에 전달 하는 하위 클래스 PasswordAuthentication을 만듭니다 . 세션 객체를 생성할 때 세션에 인증자를 등록해야 합니다.
javax.mail.Transport 전자 메일 메시지를 보내기 위한 메시지 전송 메커니즘을 모델링하는 추상 클래스입니다.
이 클래스는 일반적으로 SMTP 프로토콜을 사용하여 메시지를 보냅니다. 추상클래스이지만 send()라는 정적 메서드를 호출하여 기본 버전으로 보낼 수 있으며, 
혹은 프로토콜에 대한 세션에서 특정 인스턴스를 가져와서 사용자 이름과 암호(공백가능)를 전달하고 메시지를 보내고 연결을 닫는 것이다.
javax.mail.Store 메시지 저장 및 검색을 위한 메시지 저장소 및 해당 액세스 프로토콜을 모델링하는 추상 클래스입니다. 스토어는 폴더로 나뉩니다.
javax.mail.Folder 메일 메시지 폴더를 나타내는 추상 클래스입니다. 하위 폴더를 포함할 수 있습니다.
javax.mail.internet.MimeMessage 메시지는 추상 클래스이므로 하위 클래스와 함께 작동해야 합니다. 대부분의 경우 MimeMessage를 사용합니다. MimeMessage는 MIME 유형과 헤더를 이해하는 전자 메일 메시지입니다.
javax.mail.internet.InternetAddress 이 클래스는 RFC822 구문을 사용하는 인터넷 이메일 주소를 나타냅니다. 일반적인 주소 구문은 user@host.domain 또는 Personal Name <user@host.domain> 형식 입니다.

 

간단한 프로그램을 작성하기 전에 모든 기본 단계는 동일합니다.

 

1. 세션 객체를 가져온다.

2. 메시지를 작성한다.

3. 메시지를 보낸다. 

 

 

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class main {


    public static void main(String[] args) {
        String username ="naverId";  //naver 아이디가 필요하다. 
        String password = "password";
        String from = "naverId@naver.com";
        String to = "실제로 보낼 메일 주소";
        String host = "smtp.naver.com";
        int port = 465;
        Properties prop = new Properties();
        prop.put("mail.smtp.host", host);
        prop.put("mail.smtp.port", port);
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.trust", "smtp.naver.com");

        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));

            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject("Test Subject");
            message.setText("이메일 테스트");

            Transport.send(message);

            System.out.println("Sent Message successfully");
        }catch (MessagingException e){
            throw new RuntimeException(e);
        }
    }
}

 

SMTP 서버를 이용하기 위한 네이버 측에서 제공하는 정보는 네이버 메일 SMTP 설정창 하단에 나와있으니, 포트번호가 변경되면 그에 따른 포트번호와 조건을 맞춰서 보내야 한다.

 

첨부파일을 보낼 경우 다음과 같이 진행한다.

         BodyPart messageBodyPart = new MimeBodyPart();

         
         messageBodyPart.setText("This is message body");

         // Create a multipar message
         Multipart multipart = new MimeMultipart();

         // Set text message part
         multipart.addBodyPart(messageBodyPart);

         // Part two is attachment
         messageBodyPart = new MimeBodyPart();
         String filename = "/home/manisha/file.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);
         
         message.setContent(multipart);

 

멀티 파트 객체를 만들어서, 그 안에 part를 지속적으로 붙여서 보낸다.

 

 

SMTP 서버를 통해 MAIL 전송까지이기 때문에 여기서 글을 마치지만 만약 메일을 가져오거나, 확인해야할 경우는

POP 서버와 통신을 하기위한 별도의 처리가 필요하다. 

반응형

'JAVA' 카테고리의 다른 글

Server Networking Proxy  (0) 2021.11.14
메일 발송  (0) 2021.11.06
[JAVA] CLASS 클래스  (0) 2020.04.23
JAVA 연산자 -3  (0) 2020.02.20
JAVA 연산자 -2  (0) 2020.02.20

댓글