Crear, actualizar y eliminar contactos en Gmail usando Java

Gmail es una de las aplicaciones en línea más utilizadas para enviar y recibir correos electrónicos. Además, permite trabajar con calendarios, contactos, chats, etc., y proporciona varios otros servicios de colaboración. Recientemente, en un artículo, hemos cubierto cómo importar contactos desde una cuenta de Gmail. Hoy aprenderá cómo crear, actualizar y eliminar contactos en una cuenta de Gmail usando Java.

API de Java para crear, actualizar y eliminar contactos de Gmail

Para crear y manipular contactos en una cuenta de Gmail, usaremos Aspose.Email for Java. Es una API rica en funciones que le permite crear y enviar correos electrónicos y trabajar con clientes de correo electrónico populares. Puede descargar la API o instalarla usando las siguientes configuraciones de Maven.

Repositorio:

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

Dependencia:

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

Después de instalar la API, debe crear un proyecto en Google Developer Console, que le permitirá comunicarse con Gmail. Para crear uno, puede seguir esta guía.

Ahora, cree una clase auxiliar llamada GoogleOAuthHelper para encargarse de la autenticación de una cuenta de Gmail. Además, cree una clase denominada OAuthUser para almacenar la información del usuario. La siguiente es la implementación completa de ambas clases.

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>
 * Consola de desarrolladores https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Documentación 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) {
            // pasar por alto
        }
        return result.toString();
    }
}

Crear un contacto en Gmail en Java

Los siguientes son los pasos para crear un contacto en Gmail en Java.

El siguiente ejemplo de código muestra cómo crear un contacto en Gmail en Java.

OAuthUser user = new OAuthUser();

// Establezca clientId, clientSecret y correo electrónico 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";

// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";

// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Usar token de acceso en la API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Crear un contacto
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");

// Establecer dirección postal
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);

// Establecer número de teléfono
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);

// Establecer otros detalles
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");

// Establecer dirección de correo electrónico
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);

// Crear contacto 
String contactUri = client.createContact(contact);

Actualizar un contacto en Gmail en Java

También puede actualizar los detalles de un contacto de Gmail después de acceder a él. Los siguientes son los pasos para actualizar un contacto en una cuenta de Gmail en Java.

El siguiente ejemplo de código muestra cómo actualizar un contacto en Gmail en Java.

OAuthUser user = new OAuthUser();

// Establezca clientId, clientSecret y correo electrónico 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";

// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";

// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Usar token de acceso en la API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Obtener todos los contactos
Contact[] contacts = client.getAllContacts();

// Obtener uno requerido
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");

// Actualizar contacto
client.updateContact(contact);

Eliminar un contacto en Gmail en Java

Finalmente, veamos cómo eliminar un contacto de Gmail usando Java. Los siguientes son los pasos para realizar esta operación.

El siguiente ejemplo de código muestra cómo eliminar un contacto en Gmail en Java.

OAuthUser user = new OAuthUser();

// Establezca clientId, clientSecret y correo electrónico 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";

// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";

// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Usar token de acceso en la API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Obtener todos los contactos
Contact[] contacts = client.getAllContacts();

// Obtener uno requerido
Contact contact = contacts[0];

// Borrar contacto
client.deleteContact(contact.getId().getGoogleId());

Obtenga una licencia de API gratuita

Puede usar Aspose.Email for Java sin limitaciones de evaluación usando una licencia temporal gratuita.

Conclusión

En este artículo, ha aprendido cómo crear y actualizar contactos en una cuenta de Gmail en Java. Además, ha visto cómo eliminar un contacto de Gmail mediante programación. Además, puede visitar la documentación para explorar otras funciones de Aspose.Email for Java. En caso de que tenga alguna pregunta, puede publicarla en nuestro foro.

Ver también