Gmail Kişisini Java'da Programlı Olarak İçe Aktarın

Google’ın Gmail en popüler ve yaygın olarak kullanılan e-posta hizmetleri arasındadır. Gmail, yalnızca e-posta gönderip almanın yanı sıra, takvimler, sohbetler vb. Bunu başarmak için bu makale, Java kullanarak Gmail kişilerini nasıl içe aktaracağınızı gösterir. Ayrıca, belirli bir e-posta grubundaki kişilere nasıl erişileceğini de ele alacağız.

Gmail Kişilerini İçe Aktarmak için Java API

Aspose.Email for Java, e-posta istemci uygulamaları oluşturmak için güçlü bir API’dir. Ayrıca, kişilere, takvimlere, randevulara vb. erişim gibi Gmail ile çalışmayı destekler. Bu API’yi Gmail hesaplarından kişilere erişmek ve bu hesaplardan içe aktarmak için kullanacağız. API’yi indirebilir veya aşağıdaki Maven yapılandırmalarını kullanarak yükleyebilirsiniz.

Depo:

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

Bağımlılık:

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

Kişileri Java’daki Gmail’den içe aktarın

Başlamadan önce, Google Developer Console’da kodu çalıştırmanıza izin verecek bir proje oluşturmanız gerekir. Bir tane oluşturmak için [bu kılavuzu] takip edebilirsiniz]4.

Şimdi, bir Gmail hesabının kimlik doğrulamasıyla ilgilenmek için GoogleOAuthHelper adlı bir yardımcı sınıf oluşturun. Ayrıca, kullanıcı bilgilerini depolamak için OAuthUser adlı bir sınıf oluşturun. Aşağıdakiler, her iki sınıfın da tam uygulamasıdır.

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>
 * Geliştirici konsolu https://console.developers.google.com/projectselector/apis/credentials?pli=1 
 * Belgeler 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) {
            // aldırmamak
        }
        return result.toString();
    }
}

Bir Gmail Hesabından Kişileri İçe Aktarın

Java’daki bir Gmail hesabından kişileri içe aktarma adımları aşağıda verilmiştir.

  • OAuthUser sınıfından bir nesne oluşturun ve e-posta, müşteri kimliği ve müşteri sırrı ile başlatın.
  • Yetkilendirme kodunu ve kod doğrulayıcıyı saklamak için iki dize nesnesi oluşturun.
  • Yenileme belirtecini ve erişim belirtecini alın.
  • GmailClient.getInstance(String, String) yöntemini kullanarak GmailClient sınıfının bir örneğini bir IGmailClient nesnesine alın.
  • IGmailClient.getAllContacts() yöntemini kullanarak kişileri bir diziye okuyun.
  • Her bir kişiye erişmek için dizi boyunca döngü yapın.

Aşağıdaki kod örneği, Java’daki bir hesaptan Gmail kişilerinin nasıl içe aktarılacağını gösterir.

OAuthUser user = new OAuthUser();

// clientId, clientSecret ve e-postayı ayarlayın 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// AuthorizationCode'u, oluşturulan AuthorizationCodeUrl ile manuel olarak almanız gerekir.
// Yetkilendirme kodunu ayarla
String authorizationCode = "<<authCode>>";

// Kod Doğrulayıcıyı önceki adım çıktısından kopyala
// codeVerifier'ı ayarla
String codeVerifier = "<<codeVerifier>>";

// Yenileme Simgesini Alın
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Erişim izni almak
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// API'de Erişim Simgesini Kullanın
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));

Bir Gruptan Gmail Kişilerini İçe Aktarın

Aşağıdaki adımları izleyerek Gmail’de belirli bir e-posta grubundaki kişilere de erişebilirsiniz.

  • IGmailClient’i başlatmak için önceki bölümde belirtilen adımları izleyin.
  • Grupları bir ContactGroupCollection nesnesine almak için IGmailClient.getAllGroups() öğesini çağırın.
  • Gerekli grupları başlığa göre filtreleyin.
  • IGmailClient.getContactsFromGroup(String) yöntemini kullanarak bir gruptaki kişilere erişin.
  • Her bir kişiye erişmek için dizi boyunca döngü yapın.

Aşağıdaki kod örneği, Java’daki belirli bir Gmail grubundan kişilerin nasıl içe aktarılacağını gösterir.

OAuthUser user = new OAuthUser();

// clientId, clientSecret ve e-postayı ayarlayın 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// AuthorizationCode'u, oluşturulan AuthorizationCodeUrl ile manuel olarak almanız gerekir.
// Yetkilendirme kodunu ayarla
String authorizationCode = "<<authCode>>";

// Kod Doğrulayıcıyı önceki adım çıktısından kopyala
// codeVerifier'ı ayarla
String codeVerifier = "<<codeVerifier>>";

// Yenileme Simgesini Alın
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// Erişim izni almak
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// API'de Erişim Simgesini Kullanın
IGmailClient client = GmailClient.getInstance(accessToken, user.email);

// Kişileri belirli bir gruptan getir
ContactGroupCollection groups = client.getAllGroups();
GoogleContactGroup group = null;
for (GoogleContactGroup g : groups) {
	if ("TestGroup".equals(g.getTitle())) {
		group = g;
	}
}

// Gruptan kişileri al
if (group != null) {
	Contact[] contacts2 = client.getContactsFromGroup(group.getId());
	for (Contact con : contacts2)
		System.out.println(con.getDisplayName() + "," + con.getEmailAddresses().get_Item(0).toString());
}

Ücretsiz API Lisansı Alın

Aspose.Email for Java’yı değerlendirme sınırlamaları olmadan kullanmak için ücretsiz geçici lisans alabilirsiniz.

Çözüm

Bu makalede, Java’da bir hesaptan programlı olarak Gmail kişilerini nasıl içe aktaracağınızı öğrendiniz. Ayrıca, Gmail’de belirli bir e-posta grubundaki kişilere nasıl erişileceğini gördünüz. Bunun dışında Aspose.Email for Java hakkında daha fazlasını okumak için belgeleri inceleyebilirsiniz. Ayrıca forumumuz aracılığıyla da sorularınızı sorabilirsiniz.

Ayrıca bakınız