นำเข้าผู้ติดต่อ Gmail โดยทางโปรแกรมใน Java

Gmail ของ Google เป็นหนึ่งในบริการอีเมลที่ได้รับความนิยมและใช้กันมากที่สุด Gmail มีคุณลักษณะหลายอย่างพร้อมกับการส่งและรับอีเมล เช่น ปฏิทิน แชท ฯลฯ ในบางกรณี คุณอาจต้องเชื่อมต่อกับ Gmail และนำเข้าที่อยู่ติดต่อโดยทางโปรแกรมจากภายในแอปพลิเคชันของคุณ บทความนี้แสดงวิธีนำเข้าที่อยู่ติดต่อ Gmail โดยใช้ Java เพื่อให้บรรลุเป้าหมายดังกล่าว นอกจากนี้ เราจะกล่าวถึงวิธีการเข้าถึงผู้ติดต่อในกลุ่มอีเมลเฉพาะ

Java API เพื่อนำเข้าผู้ติดต่อ Gmail

Aspose.Email for Java เป็น API ที่มีประสิทธิภาพในการสร้างแอปพลิเคชันอีเมลไคลเอ็นต์ นอกจากนี้ยังรองรับการทำงานกับ Gmail เช่น การเข้าถึงรายชื่อ ปฏิทิน การนัดหมาย ฯลฯ เราจะใช้ API นี้เพื่อเข้าถึงและนำเข้ารายชื่อจากบัญชี Gmail คุณสามารถ ดาวน์โหลด API หรือติดตั้งโดยใช้การกำหนดค่า Maven ต่อไปนี้

พื้นที่เก็บข้อมูล:

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

การพึ่งพา:

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

นำเข้าผู้ติดต่อจาก Gmail ใน Java

ก่อนที่คุณจะเริ่มต้น คุณต้องสร้างโครงการบน Google Developer Console ซึ่งจะอนุญาตให้คุณดำเนินการโค้ด หากต้องการสร้าง คุณสามารถทำตาม คู่มือนี้

ตอนนี้ สร้างคลาสผู้ช่วยเหลือชื่อ GoogleOAuthHelper เพื่อดูแลการตรวจสอบสิทธิ์ของบัญชี Gmail สร้างคลาสชื่อ OAuthUser เพื่อเก็บข้อมูลผู้ใช้ ต่อไปนี้คือการใช้งานทั้งสองคลาสอย่างสมบูรณ์

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>
 * คอนโซลนักพัฒนา https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * เอกสาร 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) {
            // ไม่สนใจ
        }
        return result.toString();
    }
}

นำเข้าผู้ติดต่อจากบัญชี Gmail

ต่อไปนี้เป็นขั้นตอนในการนำเข้าผู้ติดต่อจากบัญชี Gmail ใน Java

  • สร้างออบเจกต์ของคลาส OAuthUser และเริ่มต้นด้วยอีเมล รหัสไคลเอ็นต์ และรหัสลับไคลเอ็นต์
  • สร้างออบเจกต์สตริงสองรายการเพื่อจัดเก็บรหัสการให้สิทธิ์และตัวตรวจสอบรหัส
  • รับโทเค็นการรีเฟรชและโทเค็นการเข้าถึง
  • รับอินสแตนซ์ของคลาส GmailClient ในวัตถุ IGmailClient โดยใช้เมธอด GmailClient.getInstance(String, String)
  • อ่านผู้ติดต่อลงในอาร์เรย์โดยใช้เมธอด IGmailClient.getAllContacts()
  • วนซ้ำอาร์เรย์เพื่อเข้าถึงผู้ติดต่อแต่ละราย

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการนำเข้าที่อยู่ติดต่อ Gmail จากบัญชีใน Java

OAuthUser user = new OAuthUser();

// ตั้งค่ารหัสไคลเอนต์ ไคลเอ็นต์ซีเคร็ต และอีเมล 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// คุณต้องดึง AuthorizationCode ด้วยตนเองด้วย AuthorizationCodeUrl ที่สร้างขึ้น
// ตั้งรหัสการให้สิทธิ์
String authorizationCode = "<<authCode>>";

// คัดลอก Code Verifier จากเอาต์พุตขั้นตอนก่อนหน้า
// ตั้งรหัสVerifier
String codeVerifier = "<<codeVerifier>>";

// รับโทเค็นการรีเฟรช
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// รับโทเค็นการเข้าถึง
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// ใช้โทเค็นการเข้าถึงใน 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));

นำเข้าที่อยู่ติดต่อ Gmail จากกลุ่ม

คุณยังสามารถเข้าถึงผู้ติดต่อจากกลุ่มอีเมลเฉพาะใน Gmail โดยทำตามขั้นตอนด้านล่าง

  • ทำตามขั้นตอนที่กล่าวถึงในส่วนก่อนหน้าเพื่อเริ่มต้น IGmailClient
  • โทร IGmailClient.getAllGroups() เพื่อรับกลุ่มในวัตถุ ContactGroupCollection
  • กรองกลุ่มที่ต้องการตามชื่อเรื่อง
  • เข้าถึงผู้ติดต่อจากกลุ่มโดยใช้เมธอด IGmailClient.getContactsFromGroup(String)
  • วนซ้ำอาร์เรย์เพื่อเข้าถึงผู้ติดต่อแต่ละราย

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการนำเข้าผู้ติดต่อจากกลุ่ม Gmail เฉพาะใน Java

OAuthUser user = new OAuthUser();

// ตั้งค่ารหัสไคลเอนต์, ไคลเอ็นต์ซีเคร็ต และอีเมล 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// คุณต้องดึง AuthorizationCode ด้วยตนเองด้วย AuthorizationCodeUrl ที่สร้างขึ้น
// ตั้งรหัสการให้สิทธิ์
String authorizationCode = "<<authCode>>";

// คัดลอก Code Verifier จากเอาต์พุตขั้นตอนก่อนหน้า
// ตั้งรหัสVerifier
String codeVerifier = "<<codeVerifier>>";

// รับโทเค็นการรีเฟรช
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// รับโทเค็นการเข้าถึง
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// ใช้โทเค็นการเข้าถึงใน API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// ดึงผู้ติดต่อจากกลุ่มเฉพาะ
ContactGroupCollection groups = client.getAllGroups();
GoogleContactGroup group = null;
for (GoogleContactGroup g : groups) {
	if ("TestGroup".equals(g.getTitle())) {
		group = g;
	}
}

// เรียกข้อมูลผู้ติดต่อจากกลุ่ม
if (group != null) {
	Contact[] contacts2 = client.getContactsFromGroup(group.getId());
	for (Contact con : contacts2)
		System.out.println(con.getDisplayName() + "," + con.getEmailAddresses().get_Item(0).toString());
}

รับใบอนุญาต API ฟรี

คุณสามารถรับ ใบอนุญาตชั่วคราวฟรี เพื่อใช้ Aspose.Email for Java โดยไม่มีข้อจำกัดในการประเมิน

บทสรุป

ในบทความนี้ คุณได้เรียนรู้วิธีนำเข้าที่อยู่ติดต่อ Gmail จากบัญชีโดยทางโปรแกรมใน Java นอกจากนี้ คุณได้เห็นวิธีการเข้าถึงผู้ติดต่อจากกลุ่มอีเมลเฉพาะใน Gmail นอกเหนือจากนั้น คุณสามารถสำรวจ เอกสารประกอบ เพื่ออ่านเพิ่มเติมเกี่ยวกับ Aspose.Email for Java นอกจากนี้ คุณสามารถถามคำถามผ่าน ฟอรัม ของเรา

ดูสิ่งนี้ด้วย