ویژگیهای ابزارک Gmail
کار با پرس و جوی FreeBusy
Aspose.Email مکانیزمی برای پرس و جو فراهم میکند تا بررسی کند آیا یک قرار ملاقات مطابق معیارها موعد دارد یا خیر. FreebusyQuery کلاسی برای این منظور ارائه شده است که امکان تهیهٔ پرس و جو برای یک تقویم خاص را فراهم میکند.
پرس و جوی تقویم
این نمونه کد قابلیت پرس و جوی یک تقویم را نشان میدهد. کارهای زیر در این نمونه انجام میشود:
- ایجاد و درج یک تقویم
- ایجاد یک قرار ملاقات
- درج قرار ملاقات
- آمادهسازی یک FreebusyQuery
- دریافت FreebusyResponse
// Use the OAuthUser and GoogleOAuthHelper classes below to receive an access token
IGmailClient client = GmailClient.getInstance(accessToken, "user@domain.com");
try {
Calendar newCalendar = new Calendar("summary", null, null, "Europe/Kiev");
// Insert calendar and get back id of newly inserted calendar and Fetch the same calendar using calendar id
String id = client.createCalendar(newCalendar);
Calendar fetchedCalendar = client.fetchCalendar(id);
String calendarId = fetchedCalendar.getId();
try {
// Get list of appointments in newly inserted calendar. It should be zero
Appointment[] appointments = client.listAppointments(calendarId);
// Create a new appointment and Calculate appointment start and finish time
java.util.Calendar c = java.util.Calendar.getInstance();
Date startDate = c.getTime();
c.add(java.util.Calendar.HOUR_OF_DAY, 1);
Date endDate = c.getTime();
// Create attendees list for appointment
MailAddressCollection attendees = new MailAddressCollection();
attendees.add("user1@domain.com");
attendees.add("user2@domain.com");
// Create appointment
Appointment app1 = new Appointment("Location", startDate, endDate, MailAddress.to_MailAddress("user2@domain.com"), attendees);
app1.setSummary("Summary");
app1.setDescription("Description");
app1.setStartTimeZone("Europe/Kiev");
app1.setEndTimeZone("Europe/Kiev");
// Insert the newly created appointment and get back the same in case of successful insertion
Appointment newAppointment = client.createAppointment(calendarId, app1);
// Create Freebusy query by setting min/max timeand time zone
FreebusyQuery query = new FreebusyQuery();
c = java.util.Calendar.getInstance();
c.add(java.util.Calendar.DATE, -1);
query.setTimeMin(c.getTime());
c.add(java.util.Calendar.DATE, 2);
query.setTimeMax(c.getTime());
query.setTimeZone("Europe/Kiev");
// Set calendar item to search and Get the reponse of query containing
query.getItems().add(calendarId);
FreebusyResponse resp = client.getFreebusyInfo(query);
client.deleteAppointment(calendarId, newAppointment.getUniqueId());
} finally {
client.deleteCalendar(calendarId);
}
} finally {
client.dispose();
}
ایجاد پروژه در Google Developer Console
یک پروژه در Google Developer Console باید برای کاربری که حساب Gmail دارد ایجاد شود. در صفحه API & auth → Credentials پروژهٔ گوگل، اطلاعاتی مانند شناسهٔ مشتری (Client ID) و راز مشتری (Client Secret) باید ثبت شود. این اطلاعات به همراه نام کاربری و رمز عبور حساب Gmail برای اجرای کدها در این بخش مورد نیاز است، مثلاً تقویم گوگل، لیستهای کنترل دسترسی، ملاقاتها، مخاطبان، تنظیمات و غیره.
مراحل ایجاد پروژه در Google Developer Console
در زیر یک آموزش گام به گام برای ایجاد پروژه در Google Developer Console ارائه شده است.
-
به لینک https://console.cloud.google.com بروید و با اطلاعات کاربری جیمیل خود وارد شوید
-
کادر «من شرایط خدمات تمام محصولات Google Cloud Platform را خواندهام و با آن موافقم» را انتخاب کنید و دکمهٔ پروژه جدید را فشار دهید

- ایجاد و انتخاب پروژهٔ جدید

- Library را انتخاب کنید و APIهای Contact و Calendar را فعال کنید

- صفحهٔ رضایت OAuth را باز کنید

- کادر چک External را انتخاب کنید و دکمهٔ ایجاد را فشار دهید

- ثبتنام برنامه را ویرایش کنید و دکمهٔ ذخیره و ادامه را فشار دهید

- مجوزها را اضافه کنید و دکمهٔ بروزرسانی را فشار دهید

- ایجاد اعتبارنامههای OAuth

- شناسهٔ مشتری (Client ID) و راز مشتری (Client Secret) که در کدهای نمونهٔ این بخش استفاده خواهند شد، اینجا قرار میگیرند.

