Crea, aggiorna ed elimina contatti in Gmail utilizzando Java

Gmail è una delle applicazioni online comunemente utilizzate per inviare e ricevere e-mail. Inoltre, consente di lavorare con calendari, contatti, chat, ecc. e fornisce vari altri servizi di collaborazione. Di recente, in un articolo, abbiamo spiegato come importare i contatti da un account Gmail. Oggi imparerai come creare, aggiornare ed eliminare contatti in un account Gmail utilizzando Java.

API Java per creare, aggiornare ed eliminare contatti Gmail

Per creare e manipolare i contatti in un account Gmail, utilizzeremo Aspose.Email for Java. È un’API ricca di funzionalità che ti consente di creare e inviare e-mail e di lavorare con i client di posta elettronica più diffusi. Puoi scaricare l’API o installarla utilizzando le seguenti configurazioni Maven.

Archivio:

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

Dipendenza:

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

Dopo aver installato l’API, devi creare un progetto sulla Google Developer Console, che ti consentirà di comunicare con Gmail. Per crearne uno, puoi seguire questa guida.

Ora crea una classe helper denominata GoogleOAuthHelper per occuparsi dell’autenticazione di un account Gmail. Creare inoltre una classe denominata OAuthUser per memorizzare le informazioni sull’utente. Quella che segue è l’implementazione completa di entrambe le classi.

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>
 * Console per gli sviluppatori https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Documentazione 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) {
            // ignorare
        }
        return result.toString();
    }
}

Crea un contatto su Gmail in Java

Di seguito sono riportati i passaggi per creare un contatto su Gmail in Java.

L’esempio di codice seguente mostra come creare un contatto su Gmail in Java.

OAuthUser user = new OAuthUser();

// Imposta clientId, clientSecret ed e-mail 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Devi recuperare AuthorizationCode manualmente con AuthorizationCodeUrl generato
// Imposta il codice di autorizzazione
String authorizationCode = "<<authCode>>";

// Copia Code Verifier dall'output del passaggio precedente
// Imposta codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Ottieni il token di aggiornamento
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Ottieni token di accesso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Usa il token di accesso nell'API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Crea un contatto
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");

// Imposta indirizzo postale
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);

// Imposta il numero di telefono
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);

// Imposta altri dettagli
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");

// Imposta indirizzo email
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);

// Crea contatto 
String contactUri = client.createContact(contact);

Aggiorna un contatto su Gmail in Java

Puoi anche aggiornare i dettagli di un contatto Gmail dopo avervi effettuato l’accesso. Di seguito sono riportati i passaggi per aggiornare un contatto in un account Gmail in Java.

L’esempio di codice seguente mostra come aggiornare un contatto in Gmail in Java.

OAuthUser user = new OAuthUser();

// Imposta clientId, clientSecret ed e-mail 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Devi recuperare AuthorizationCode manualmente con AuthorizationCodeUrl generato
// Imposta il codice di autorizzazione
String authorizationCode = "<<authCode>>";

// Copia Code Verifier dall'output del passaggio precedente
// Imposta codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Ottieni il token di aggiornamento
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Ottieni token di accesso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Usa il token di accesso nell'API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Ottieni tutti i contatti
Contact[] contacts = client.getAllContacts();

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

// Aggiorna contatto
client.updateContact(contact);

Elimina un contatto su Gmail in Java

Infine, vediamo come eliminare un contatto Gmail utilizzando Java. Di seguito sono riportati i passaggi per eseguire questa operazione.

L’esempio di codice seguente mostra come eliminare un contatto su Gmail in Java.

OAuthUser user = new OAuthUser();

// Imposta clientId, clientSecret ed e-mail 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Devi recuperare AuthorizationCode manualmente con AuthorizationCodeUrl generato
// Imposta il codice di autorizzazione
String authorizationCode = "<<authCode>>";

// Copia Code Verifier dall'output del passaggio precedente
// Imposta codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Ottieni il token di aggiornamento
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Ottieni token di accesso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Usa il token di accesso nell'API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Ottieni tutti i contatti
Contact[] contacts = client.getAllContacts();

// Recupera uno richiesto
Contact contact = contacts[0];

// Elimina contatto
client.deleteContact(contact.getId().getGoogleId());

Ottieni una licenza API gratuita

Puoi utilizzare Aspose.Email per Java senza limitazioni di valutazione utilizzando una licenza temporanea gratuita.

Conclusione

In questo articolo hai imparato come creare e aggiornare i contatti in un account Gmail in Java. Inoltre, hai visto come eliminare un contatto Gmail in modo programmatico. Inoltre, puoi visitare la documentazione per esplorare altre funzionalità di Aspose.Email per Java. In caso aveste domande, potete postare sul nostro forum.

Guarda anche