OAuth का उपयोग करके मेल सेवाओं तक पहुंच
Aspose.Email में OAuth 2.0 समर्थन जोड़ा गया है और इसे SMTP, POP3, IMAP और EWS सर्वरों तक पहुँचने के लिए उपयोग किया जा सकता है। सामान्यतः, सभी सर्वर जो OAuth 2.0 बेयरर टोकन को समर्थन देते हैं, को Aspose.Email के साथ उपयोग किया जा सकता है, लेकिन हमारे ईमेल क्लाइंट्स को Google मेल सर्वरों और Microsoft Office 365 सर्वरों के साथ परीक्षण किया गया है। सर्वर तक पहुँच … SmtpClient, Pop3Client, ImapClient और EWSClient OAuth के साथ दो तरीकों में लागू किया जा सकता है।
- एक्सेस टोकन को सीधे ईमेल क्लाइंट के कन्स्ट्रक्टर में प्रदान करें। इस मामले में, उपयोगकर्ता को समझना होगा कि एक्सेस टोकन का जीवनकाल सीमित है। जब टोकन समाप्त हो जाता है, तो ईमेल क्लाइंट सर्वर तक पहुँचने के लिए उपयोग नहीं किया जा सकता।
- टोकन प्रोवाइडर के आधार पर एक कस्टम कार्यान्वयन प्रदान करें ITokenProvider इंटरफ़ेस को ईमेल क्लाइंट के कन्स्ट्रक्टर में पास किया जाता है। इस मामले में, क्लाइंट टोकन की समाप्ति समय की जाँच करता है और अनुरोध करता है ITokenProvider जब पिछला एक्सेस टोकन समाप्त हो जाए तो नया एक्सेस टोकन प्राप्त करने के लिए। इस प्रकार, क्लाइंट टोकन को समय-समय पर रीफ़्रेश करता है और अनिश्चितकाल तक सर्वर के साथ काम कर सकता है। अक्सर सेवाएं एक्सेस टोकन को रीफ़्रेश करने का सरल तरीका समर्थन करती हैं। उदाहरण के लिए, गूगल सेवाओं में रीफ़्रेश टोकन का उपयोग या Microsoft पहचान प्लेटफ़ॉर्म में ROPC प्रमाणीकरण प्रवाह को टोकन प्रोवाइडर कार्यान्वयन के लिए उपयोग किया जा सकता है।
उपयुक्त सर्वर पर एक खाता कॉन्फ़िगर करें
निम्नलिखित लेख आपको मेल सेवाओं तक पहुँचने के लिए खातों को कॉन्फ़िगर करने में मदद करेंगे।
- के लिए Office 365
- के लिए Gmail
एक्सेस टोकन से मेल सेवाओं तक पहुँच
निम्नलिखित कोड उदाहरण दिखाते हैं कि एक्सेस टोकन का उपयोग करके मेल सेवाओं से कैसे कनेक्ट किया जाए।
// Connecting to SMTP server
try (SmtpClient client = new SmtpClient(
"smtp.gmail.com",
587,
"user1@gmail.com",
"accessToken",
true,
SecurityOptions.SSLExplicit)) {
}
// Connecting to IMAP server
try (ImapClient client = new ImapClient(
"imap.gmail.com",
993,
"user1@gmail.com",
"accessToken",
true,
SecurityOptions.SSLImplicit)) {
}
// Connecting to POP3 server
try (Pop3Client client = new Pop3Client(
"pop.gmail.com",
995,
"user1@gmail.com",
"accessToken",
true,
SecurityOptions.Auto)) {
}
टोकन प्रोवाइडर्स से मेल सेवाओं तक पहुँच
निम्नलिखित कोड उदाहरण दिखाते हैं कि टोकन प्रोवाइडर का उपयोग करके मेल सेवाओं से कैसे कनेक्ट किया जाए।
ITokenProvider tokenProvider = TokenProvider.Google.getInstance(
"ClientId",
"ClientSecret",
"RefreshToken");
// Connecting to SMTP server
try (SmtpClient client = new SmtpClient(
"smtp.gmail.com",
587,
"user1@gmail.com",
tokenProvider,
SecurityOptions.SSLExplicit)) {
}
// Connecting to IMAP server
try (ImapClient client = new ImapClient(
"imap.gmail.com",
993,
"user1@gmail.com",
tokenProvider,
SecurityOptions.SSLImplicit)) {
}
// Connecting to POP3 server
try (Pop3Client client = new Pop3Client(
"pop.gmail.com",
995,
"user1@gmail.com",
tokenProvider,
SecurityOptions.Auto)) {
}
Office 365 के लिए कस्टम ITokenProvider का कार्यान्वयन
आप नीचे दिए गए टोकन प्रोवाइडर कार्यान्वयन का उपयोग करके Office 365 मेल सेवाओं तक पहुँच सकते हैं।
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* Azure resource owner password credential (ROPC) token provider
* https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth-ropc
* https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth
* https://portal.azure.com
* https://developer.microsoft.com/en-us/graph/graph-explorer/#
* token parser https://jwt.io
* </p>
*/
class AzureROPCTokenProvider implements ITokenProvider {
private static final String GRANT_TYPE = "password";
private final String clientId;
private final String clientSecret;
private final String userName;
private final String password;
private final String tenant;
private final String scope;
private OAuthToken token;
public AzureROPCTokenProvider(String tenant, String clientId, String clientSecret,
String userName, String password, String[] scopeAr) {
this.tenant = tenant;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.userName = userName;
this.password = password;
this.scope = joinToStr(scopeAr, " ");
}
public synchronized OAuthToken getAccessToken(boolean ignoreExistingToken) {
if (this.token != null && !this.token.getExpired() && !ignoreExistingToken)
return this.token;
token = null;
Map<String, String> tokenArgs = geToken();
java.util.Calendar c = java.util.Calendar.getInstance();
c.add(java.util.Calendar.SECOND, Integer.parseInt(tokenArgs.get("expires_in")));
token = new OAuthToken(tokenArgs.get("access_token"), TokenType.AccessToken, c.getTime());
return token;
}
public final OAuthToken getAccessToken() {
return getAccessToken(false);
}
public void dispose() {
}
private String getEncodedParameters() {
return "client_id=" + urlEncode(clientId) + "&scope=" + urlEncode(scope) + "&username=" + urlEncode(userName)
+ "&password=" + urlEncode(password) + "&grant_type="
+ urlEncode(GRANT_TYPE);
}
private String getUri() {
if (tenant == null || tenant.trim().isEmpty())
return "https://login.microsoftonline.com/common/oauth2/v2.0/token";
else
return "https://login.microsoftonline.com/" + tenant + "/oauth2/v2.0/token";
}
private Map<String, String> geToken() {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(getUri()).openConnection();
connection.setRequestMethod("POST");
byte[] requestData = getEncodedParameters().getBytes(StandardCharsets.UTF_8);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" + requestData.length);
final OutputStream st = connection.getOutputStream();
try {
st.write(requestData, 0, requestData.length);
} finally {
st.flush();
st.close();
}
connection.connect();
if (connection.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) {
throw new IllegalAccessError("Operation failed: " + connection.getResponseCode() + "/" +
connection.getResponseMessage() + "\r\nDetails:\r\n{2}"
+ readInputStream(connection.getErrorStream()));
}
String responseText = readInputStream(connection.getInputStream());
Map<String, String> result = new HashMap<>();
String[] fromJsonToKeyValue = responseText.replace("{", "").replace("}", "")
.replace("\"", "").replace("\r", "")
.replace("\n", "").split(",");
for (String keyValue : fromJsonToKeyValue) {
String[] pair = keyValue.split(":");
String name = pair[0].trim().toLowerCase();
String value = urlDecode(pair[1].trim());
result.put(name, value);
}
return result;
} catch (IOException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String urlEncode(String value) {
try {
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String urlDecode(String value) {
try {
return URLDecoder.decode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String readInputStream(InputStream is) {
if (is == null)
return "";
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder result = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
result.append(line);
}
} catch (IOException e) {
// ignore
}
return result.toString();
}
static String joinToStr(String[] arr, String sep) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i > 0)
sb.append(sep);
sb.append(arr[i]);
}
return sb.toString();
}
}
अगले कोड उदाहरण दिखाते हैं कि कस्टम टोकन प्रोवाइडर का उपयोग करके Office 365 सेवाओं से कैसे कनेक्ट करें।
ITokenProvider tokenProvider = new AzureROPCTokenProvider(
"Tenant",
"ClientId",
"ClientSecret",
"EMail",
"Password",
scopes);
// Connecting to SMTP server
try (SmtpClient client = new SmtpClient(
"smtp.office365.com",
587,
"Test1@test.onmicrosoft.com",
tokenProvider,
SecurityOptions.SSLExplicit)) {
}
// Connecting to IMAP server
try (ImapClient client = new ImapClient(
"outlook.office365.com",
993,
"Test1@test.onmicrosoft.com",
tokenProvider,
SecurityOptions.SSLImplicit)) {
}
// Connecting to POP3 server
try (Pop3Client client = new Pop3Client(
"outlook.office365.com",
995,
"Test1@test.onmicrosoft.com",
tokenProvider,
SecurityOptions.Auto)) {
}
// Connecting to EWS server
final String mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
ICredentials credentials = new OAuthNetworkCredential(tokenProvider);
try (IEWSClient ewsClient = EWSClient.getEWSClient(mailboxUri, credentials)) {
}