Skapa, uppdatera och ta bort kontakter i Gmail med Java

Gmail är en av de vanligaste onlineapplikationerna för att skicka och ta emot e-post. Dessutom tillåter det att arbeta med kalendrar, kontakter, chattar, etc., och tillhandahåller olika andra samarbetstjänster. Nyligen, i en artikel, har vi behandlat hur man importerar kontakter från ett Gmail-konto. Idag kommer du att lära dig hur du skapar, uppdaterar och tar bort kontakter i ett Gmail-konto med Java.

Java API för att skapa, uppdatera och ta bort Gmail-kontakter

För att skapa och manipulera kontakter i ett Gmail-konto använder vi Aspose.Email for Java. Det är ett funktionsrikt API som låter dig skapa och skicka e-post och arbeta med populära e-postklienter. Du kan antingen ladda ner API:t eller installera det med hjälp av följande Maven-konfigurationer.

Förvar:

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

Beroende:

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

Efter att ha installerat API:et måste du skapa ett projekt på Googles utvecklarkonsol, vilket gör att du kan kommunicera med Gmail. För att skapa en kan du följa denna guide.

Skapa nu en hjälpklass vid namn GoogleOAuthHelper för att ta hand om autentiseringen av ett Gmail-konto. Skapa också en klass som heter OAuthUser för att lagra användarinformation. Följande är den fullständiga implementeringen av båda klasserna.

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>
 * Utvecklarkonsol https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Dokumentation 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) {
            // ignorera
        }
        return result.toString();
    }
}

Skapa en kontakt på Gmail i Java

Följande är stegen för att skapa en kontakt på Gmail i Java.

Följande kodexempel visar hur du skapar en kontakt på Gmail i Java.

OAuthUser user = new OAuthUser();

// Ställ in clientId, clientSecret och e-post 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Du måste hämta AuthorizationCode manuellt med genererad AuthorizationCodeUrl
// Ställ in auktoriseringskod
String authorizationCode = "<<authCode>>";

// Kopiera kodverifierare från föregående steg
// Ställ in codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Få Refresh Token
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Få åtkomsttoken
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Använd åtkomsttoken i API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Skapa en kontakt
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");

// Ange postadress
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);

// Ställ in telefonnummer
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);

// Ställ in andra detaljer
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");

// Ange e-postadress
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);

// Skapa kontakt 
String contactUri = client.createContact(contact);

Uppdatera en kontakt på Gmail i Java

Du kan också uppdatera informationen för en Gmail-kontakt efter att ha kommit åt den. Följande är stegen för att uppdatera en kontakt i ett Gmail-konto i Java.

Följande kodexempel visar hur du uppdaterar en kontakt i Gmail i Java.

OAuthUser user = new OAuthUser();

// Ställ in clientId, clientSecret och e-post 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Du måste hämta AuthorizationCode manuellt med genererad AuthorizationCodeUrl
// Ställ in auktoriseringskod
String authorizationCode = "<<authCode>>";

// Kopiera kodverifierare från föregående steg
// Ställ in codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Få Refresh Token
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Få åtkomsttoken
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Använd åtkomsttoken i API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Få alla kontakter
Contact[] contacts = client.getAllContacts();

// Hämta krävs en
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");

// Uppdatera kontakt
client.updateContact(contact);

Ta bort en kontakt på Gmail i Java

Slutligen, låt oss se hur man tar bort en Gmail-kontakt med Java. Följande är stegen för att utföra denna operation.

Följande kodexempel visar hur man tar bort en kontakt på Gmail i Java.

OAuthUser user = new OAuthUser();

// Ställ in clientId, clientSecret och e-post 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Du måste hämta AuthorizationCode manuellt med genererad AuthorizationCodeUrl
// Ställ in auktoriseringskod
String authorizationCode = "<<authCode>>";

// Kopiera kodverifierare från föregående steg
// Ställ in codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Få Refresh Token
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Få åtkomsttoken
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Använd åtkomsttoken i API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Få alla kontakter
Contact[] contacts = client.getAllContacts();

// Hämta krävs en
Contact contact = contacts[0];

// Ta bort kontakt
client.deleteContact(contact.getId().getGoogleId());

Skaffa en gratis API-licens

Du kan använda Aspose.Email för Java utan utvärderingsbegränsningar med en gratis temporär licens.

Slutsats

I den här artikeln har du lärt dig hur du skapar och uppdaterar kontakter i ett Gmail-konto i Java. Dessutom har du sett hur man tar bort en Gmail-kontakt programmatiskt. Dessutom kan du besöka dokumentationen för att utforska andra funktioner i Aspose.Email för Java. Om du skulle ha några frågor kan du göra ett inlägg på vårt forum.

Se även