مخاطب Gmail را به صورت برنامه‌نویسی در جاوا وارد کنید

Gmail گوگل یکی از محبوب‌ترین و پرکاربردترین سرویس‌های ایمیل است. Gmail طیف وسیعی از ویژگی‌ها را همراه با ارسال و دریافت ایمیل‌ها، مانند تقویم، چت و غیره ارائه می‌کند. در موارد خاص، ممکن است لازم باشد به Gmail متصل شوید و مخاطبین را به صورت برنامه‌ریزی از داخل برنامه‌های خود وارد کنید. برای دستیابی به آن، این مقاله نحوه وارد کردن مخاطبین Gmail با استفاده از جاوا را نشان می دهد. همچنین نحوه دسترسی به مخاطبین در یک گروه ایمیل خاص را توضیح خواهیم داد.

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>

وارد کردن مخاطبین از جیمیل در جاوا

قبل از شروع، باید یک پروژه در کنسول برنامه نویس گوگل ایجاد کنید که به شما امکان می دهد کد را اجرا کنید. برای ایجاد یکی، می توانید [این راهنما] را دنبال کنید.

اکنون یک کلاس کمکی به نام GoogleOAuthHelper ایجاد کنید تا از احراز هویت یک حساب جیمیل مراقبت کند. همچنین یک کلاس با نام 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 style=";text-align:right;direction:rtl">
 * کنسول توسعه دهندگان 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();
    }
}

مخاطبین را از یک حساب جیمیل وارد کنید

مراحل زیر برای وارد کردن مخاطبین از یک حساب جیمیل در جاوا آمده است.

  • یک شی از کلاس OAuthUser ایجاد کنید و آن را با ایمیل، شناسه مشتری و رمز مشتری مقداردهی کنید.
  • دو شی رشته برای ذخیره کد مجوز و تأیید کننده کد ایجاد کنید.
  • رمز به‌روزرسانی و رمز دسترسی را دریافت کنید.
  • یک نمونه از کلاس GmailClient را با استفاده از روش GmailClient.getInstance (String, String) در یک شی IGmailClient دریافت کنید.
  • مخاطبین را در یک آرایه با استفاده از روش IGmailClient.getAllContacts() بخوانید.
  • برای دسترسی به هر مخاطب از طریق آرایه حلقه بزنید.

نمونه کد زیر نحوه وارد کردن مخاطبین Gmail را از یک حساب در جاوا نشان می دهد.

OAuthUser user = new OAuthUser();

// clientId، clientSecret و email را تنظیم کنید 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// شما باید AuthorizationCode را به صورت دستی با AuthorizationCodeUrl ایجاد شده بازیابی کنید
// تنظیم کد مجوز
String authorizationCode = "<<authCode>>";

// کد تأیید کننده را از خروجی مرحله قبل کپی کنید
// codeVerifier را تنظیم کنید
String codeVerifier = "<<codeVerifier>>";

// Refresh Token را دریافت کنید
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// رمز دسترسی را دریافت کنید
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// از Access Token در 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) به مخاطبین یک گروه دسترسی پیدا کنید.
  • برای دسترسی به هر مخاطب از طریق آرایه حلقه بزنید.

نمونه کد زیر نحوه وارد کردن مخاطبین از یک گروه خاص جیمیل در جاوا را نشان می دهد.

OAuthUser user = new OAuthUser();

// clientId، clientSecret و email را تنظیم کنید 
user.clientId = "<<clientID>>"; 
user.clientSecret = "<<clientSecret>>"; 
user.email = "<<email>>";

// شما باید AuthorizationCode را به صورت دستی با AuthorizationCodeUrl ایجاد شده بازیابی کنید
// تنظیم کد مجوز
String authorizationCode = "<<authCode>>";

// کد تأیید کننده را از خروجی مرحله قبل کپی کنید
// codeVerifier را تنظیم کنید
String codeVerifier = "<<codeVerifier>>";

// Refresh Token را دریافت کنید
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;

// رمز دسترسی را دریافت کنید
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);

// از Access Token در 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 برای جاوا بدون محدودیت ارزیابی، مجوز موقت رایگان دریافت کنید.

نتیجه

در این مقاله یاد گرفتید که چگونه مخاطبین جیمیل را از یک حساب به صورت برنامه نویسی در جاوا وارد کنید. علاوه بر این، نحوه دسترسی به مخاطبین از یک گروه ایمیل خاص در Gmail را دیده اید. جدای از آن، می‌توانید اسناد را برای مطالعه بیشتر درباره Aspose.Email برای جاوا کاوش کنید. همچنین، می توانید سوالات خود را از طریق [تالار گفتمان] ما بپرسید.

همچنین ببینید