Impor kontak Gmail secara terprogram di Java

Gmail Google adalah salah satu layanan email yang paling populer dan umum digunakan. Gmail menyediakan berbagai fitur selain mengirim dan menerima email, seperti kalender, obrolan, dll. Dalam kasus tertentu, Anda mungkin perlu terhubung ke Gmail dan mengimpor kontak secara terprogram dari dalam aplikasi Anda. Untuk mencapainya, artikel ini menunjukkan cara mengimpor kontak Gmail menggunakan Java. Selain itu, kami akan membahas cara mengakses kontak di grup email tertentu.

Java API untuk Mengimpor Kontak Gmail

Aspose.Email for Java adalah API yang kuat untuk membuat aplikasi klien email. Selain itu, ini mendukung bekerja dengan Gmail seperti mengakses kontak, kalender, janji temu, dll. Kami akan menggunakan API ini untuk mengakses dan mengimpor kontak dari akun Gmail. Anda dapat mengunduh API atau menginstalnya menggunakan konfigurasi Maven berikut.

Gudang:

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

Ketergantungan:

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

Impor Kontak dari Gmail di Jawa

Sebelum memulai, Anda perlu membuat proyek di Konsol Pengembang Google, yang memungkinkan Anda mengeksekusi kode. Untuk membuatnya, Anda dapat mengikuti panduan ini.

Sekarang, buat kelas pembantu bernama GoogleOAuthHelper untuk menangani autentikasi akun Gmail. Buat juga kelas bernama OAuthUser untuk menyimpan informasi pengguna. Berikut implementasi lengkap dari kedua class tersebut.

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

Impor Kontak dari Akun Gmail

Berikut langkah-langkah import kontak dari akun Gmail di Java.

  • Buat objek kelas OAuthUser dan inisialisasi dengan email, ID klien, dan rahasia klien.
  • Buat dua objek string untuk menyimpan kode otorisasi dan pemverifikasi kode.
  • Dapatkan token penyegaran dan token akses.
  • Dapatkan instance kelas GmailClient ke objek IGmailClient menggunakan metode GmailClient.getInstance(String, String).
  • Membaca kontak ke dalam array menggunakan metode IGmailClient.getAllContacts().
  • Ulangi array untuk mengakses setiap kontak.

Contoh kode berikut menunjukkan cara mengimpor kontak Gmail dari akun di Java.

OAuthUser user = new OAuthUser();

// Atur clientId, clientSecret dan email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Anda harus mengambil AuthorizationCode secara manual dengan AuthorizationCodeUrl yang dihasilkan
// Setel kode otorisasi
String authorizationCode = "<<authCode>>";

// Salin Pemverifikasi Kode dari output langkah sebelumnya
// Tetapkan pemverifikasi kode
String codeVerifier = "<<codeVerifier>>";

// Dapatkan Token Penyegaran
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Dapatkan Token Akses
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Gunakan Token Akses di 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));

Impor Kontak Gmail dari Grup

Anda juga dapat mengakses kontak dari grup email tertentu di Gmail dengan mengikuti langkah-langkah di bawah ini.

  • Ikuti langkah-langkah yang disebutkan di bagian sebelumnya untuk menginisialisasi IGmailClient.
  • Panggil IGmailClient.getAllGroups() untuk memasukkan grup ke dalam objek ContactGroupCollection.
  • Saring grup yang diperlukan berdasarkan judul.
  • Akses kontak dari grup menggunakan metode IGmailClient.getContactsFromGroup(String).
  • Ulangi array untuk mengakses setiap kontak.

Contoh kode berikut menunjukkan cara mengimpor kontak dari grup Gmail tertentu di Java.

OAuthUser user = new OAuthUser();

// Atur clientId, clientSecret dan email 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// Anda harus mengambil AuthorizationCode secara manual dengan AuthorizationCodeUrl yang dihasilkan
// Setel kode otorisasi
String authorizationCode = "<<authCode>>";

// Salin Pemverifikasi Kode dari keluaran langkah sebelumnya
// Tetapkan pemverifikasi kode
String codeVerifier = "<<codeVerifier>>";

// Dapatkan Token Penyegaran
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Dapatkan Token Akses
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// Gunakan Token Akses di API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Ambil kontak dari grup tertentu
ContactGroupCollection groups = client.getAllGroups();
GoogleContactGroup group = null;
for (GoogleContactGroup g : groups) {
	if ("TestGroup".equals(g.getTitle())) {
		group = g;
	}
}

// Ambil kontak dari Grup
if (group != null) {
	Contact[] contacts2 = client.getContactsFromGroup(group.getId());
	for (Contact con : contacts2)
		System.out.println(con.getDisplayName() + "," + con.getEmailAddresses().get_Item(0).toString());
}

Dapatkan Lisensi API Gratis

Anda bisa mendapatkan lisensi sementara gratis untuk menggunakan Aspose.Email for Java tanpa batasan evaluasi.

Kesimpulan

Pada artikel ini, Anda telah mempelajari cara mengimpor kontak Gmail dari akun secara terprogram di Java. Selain itu, Anda telah melihat cara mengakses kontak dari grup email tertentu di Gmail. Selain itu, Anda dapat menjelajahi dokumentasi untuk membaca lebih lanjut tentang Aspose.Email for Java. Selain itu, Anda dapat mengajukan pertanyaan melalui forum kami.

Lihat juga