کلاسهای کمکی
کلاسهای کمکی زیر برای اجرای مثالهای کد در این بخش مورد نیاز هستند. این کلاسها GoogleOAuthHelper و OAuthUser فقط برای سادهسازی نمایش هستند. متدهای این کلاسها از ساختار غیرعمومی صفحات وب استفاده میکنند که ممکن است در هر زمان تغییر کند.
کلاس GoogleOAuthHelper
قطعه کد زیر نشان میدهد چگونه پیادهسازی کنید GoogleOAuthHelper کلاس.
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.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.xml.bind.DatatypeConverter;
/**
* <p>
* Developers console https://console.developers.google.com/projectselector/apis/credentials?pli=1
* Documentation https://developers.google.com/identity/protocols/OAuth2InstalledApp
* </p>
*/
class GoogleOAuthHelper {
public static final String AUTHORIZATION_URL = "https://accounts.google.com/o/oauth2/v2/auth";
public static final String TOKEN_REQUEST_URL = "https://oauth2.googleapis.com/token";
public static final String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
public static final String REDIRECT_TYPE = "code";
public static final String SCOPE = "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" // Calendar
+ "+https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds%2F" // Contacts
+ "+https%3A%2F%2Fmail.google.com%2F"; // IMAP & SMTP
static class OAuthUser {
String email;
String clientId;
String clientSecret;
String refreshToken;
}
static String createCodeChalange() {
String verifierStr = UUID.randomUUID().toString() + "-" + UUID.randomUUID().toString();
System.out.println("Code Verifier: " + verifierStr);
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
throw new IllegalAccessError(e.getMessage());
}
byte[] hash = digest.digest(verifierStr.getBytes(StandardCharsets.UTF_8));
String base64Hash = DatatypeConverter.printBase64Binary(hash);
base64Hash = base64Hash.split("=")[0];
base64Hash = base64Hash.replace('+', '-').replace('/', '_');
return base64Hash;
}
static String getAuthorizationCodeUrl(OAuthUser acc) {
return getAuthorizationCodeUrl(acc, SCOPE, REDIRECT_URI, REDIRECT_TYPE);
}
static String getAuthorizationCodeUrl(OAuthUser acc, String scope, String redirectUri, String responseType) {
System.out.println("---------------------------------------------------------");
System.out.println("------------- OAuth 2.0 AuthorizationCodeUrl -------------");
System.out.println("---------------------------------------------------------");
System.out.println("Login: " + acc.email);
String codeChallenge = createCodeChalange();
String state = urlEncode(UUID.randomUUID().toString());
String approveUrl = AUTHORIZATION_URL + "?client_id=" + acc.clientId + "&redirect_uri=" + redirectUri + "&response_type=" + responseType + "&scope=" + scope
+ "&code_challenge=" + codeChallenge + "&code_challenge_method=S256&state=" + state;
System.out.println("Approve Url: " + approveUrl);
return approveUrl;
}
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 getAccessTokenByAuthCode(String authorizationCode, String codeVerifier, OAuthUser user) {
String encodedParameters = "client_id=" + urlEncode(user.clientId) + "&client_secret=" + urlEncode(user.clientSecret) + "&code=" + urlEncode(authorizationCode)
+ "&code_verifier=" + codeVerifier + "&redirect_uri=" + urlEncode(REDIRECT_URI) + "&grant_type=authorization_code";
System.out.println("---------------------------------------------------------");
System.out.println("------------- OAuth 2.0 AccessTokenByAuthCode -------------");
System.out.println("---------------------------------------------------------");
System.out.println("Authorization code: " + authorizationCode);
String result = "";
Map<String, String> token = geToken(encodedParameters);
for (String key : token.keySet()) {
System.out.println(key + ": " + token.get(key));
if (key.equals("refresh_token")) {
result = token.get(key);
}
}
System.out.println("---------------------------------------------------------");
return result;
}
static String getAccessTokenByRefreshToken(OAuthUser user) {
String encodedParameters = "client_id=" + urlEncode(user.clientId) + "&client_secret=" + urlEncode(user.clientSecret) + "&refresh_token=" + urlEncode(user.refreshToken)
+ "&grant_type=refresh_token";
System.out.println("---------------------------------------------------------");
System.out.println("----------- OAuth 2.0 AccessTokenByRefreshToken -----------");
System.out.println("---------------------------------------------------------");
System.out.println("Login: " + user.email);
String result = "";
Map<String, String> token = geToken(encodedParameters);
for (String key : token.keySet()) {
System.out.println(key + ": " + token.get(key));
if (key.equals("access_token")) {
result = token.get(key);
}
}
System.out.println("---------------------------------------------------------");
return result;
}
static Map<String, String> geToken(String encodedParameters) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(TOKEN_REQUEST_URL).openConnection();
connection.setRequestMethod("POST");
byte[] requestData = encodedParameters.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, String>();
System.out.println(responseText);
String[] strs = responseText.replace("{", "").replace("}", "").replace("\"", "").replace("\r", "").replace("\n", "").split(",");
for (String sPair : strs) {
String[] pair = sPair.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 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();
}
}
Google OAuth Helper باید به شکل زیر استفاده شود:
- ابتدا باید یک URL کد مجوز تولید شود.
- آدرس را در مرورگر باز کنید و تمام عملیات را تکمیل کنید. در نتیجه، یک کد مجوز دریافت خواهید کرد.
- از کد مجوز برای دریافت توکن تازهسازی استفاده کنید.
- هنگامی که توکن تازهسازی موجود باشد، میتوانید از آن برای دریافت توکنهای دسترسی استفاده کنید.
static class OAuthUser {
String email;
String clientId;
String clientSecret;
String refreshToken;
}
static void getRefreshToken() {
Scanner inputReader = new Scanner(System.in);
OAuthUser user = new OAuthUser();
// Set clientId, clientSecret and email
System.out.println("Set clientId: ");
user.clientId = inputReader.nextLine();
System.out.println("Set clientSecret: ");
user.clientSecret = inputReader.nextLine();
System.out.println("Set email: ");
user.email = inputReader.nextLine();
// Generate AuthorizationCodeUrl
String authorizationCodeUrl = GoogleOAuthHelper.getAuthorizationCodeUrl(user);
System.out.println("You have to retrieve AuthorizationCode manually with generated AuthorizationCodeUrl");
System.out.println("Set authorizationCode: ");
String authorizationCode = inputReader.nextLine();
System.out.println("Copy Code Verifier from the previous step output");
System.out.println("Set codeVerifier: ");
String codeVerifier = inputReader.nextLine();
// Get "Refresh Token"
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Get "Access Token"
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Use "Access Token" in API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
}