TLS 1.2 및 AutodiscoverService 지원
Contents
[
Hide
]
Aspose.Email for Java는 이제 SAAJ API를 사용하여 TLS 1.2를 지원합니다. EWSClient 정적 속성을 제공합니다 useSAAJAPI TLS 1.2 사용을 위해 true로 설정할 수 있습니다. Aspose.Email for Java는 또한 지원합니다 AutodiscoverService TLS 1.2용. 다음 코드 샘플은 SAAJ API 및 AutodiscoverService TLS 1.2용.
SAAJ API 사용
SAAJAPI 모드와 함께 사용되는 Java EE SOAP 클라이언트 - https://docs.oracle.com/cd/E19651-01/817-2151-10/wsgjaxm.html.
다음 코드 샘플은 SAAJ API를 설정하여 사용하는 방법을 보여줍니다. EWSClient.useSAAJAPI 속성을 true로 설정합니다.
다음 코드 스니펫에서 Basic 인증 헤더가 할당됩니다:
EWSClient.useSAAJAPI(true);
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testuser", "pw", "domain");
client.listMessages();
다음 코드 스니펫에서 OAUTH2 인증 헤더가 할당됩니다:
EWSClient.useSAAJAPI(true);
// token provider
/*ITokenProvider provider = new ITokenProvider() {
@Override
public void dispose() {
}
@Override
public OAuthToken getAccessToken(boolean ignoreExistingToken) {
return null;
}
@Override
public OAuthToken getAccessToken() {
return null;
}
};
NetworkCredential credentials = new OAuthNetworkCredential(provider);*/
// accessToken
NetworkCredential credentials = new OAuthNetworkCredential("accessToken");
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", credentials);
client.listMessages();
주의: 이 모드에서는 API가 NTLM 인증 프로세스를 제어하지 않습니다. NTLM 인증을 위해 Java Authenticator가 필요합니다.
Java 8용 NTLM 인증 코드 스니펫:
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
static Authenticator getAuthenticator(String user, String pw, String domain) {
final String username = domain + "\\" + user;
final String password = pw;
System.out.println("New Credentials " + username);
return new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Authenticate " + username);
return new PasswordAuthentication(username, password.toCharArray());
}
};
}
EWSClient.useSAAJAPI(true);
System.setProperty("http.auth.preference", "NTLM");
Authenticator.setDefault(getAuthenticator("user", "pw", ""));
IEWSClient client = EWSClient.getEWSClient(new URL("https://domain.com/ews/Exchange.asmx"));
static Authenticator getAuthenticator() {
// This block is written for suppressing a bug in sun implementation.
// In Sun Impl client doesn't authenticate user for each connection,
// uses cached credentials instead.
sun.net.www.protocol.http.AuthCacheValue.setAuthCache(new sun.net.www.protocol.http.AuthCache() {
public void remove(String pkey, sun.net.www.protocol.http.AuthCacheValue entry) {
}
public void put(String pkey, sun.net.www.protocol.http.AuthCacheValue value) {
}
public sun.net.www.protocol.http.AuthCacheValue get(String pkey, String skey) {
return null;
}
});
return new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return getEmbeddedCredentials(getRequestingURL());
}
PasswordAuthentication getEmbeddedCredentials(URL url) {
if (url == null) {
return null;
}
String userInfo = url.getUserInfo();
int colon = userInfo == null ? -1 : userInfo.indexOf(":");
if (colon == -1) {
return null;
} else {
String userName = userInfo.substring(0, colon);
String pass;
try {
pass = URLDecoder.decode(userInfo.substring(colon + 1), "UTF-8");
} catch (UnsupportedEncodingException e) {
pass = "";
}
System.out.println("Authenticate " + userInfo);
return new PasswordAuthentication("\\" + userName, pass.toCharArray());
}
}
};
}
static URL getURL(String url, String user, String pw, String domain) throws Exception {
String host = new URL(url).getHost();
URL endpoint = new URL(url.replace(host, user + ":" + URLEncoder.encode(pw, "UTF-8") + "@" + host));
return endpoint;
}
EWSClient.useSAAJAPI(true);
Authenticator.setDefault(getAuthenticator());
System.setProperty("http.auth.preference", "NTLM");
IEWSClient client1 = EWSClient.getEWSClient(getURL("https://domain.com/ews/Exchange.asmx", "user1", "pw", "domain"));
IEWSClient client2 = EWSClient.getEWSClient(getURL("https://domain.com/ews/Exchange.asmx", "user2", "pw", "domain"));
Java 9부터 Authenticator를 연결에 설정할 수 있습니다:
static Map<String, Authenticator> authInfo = new HashMap<String, Authenticator>();
static URL getURL(String url, final String user, final String pw, final String domain) throws MalformedURLException {
URL endpoint = new URL(new URL(url), "", new URLStreamHandler() {
protected URLConnection openConnection(URL url) throws IOException {
URL target = new URL(url.toString());
HttpURLConnection connection = (HttpURLConnection) target.openConnection();
// Cache for User@Url
Authenticator auth = authInfo.get(user + "@" + url);
if (auth == null) {
auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
System.out.println("Authenticate " + user);
return new PasswordAuthentication(domain + "\\" + user, pw.toCharArray());
}
};
authInfo.put(user + "@" + url, auth);
}
connection.setAuthenticator(auth);
return connection;
}
});
return endpoint;
}
EWSClient.useSAAJAPI(true);
System.setProperty("http.auth.preference", "NTLM");
IEWSClient client1 = EWSClient.getEWSClient(getURL("https://domain.com/ews/Exchange.asmx", "user1", "pw", "domain"));
IEWSClient client2 = EWSClient.getEWSClient(getURL("https://domain.com/ews/Exchange.asmx", "user2", "pw", "domain"));
참고: JAXB API는 Java EE API로 간주되며, 따라서 Java SE 9에서는 기본 클래스 경로에 포함되지 않습니다.
Maven JAXB 의존성:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
</dependency>
AutodiscoverService 사용
다음 코드 샘플은 사용 방법을 보여줍니다. AutodiscoverService TLS 1.2용
AutodiscoverService service = new AutodiscoverService();
service.setCredentials(new NetworkCredential("user", "password"));
GetUserSettingsResponse response = service.getUserSettings("userSmtpAddress", UserSettingName.ExternalEwsUrl, UserSettingName.UserDisplayName);