Створюйте, оновлюйте та видаляйте контакти в Gmail за допомогою Java

Gmail – одна з найпоширеніших онлайнових програм для надсилання та отримання електронних листів. Крім того, він дозволяє працювати з календарями, контактами, чатами тощо, а також надає різноманітні інші послуги для співпраці. Нещодавно в статті ми розповідали, як імпортувати контакти з облікового запису Gmail. Сьогодні ви дізнаєтеся, як створювати, оновлювати та видаляти контакти в обліковому записі Gmail за допомогою Java.

Java API для створення, оновлення та видалення контактів Gmail

Щоб створювати та керувати контактами в обліковому записі Gmail, ми будемо використовувати Aspose.Email for Java. Це багатофункціональний API, який дозволяє створювати та надсилати електронні листи та працювати з популярними клієнтами електронної пошти. Ви можете завантажити 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.3</version>
    <classifier>jdk16</classifier>
</dependency>

Після встановлення API вам потрібно створити проект на Google Developer Console, який дозволить вам спілкуватися з Gmail. Щоб створити його, ви можете виконати цей посібник.

Тепер створіть допоміжний клас під назвою 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 на Java

Нижче наведено кроки для створення контакту в Gmail на Java.

  • Спочатку створіть користувача Google, отримайте маркер доступу та ініціалізуйте об’єкт IGmailClient.
  • Потім створіть об’єкт класу Contact.
  • Встановіть такі властивості контакту, як ім’я, префікс, професія тощо.
  • Щоб установити поштову адресу, створіть екземпляр PostalAddress і встановіть його властивості.
  • Додайте новостворену адресу до колекції за допомогою методу Contact.getPhysicalAddresses().add(PostalAddress).
  • Встановіть деталі номера телефону за допомогою класу PhoneNumber.
  • Додайте інформацію про номер телефону до колекції за допомогою методу Contact.getPhoneNumbers().add(PhoneNumber).
  • Створіть екземпляр класу EmailAddress, установіть адресу електронної пошти та призначте її контакту.
  • Нарешті, викличте метод IGmailClient.createContact(Contact), щоб створити контакт Gmail.

У наведеному нижче прикладі коду показано, як створити контакт у 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 contact = new Contact();
contact.setPrefix("Prefix");
contact.setGivenName("GivenName");
contact.setSurname("Surname");
contact.setMiddleName("MiddleName");
contact.setDisplayName("DisplayName");
contact.setSuffix("Suffix");
contact.setJobTitle("JobTitle");
contact.setDepartmentName("DepartmentName");
contact.setCompanyName("CompanyName");
contact.setProfession("Profession");
contact.setNotes("Notes");

// Встановити поштову адресу
PostalAddress address = new PostalAddress();
address.setCategory(PostalAddressCategory.getWork());
address.setAddress("Address");
address.setStreet("Street");
address.setPostOfficeBox("PostOfficeBox");
address.setCity("City");
address.setStateOrProvince("StateOrProvince");
address.setPostalCode("PostalCode");
address.setCountry("Country");
contact.getPhysicalAddresses().add(address);

// Встановити номер телефону
PhoneNumber pnWork = new PhoneNumber();
pnWork.setNumber("323423423423");
pnWork.setCategory(PhoneNumberCategory.getWork());
contact.getPhoneNumbers().add(pnWork);
PhoneNumber pnHome = new PhoneNumber();
pnHome.setNumber("323423423423");
pnHome.setCategory(PhoneNumberCategory.getHome());
contact.getPhoneNumbers().add(pnHome);
PhoneNumber pnMobile = new PhoneNumber();
pnMobile.setNumber("323423423423");
pnMobile.setCategory(PhoneNumberCategory.getMobile());
contact.getPhoneNumbers().add(pnMobile);

// Встановіть інші деталі
contact.getUrls().setBlog("Blog.com");
contact.getUrls().setBusinessHomePage("BusinessHomePage.com");
contact.getUrls().setHomePage("HomePage.com");
contact.getUrls().setProfile("Profile.com");
contact.getEvents().setBirthday(new Date());
contact.getEvents().setAnniversary(new Date());
contact.getInstantMessengers().setAIM("AIM");
contact.getInstantMessengers().setGoogleTalk("GoogleTalk");
contact.getInstantMessengers().setICQ("ICQ");
contact.getInstantMessengers().setJabber("Jabber");
contact.getInstantMessengers().setMSN("MSN");
contact.getInstantMessengers().setQQ("QQ");
contact.getInstantMessengers().setSkype("Skype");
contact.getInstantMessengers().setYahoo("Yahoo");
contact.getAssociatedPersons().setSpouse("Spouse");
contact.getAssociatedPersons().setSister("Sister");
contact.getAssociatedPersons().setRelative("Relative");
contact.getAssociatedPersons().setReferredBy("ReferredBy");
contact.getAssociatedPersons().setPartner("Partner");
contact.getAssociatedPersons().setParent("Parent");
contact.getAssociatedPersons().setMother("Mother");
contact.getAssociatedPersons().setManager("Manager");

// Встановіть адресу електронної пошти
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);

// Створити контакт 
String contactUri = client.createContact(contact);

Оновіть контакт у Gmail на Java

Ви також можете оновити деталі контакту Gmail після доступу до нього. Нижче наведено кроки для оновлення контакту в обліковому записі Gmail на Java.

  • Спочатку створіть користувача Google, отримайте маркер доступу та ініціалізуйте об’єкт IGmailClient.
  • Потім отримайте контакти в масиві за допомогою методу IGmailClient.getAllContacts().
  • Після цього витягніть потрібний контакт із масиву в об’єкті Контакт.
  • Нарешті, оновіть деталі контакту та викличте метод IGmailClient.updateContact(contact).

У наведеному нижче прикладі коду показано, як оновити контакт у 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();

// Потрібен один
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");

// Оновити контакт
client.updateContact(contact);

Видалення контакту в Gmail на Java

Нарешті, давайте подивимося, як видалити контакт Gmail за допомогою Java. Нижче наведено кроки для виконання цієї операції.

  • Спочатку створіть користувача Google, отримайте маркер доступу та ініціалізуйте об’єкт IGmailClient.
  • Потім отримайте контакти в масиві за допомогою методу IGmailClient.getAllContacts().
  • Відфільтруйте потрібний контакт із масиву в об’єкті Контакт.
  • Нарешті, викличте метод IGmailClient.deleteContact(Contact.Id.GoogleId), щоб видалити контакт.

У наведеному нижче прикладі коду показано, як видалити контакт із 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();

// Потрібен один
Contact contact = contacts[0];

// Видалити контакт
client.deleteContact(contact.getId().getGoogleId());

Отримайте безкоштовну ліцензію API

Ви можете використовувати Aspose.Email for Java без оціночних обмежень за допомогою безкоштовної тимчасової ліцензії.

Висновок

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

Дивись також