استيراد جهات اتصال Gmail برمجيًا في Java

يعد Gmail من Google من بين خدمات البريد الإلكتروني الأكثر شيوعًا والأكثر استخدامًا. يوفر Gmail مجموعة من الميزات جنبًا إلى جنب مع إرسال رسائل البريد الإلكتروني واستلامها فقط ، مثل التقويمات والدردشات وما إلى ذلك. في بعض الحالات ، قد تحتاج إلى الاتصال بـ Gmail واستيراد جهات الاتصال برمجيًا من داخل تطبيقاتك. لتحقيق ذلك ، توضح هذه المقالة كيفية استيراد جهات اتصال Gmail باستخدام Java. أيضًا ، سنتناول كيفية الوصول إلى جهات الاتصال في مجموعة بريد إلكتروني معينة.

Java API لاستيراد جهات اتصال Gmail

يعد Aspose.Email for Java واجهة برمجة تطبيقات قوية لإنشاء تطبيقات عميل بريد إلكتروني. علاوة على ذلك ، فهو يدعم العمل مع Gmail مثل الوصول إلى جهات الاتصال والتقويمات والمواعيد وما إلى ذلك. سنستخدم واجهة برمجة التطبيقات هذه للوصول إلى جهات الاتصال واستيرادها من حسابات Gmail. يمكنك إما تنزيل API أو تثبيته باستخدام تكوينات Maven التالية.

مخزن:

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>http://repository.aspose.com/repo/</url>
</repository>

الاعتماد:

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-email</artifactId>
    <version>22.2</version>
    <classifier>jdk16</classifier>
</dependency>

استيراد جهات الاتصال من Gmail في جافا

قبل أن تبدأ ، تحتاج إلى إنشاء مشروع على Google Developer Console ، والذي سيسمح لك بتنفيذ الكود. لإنشاء واحدة ، يمكنك اتباع هذا الدليل.

الآن ، قم بإنشاء فئة مساعدة تسمى GoogleOAuthHelper لتتولى مصادقة حساب Gmail. أيضًا ، أنشئ فئة باسم OAuthUser لتخزين معلومات المستخدم. ما يلي هو التنفيذ الكامل لكلا الفئتين.

public class OAuthUser {
        String email;
        String clientId;
        String clientSecret;
        String refreshToken;
    }
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 style=";text-align:right;direction:rtl">
 * وحدة تحكم المطورين https://console.developers.google.com/projectselector/apis/credentials؟pli=1 
 * التوثيق 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 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) {
            // يتجاهل
        }
        return result.toString();
    }
}

استيراد جهات الاتصال من حساب Gmail

فيما يلي خطوات استيراد جهات الاتصال من حساب Gmail في Java.

  • أنشئ عنصرًا من فئة OAuthUser وقم بتهيئته بالبريد الإلكتروني ومعرف العميل وسر العميل.
  • قم بإنشاء كائني سلسلة لتخزين رمز التفويض ومدقق التعليمات البرمجية.
  • احصل على رمز التحديث ورمز الوصول.
  • احصل على مثيل لفئة GmailClient في كائن IGmailClient باستخدام طريقة GmailClient.getInstance (سلسلة ، سلسلة).
  • قراءة جهات الاتصال في مصفوفة باستخدام طريقة IGmailClient.getAllContacts().
  • حلقة من خلال مجموعة للوصول إلى كل جهة اتصال.

يوضح نموذج الكود التالي كيفية استيراد جهات اتصال Gmail من حساب في Java.

OAuthUser user = new OAuthUser();

// تعيين clientId ، clientSecret والبريد الإلكتروني 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// يجب عليك استرداد AuthorizationCode يدويًا باستخدام AuthorizationCodeUrl الذي تم إنشاؤه
// تعيين رمز الترخيص
String authorizationCode = "<<authCode>>";

// انسخ Code Verifier من إخراج الخطوة السابقة
// تعيين codeVerifier
String codeVerifier = "<<codeVerifier>>";

// احصل على رمز التحديث
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// الحصول على رمز وصول
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// استخدم رمز الوصول في API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

Contact[] contacts = client.getAllContacts();
for (Contact contact : contacts)
	System.out.println(contact.getDisplayName() + ", " + contact.getEmailAddresses().get_Item(0));

استيراد جهات اتصال Gmail من مجموعة

يمكنك أيضًا الوصول إلى جهات الاتصال من مجموعة بريد إلكتروني معينة في Gmail باتباع الخطوات أدناه.

  • اتبع الخطوات المذكورة في القسم السابق لتهيئة IGmailClient.
  • اتصل بـ IGmailClient.getAllGroups() للحصول على المجموعات في كائن ContactGroupCollection.
  • قم بتصفية المجموعة (المجموعات) المطلوبة بناءً على العنوان.
  • الوصول إلى جهات الاتصال من مجموعة باستخدام طريقة IGmailClient.getContactsFromGroup(string).
  • حلقة من خلال مجموعة للوصول إلى كل جهة اتصال.

يوضح نموذج الكود التالي كيفية استيراد جهات اتصال من مجموعة Gmail معينة في Java.

OAuthUser user = new OAuthUser();

// تعيين clientId ، clientSecret والبريد الإلكتروني 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// يجب عليك استرداد AuthorizationCode يدويًا باستخدام AuthorizationCodeUrl الذي تم إنشاؤه
// تعيين رمز الترخيص
String authorizationCode = "<<authCode>>";

// انسخ Code Verifier من إخراج الخطوة السابقة
// تعيين codeVerifier
String codeVerifier = "<<codeVerifier>>";

// احصل على رمز التحديث
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// الحصول على رمز وصول
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// استخدم رمز الوصول في API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// إحضار جهات الاتصال من مجموعة معينة
ContactGroupCollection groups = client.getAllGroups();
GoogleContactGroup group = null;
for (GoogleContactGroup g : groups) {
	if ("TestGroup".equals(g.getTitle())) {
		group = g;
	}
}

// استرداد جهات الاتصال من المجموعة
if (group != null) {
	Contact[] contacts2 = client.getContactsFromGroup(group.getId());
	for (Contact con : contacts2)
		System.out.println(con.getDisplayName() + "," + con.getEmailAddresses().get_Item(0).toString());
}

احصل على ترخيص API مجاني

يمكنك الحصول على ترخيص مؤقت مجاني لاستخدام Aspose.Email لجافا دون قيود تقييم.

استنتاج

في هذه المقالة ، تعلمت كيفية استيراد جهات اتصال Gmail من حساب برمجيًا في Java. علاوة على ذلك ، لقد رأيت كيفية الوصول إلى جهات الاتصال من مجموعة بريد إلكتروني معينة في Gmail. بصرف النظر عن ذلك ، يمكنك استكشاف التوثيق لقراءة المزيد عن Aspose.Email لجافا. يمكنك أيضًا طرح أسئلتك عبر المنتدى.

أنظر أيضا