Tạo, cập nhật và xóa danh bạ trong Gmail bằng Java

Gmail là một trong những ứng dụng trực tuyến thường được sử dụng để gửi và nhận email. Ngoài ra, nó cho phép làm việc với lịch, danh bạ, trò chuyện, v.v. và cung cấp nhiều dịch vụ cộng tác khác. Gần đây, trong một bài báo, chúng tôi đã đề cập đến cách nhập danh bạ từ tài khoản Gmail. Hôm nay, bạn sẽ học cách tạo, cập nhật và xóa danh bạ trong tài khoản Gmail bằng Java.

API Java để tạo, cập nhật và xóa danh bạ Gmail

Để tạo và thao tác với danh bạ trong tài khoản Gmail, chúng tôi sẽ sử dụng Aspose.Email for Java. Đây là một API giàu tính năng cho phép bạn tạo và gửi email cũng như làm việc với các ứng dụng email phổ biến. Bạn có thể tải xuống API hoặc cài đặt nó bằng cách sử dụng các cấu hình Maven sau.

Kho:

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

Sự phụ thuộc:

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

Sau khi cài đặt API, bạn cần tạo một dự án trên Bảng điều khiển dành cho nhà phát triển của Google, dự án này sẽ cho phép bạn giao tiếp với Gmail. Để tạo một tài khoản, bạn có thể làm theo hướng dẫn này.

Bây giờ, hãy tạo một lớp trợ giúp có tên là GoogleOAuthHelper để đảm nhận việc xác thực tài khoản Gmail. Ngoài ra, hãy tạo một lớp có tên OAuthUser để lưu trữ thông tin người dùng. Sau đây là cách thực hiện đầy đủ của cả hai lớp.

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>
 * Bảng điều khiển dành cho nhà phát triển https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Tài liệu 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) {
            // phớt lờ
        }
        return result.toString();
    }
}

Tạo Liên hệ trên Gmail trong Java

Sau đây là các bước tạo liên hệ trên Gmail bằng Java.

Mẫu mã sau đây cho biết cách tạo liên hệ trên Gmail bằng Java.

OAuthUser user = new OAuthUser();

// Đặt clientId, clientSecret và email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";

// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Nhận mã làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Sử dụng Mã thông báo truy cập trong API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Tạo một liên hệ
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");

// Đặt địa chỉ bưu điện
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);

// Đặt số điện thoại
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);

// Đặt các chi tiết khác
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");

// Đặt địa chỉ email
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);

// Tạo ra liên lạc 
String contactUri = client.createContact(contact);

Cập nhật Địa chỉ liên hệ trên Gmail bằng Java

Bạn cũng có thể cập nhật thông tin chi tiết của một địa chỉ liên hệ Gmail sau khi truy cập nó. Sau đây là các bước để cập nhật địa chỉ liên hệ trong tài khoản Gmail bằng Java.

Mẫu mã sau đây cho biết cách cập nhật địa chỉ liên hệ trong Gmail bằng Java.

OAuthUser user = new OAuthUser();

// Đặt clientId, clientSecret và email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";

// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Nhận mã làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Sử dụng Mã thông báo truy cập trong API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Nhận tất cả các địa chỉ liên hệ
Contact[] contacts = client.getAllContacts();

// Tìm nạp một yêu cầu
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");

// Cập nhật liên hệ
client.updateContact(contact);

Xóa địa chỉ liên hệ trên Gmail trong Java

Cuối cùng, hãy xem cách xóa liên hệ Gmail bằng Java. Sau đây là các bước để thực hiện thao tác này.

Mẫu mã sau đây cho biết cách xóa địa chỉ liên hệ trên Gmail bằng Java.

OAuthUser user = new OAuthUser();

// Đặt clientId, clientSecret và email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";

// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";

// Nhận mã làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Sử dụng Mã thông báo truy cập trong API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Nhận tất cả các địa chỉ liên hệ
Contact[] contacts = client.getAllContacts();

// Tìm nạp một yêu cầu
Contact contact = contacts[0];

// Xóa liên lạc
client.deleteContact(contact.getId().getGoogleId());

Nhận giấy phép API miễn phí

Bạn có thể sử dụng Aspose.Email for Java mà không bị giới hạn đánh giá bằng cách sử dụng giấy phép tạm thời miễn phí.

Sự kết luận

Trong bài này, bạn đã học cách tạo và cập nhật danh bạ trong tài khoản Gmail bằng Java. Hơn nữa, bạn đã thấy cách xóa địa chỉ liên hệ Gmail theo chương trình. Bên cạnh đó, bạn có thể truy cập tài liệu để khám phá các tính năng khác của Aspose.Email dành cho Java. Trong trường hợp bạn có bất kỳ câu hỏi nào, bạn có thể đăng lên diễn đàn của chúng tôi.

Xem thêm