- 1. EAS (Exchange ActiveSync)
- 2. EWS (Exchange Web Services)
- I. 프로젝트의 Maven 디펜던시에 EWS 모듈 추가
- II. 프로젝트에 컨트롤러 클래스 생성
- III. 컨트롤러 클래스에 EWS 연계 코드 추가
- IV. 프로젝트를 빌드하고 실행
- V. 프로젝트를 웹브라우져에서 접속해서 확인
스프링 부트 기반으로 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
2. IntelliJ 에서 JAR 파일 빌드하고 실행
- IntelliJ에서 생성된 프로젝트를 연다.
- 메뉴 “Build” -> “Build Project” 를 클릭하여 프로젝트를 빌드한다.
-
메뉴 “Run” -> “Run 프로젝트명” 를 클릭하여 프로젝트를 실행한다.
V. 프로젝트를 웹브라우져에서 접속해서 확인
-
프로젝트를 빌드하고 실행한 뒤, 웹브라우져로 아래 주소를 접속한다.
http://localhost:8080//ews/user/inbox -
아래 화면과 같이 웹브라우져에 사용자의 받은편지함 제목들이 표시된다.
본 예제 결과물 sbtest02.zip 소스파일은 아래 링크에서 다운받을 수 있다.
sbtest02.zip 소스파일