Nhập địa chỉ liên hệ trong Gmail có lập trình trong Java

Gmail của Google là một trong những dịch vụ email phổ biến và được sử dụng phổ biến nhất. Gmail cung cấp một loạt các tính năng cùng với việc chỉ gửi và nhận email, chẳng hạn như lịch, cuộc trò chuyện, v.v. Trong một số trường hợp, bạn có thể cần kết nối với Gmail và nhập danh bạ theo chương trình từ trong ứng dụng của mình. Để đạt được điều đó, bài viết này hướng dẫn cách nhập danh bạ Gmail bằng Java. Ngoài ra, chúng tôi sẽ đề cập đến cách truy cập danh bạ trong một nhóm email cụ thể.

API Java để nhập danh bạ Gmail

Aspose.Email dành cho Java là một API mạnh mẽ để tạo các ứng dụng email khách. Hơn nữa, nó hỗ trợ làm việc với Gmail như truy cập danh bạ, lịch, cuộc hẹn,… Chúng tôi sẽ sử dụng API này để truy cập và nhập danh bạ từ tài khoản Gmail. 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.2</version>
    <classifier>jdk16</classifier>
</dependency>

Nhập Danh bạ từ Gmail trong Java

Trước khi bắt đầu, 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, điều này sẽ cho phép bạn thực thi mã. Để 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();
    }
}

Nhập Danh bạ từ Tài khoản Gmail

Sau đây là các bước để nhập danh bạ từ tài khoản Gmail trong Java.

  • Tạo một đối tượng của lớp OAuthUser và khởi tạo nó bằng email, ID ứng dụng khách và bí mật của ứng dụng khách.
  • Tạo hai đối tượng chuỗi để lưu trữ mã ủy quyền và trình xác minh mã.
  • Nhận mã thông báo làm mới và mã thông báo truy cập.
  • Lấy một phiên bản của lớp GmailClient vào một đối tượng IGmailClient bằng cách sử dụng phương thức GmailClient.getInstance (String, String).
  • Đọc danh bạ thành một mảng bằng phương thức IGmailClient.getAllContacts().
  • Lặp qua mảng để truy cập từng liên hệ.

Mẫu mã sau đây cho thấy cách nhập danh bạ Gmail từ một tài khoản trong 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);

Contact[] contacts = client.getAllContacts();
for (Contact contact : contacts)
	System.out.println(contact.getDisplayName() + ", " + contact.getEmailAddresses().get_Item(0));

Nhập Danh bạ Gmail từ một Nhóm

Bạn cũng có thể truy cập danh bạ từ một nhóm email cụ thể trong Gmail theo các bước bên dưới.

  • Làm theo các bước được đề cập trong phần trước để khởi tạo IGmailClient.
  • Gọi IGmailClient.getAllGroups() để đưa các nhóm vào một đối tượng ContactGroupCollection.
  • Lọc (các) nhóm được yêu cầu dựa trên tiêu đề.
  • Truy cập danh bạ từ một nhóm bằng phương pháp IGmailClient.getContactsFromGroup (String).
  • Lặp qua mảng để truy cập từng liên hệ.

Mẫu mã sau đây cho thấy cách nhập danh bạ từ một nhóm Gmail cụ thể trong 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ìm nạp địa chỉ liên hệ từ một nhóm cụ thể
ContactGroupCollection groups = client.getAllGroups();
GoogleContactGroup group = null;
for (GoogleContactGroup g : groups) {
	if ("TestGroup".equals(g.getTitle())) {
		group = g;
	}
}

// Truy xuất địa chỉ liên hệ từ Nhóm
if (group != null) {
	Contact[] contacts2 = client.getContactsFromGroup(group.getId());
	for (Contact con : contacts2)
		System.out.println(con.getDisplayName() + "," + con.getEmailAddresses().get_Item(0).toString());
}

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

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

Sự kết luận

Trong bài viết này, bạn đã học cách nhập danh bạ Gmail từ tài khoản theo lập trình trong Java. Hơn nữa, bạn đã thấy cách truy cập danh bạ từ một nhóm email cụ thể trong Gmail. Ngoài ra, bạn có thể khám phá tài liệu để đọc thêm về Aspose.Email dành cho Java. Ngoài ra, bạn có thể đặt câu hỏi của mình qua diễn đàn của chúng tôi.

Xem thêm