스프링 부트 기반으로 Exchange 서버를 연계하는 간단한 예제 프로그램을 만들어본다. Exchange 서버에 EWS 로 접속하여 사용자의 메일 받은편지함(Inbox)를 읽어보도록 한다.

자바 어플리케이션이 Exchange 서버에 연계하는 방법은 EAS 와 EWS 2가지 방법이 있다.

1. EAS (Exchange ActiveSync)

  • EAS는 모바일 디바이스와 같은 클라이언트 어플리케이션으로부터 접속을 하기 위해 만들어진 기술이다.
  • 서버 to 서버는 지원하지 않는다.
  • 모바일 기기의 개인정보관리자(PIM - Personal Information Manager)와 싱크를 맞추는것이 지원된다.
  • 검색 기능에서 제한이 있다. 검색 최대 200개 결과만 가져올 수 있다.

2. EWS (Exchange Web Services)

  • EWA는 클라이언트 to 서버, 서버 to 서버 둘 다 지원을 한다.
  • EWS에 비해 상대적으로 더 많은 기능들이 지원되고 더 많은 자원에 접근가능하다.
  • 검색 기능에 허용가능한 제한이 없다.

보다 자세한 차이점은 아래 링크에서 참고할 수 있다.
Choosing between Exchange ActiveSync and EWS


이 글에서는 이전 글 스프링 부트 (Spring boot) 소개 에 이어서 진행하도록 한다.
만약 이전 과정을 진행하지 않았다면 sbtest01.zip 소스파일을 아래 링크에서 다운받을 수 있다.
sbtest01.zip 소스파일


I. 프로젝트의 Maven 디펜던시에 EWS 모듈 추가

  • 프로젝트 루트에 있는 Maven 디펜던시 파일 (pom.xml)을 열고 아래 디펜던시를 추가한다.
      <dependency>
          <groupId>com.microsoft.ews-java-api</groupId>
          <artifactId>ews-java-api</artifactId>
          <version>2.0</version>
      </dependency>
    
  • 통합개발환경에서는 자동으로 Maven 임포트가 실행되겠지만, 일반편집기를 사용중이라면 터미널에서 아래 명령으로 수동으로 임포트해주도록 한다.
      $ mvn install
    

II. 프로젝트에 컨트롤러 클래스 생성

1. 새 컨트롤러 클래스 생성

  • 프로젝트 내의 /src/main 폴더 아래에 컨트롤러 패키지(디렉토리)를 만들고 새 컨트롤러 클리스를 생성한다.

    새 컨트롤러 클래스 생성

  • 생성된 컨트롤러 클래스에 아래 소스코드와 같이 “/ews/user/inbox” 요청핸들러를 만든다.
      package com.joongang.sbtest01.controller;
        
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
        
      @RestController
      public class EwsController {
        
          @GetMapping("/ews/user/inbox")
          public String ewsUser() {
              return "";
          }
      }
    
  • 프로젝트를 실행한 뒤, 웹브라우져로 아래 링크로 접속하면 빈화면이 표시된다.
    http://localhost:8080/ews/user/inbox

2. 컨트롤러 클래스에 StringBuilder 추가

  • 실재 구현 코드를 작성하기 전에 StringBuilder를 준비하여 응답본문을 보낼 준비를 한다.
      package com.joongang.sbtest01.controller;
        
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
        
      @RestController
      public class EwsController {
        
          @GetMapping("/ews/user/inbox")
          public String ewsUser() {
              StringBuilder resBody = new StringBuilder();
              resBody.append("[EWS-Inbox]<br/>");
                
              // TODO Exchange에 접속한다.
                
              return resBody.toString();
          }
      }
    

III. 컨트롤러 클래스에 EWS 연계 코드 추가

1. Exchange에 연결하고 사용자 자격증명 받기

  • 이제부터 앞에서 구현한 코드의 //TODO 아래에 자세한 코드를 추가하기로 한다.

  • 사용자 이메일주소와 암호를 문자열 변수로 추가한다.
    (실제 구현상에서는 안전한 저장소에서 읽어오겠지만, 이 글에서는 예제 목적으로 작성하는것이므로 하드코딩 하기로 한다.)
      String useremail = "yourname@yourdomain.com";  // 여기에 실제 사용자 이메일주소를 넣는다.
      String password = "*****";  // 여기에 실제 사용자 암호를 넣는다.
    
  • ExchangeService 객체를 생성한다.
      ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
    
  • Exchange 서버에 사용자의 자격증명을 해주는 ExchangeCredentials 객체를 생성하고 앞에서 만든 ExchangeService 객체에 연결한다.
      ExchangeCredentials credentials = new WebCredentials(useremail, password);
      service.setCredentials(credentials);
    
  • Exchange 서버의 서비스 엔드포인트를 찾기 위해 autodiscoverUrl() 메소드를 호출한다.
    autodiscoverUrl() 은 사용자의 이메일 주소를 바탕으로 Exchange 서버의 엔드포인드를 찾아서 연결해준다.
      service.autodiscoverUrl(useremail);
    
  • autodiscoverUrl() 은 예외처리가 필요하니 간단한 try ~ catch 문으로 감싸준다.
      // TODO Exchange에 접속한다.
                
      String useremail = "yourname@yourdomain.com";  // 여기에 실제 사용자 이메일주소를 넣는다.
      String password = "*****";  // 여기에 실제 사용자 암호를 넣는다.
      try {
          ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
          ExchangeCredentials credentials = new WebCredentials(useremail, password);
          service.setCredentials(credentials);
          service.autodiscoverUrl(useremail);
            
          // TODO 받은편지함을 읽는다
            
      } catch (Exception e) {
          e.printStackTrace();
      }
    

