ייבא איש קשר של Gmail באופן פרוגרמטי ב-Java

Gmail של גוגל הוא בין שירותי האימייל הפופולריים והנפוצים ביותר. Gmail מספק מגוון תכונות יחד עם רק שליחה וקבלה של הודעות דוא"ל, כגון יומנים, צ’אטים וכו’. במקרים מסוימים, ייתכן שיהיה עליך להתחבר ל-Gmail ולייבא אנשי קשר באופן פרוגרמטי מתוך היישומים שלך. כדי להשיג זאת, מאמר זה מראה כיצד לייבא אנשי קשר של Gmail באמצעות Java. כמו כן, נסקור כיצד לגשת לאנשי קשר בקבוצת דוא"ל ספציפית.

Java API לייבוא אנשי קשר של Gmail

Aspose.Email for Java הוא ממשק API רב עוצמה ליצירת יישומי לקוח דוא"ל. יתר על כן, הוא תומך בעבודה עם Gmail כגון גישה לאנשי קשר, לוחות שנה, פגישות וכו’. אנו נשתמש ב-API זה כדי לגשת ולייבא אנשי קשר מחשבונות 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 ב-Java

לפני שתתחיל, עליך ליצור פרויקט ב-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(String, String).
  • קרא אנשי קשר למערך באמצעות שיטת 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>>";

// קבל Refresh Token
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// קבל אסימון גישה
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// השתמש ב-Access Token ב-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>>";

// קבל Refresh Token
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// קבל אסימון גישה
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// השתמש ב-Access Token ב-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 בחינם

אתה יכול לקבל [רישיון זמני] בחינם5 לשימוש ב-Aspose.Email עבור Java ללא מגבלות הערכה.

סיכום

במאמר זה, למדת כיצד לייבא אנשי קשר של Gmail מחשבון באופן תכנותי ב-Java. יתר על כן, ראית כיצד לגשת לאנשי קשר מקבוצת דוא"ל מסוימת ב-Gmail. מלבד זאת, אתה יכול לחקור את תיעוד כדי לקרוא עוד על Aspose.Email עבור Java. כמו כן, אתה יכול לשאול את השאלות שלך דרך הפורום שלנו.

ראה גם