Програмний імпорт контактів Gmail у Java

Google 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>
 * Консоль розробника 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>>";

// Скопіюйте засіб перевірки коду з вихідних даних попереднього кроку
// Встановіть 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>>";

// Скопіюйте засіб перевірки коду з вихідних даних попереднього кроку
// Встановіть 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 for Java без оціночних обмежень.

Висновок

У цій статті ви дізналися, як програмно імпортувати контакти Gmail з облікового запису в Java. Крім того, ви бачили, як отримати доступ до контактів із певної групи електронної пошти в Gmail. Крім того, ви можете ознайомитися з документацією, щоб дізнатися більше про Aspose.Email for Java. Ви також можете поставити свої запитання через наш форум.

Дивись також