2. Exchange에서 사용자의 받은편지함 읽기

  • 받은편지함(Inbox) 폴더 객체를 얻는다.
      Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
    
  • ItemView 객체를 생성하고, 받은편지함에서 목록을 읽어온다.
    여기서는 한번에 10개씩 읽도록 하였다.
      ItemView view = new ItemView(10);
      FindItemsResults<Item> findResults = service.findItems(inbox.getId(), view);
    
  • 앞에서 얻어온 결과에서 루프를 돌면서 메일 제목을 resBody 객체에 추가한다.
      for (Item item : findResults.getItems()) {
          resBody.append(item.getSubject());
          resBody.append("<br/>");
      }
    

3. 완성된 컨트롤러 클래스

  • 완성된 컨트롤러 클래스는 아래와 같다.
      package com.joongang.sbtest02.controller;
        
      import microsoft.exchange.webservices.data.core.ExchangeService;
      import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
      import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
      import microsoft.exchange.webservices.data.core.service.folder.Folder;
      import microsoft.exchange.webservices.data.core.service.item.Item;
      import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
      import microsoft.exchange.webservices.data.credential.WebCredentials;
      import microsoft.exchange.webservices.data.search.FindItemsResults;
      import microsoft.exchange.webservices.data.search.ItemView;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
        
      @RestController
      public class EwsController {
        
          @GetMapping("/ews/user/inbox")
          public String ewsUser() {
              StringBuilder resBody = new StringBuilder();
              resBody.append("[EWS-Inbox]<br/>");
        
              // TODO Exchange에 접속한다.
                
              String useremail = "yourname@yourdomain.com";  // 여기에 실제 사용자 이메일주소를 넣는다.
              String password = "*****"; // 여기에 실제 사용자 암호를 넣는다.
              try {
                  ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
                  ExchangeCredentials credentials = new WebCredentials(useremail, password);
                  service.setCredentials(credentials);
                  service.autodiscoverUrl(useremail);
                    
                  // TODO 받은편지함을 읽는다
        
                  Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
                  ItemView view = new ItemView(10);
                  FindItemsResults<Item> findResults = service.findItems(inbox.getId(), view);
                  for (Item item : findResults.getItems()) {
                      resBody.append(item.getSubject());
                      resBody.append("<br/>");
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
        
              return resBody.toString();
          }
      }
    

IV. 프로젝트를 빌드하고 실행

1. 터미널(컴맨드) 쉘에서 JAR 파일 빌드하고 실행

  • 위의 프로젝트 파일이 생성된 폴더로 이동한다.
      $ cd ~/Projects/sbtest01
    
  • 아래 명령을 입력하여 JAR 파일을 빌드한다.
      $ mvn install
    
  • 아래 명령을 입력하여 JAR 파일을 실행한다.
      $ java -jar target/sbtest01-0.0.1-SNAPSHOT.jar
    

    터미널(컴맨드) 쉘에서 JAR 파일 빌드하고 실행

2. IntelliJ 에서 JAR 파일 빌드하고 실행

  • IntelliJ에서 생성된 프로젝트를 연다.
  • 메뉴 “Build” -> “Build Project” 를 클릭하여 프로젝트를 빌드한다.
  • 메뉴 “Run” -> “Run 프로젝트명” 를 클릭하여 프로젝트를 실행한다.

    IntelliJ 에서 JAR 파일 빌드하고 실행


V. 프로젝트를 웹브라우져에서 접속해서 확인

  • 프로젝트를 빌드하고 실행한 뒤, 웹브라우져로 아래 주소를 접속한다.
    http://localhost:8080//ews/user/inbox

  • 아래 화면과 같이 웹브라우져에 사용자의 받은편지함 제목들이 표시된다.

    웹브라우져에 사용자의 받은편지함 제목 표시


본 예제 결과물 sbtest02.zip 소스파일은 아래 링크에서 다운받을 수 있다.
sbtest02.zip 소스파일


Spring SpringBoot Back-end Exchange REST

Blog Logo

HeeHun Kang


Published