Google 的 Gmail 是最受欢迎和最常用的电子邮件服务之一。除了发送和接收电子邮件之外,Gmail 还提供了一系列功能,例如日历、聊天等。在某些情况下,您可能需要连接到 Gmail 并从应用程序中以编程方式导入联系人。为此,本文展示了如何使用 Java 导入 Gmail 联系人。此外,我们将介绍如何访问特定电子邮件组中的联系人。
用于导入 Gmail 联系人的 Java API
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>
在 Java 中从 Gmail 导入联系人
在开始之前,您需要在 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 帐户导入联系人
以下是在 Java 中从 Gmail 帐户导入联系人的步骤。
- 创建 OAuthUser 类的对象并使用电子邮件、客户端 ID 和客户端密码对其进行初始化。
- 创建两个字符串对象来存储授权码和验证码。
- 获取刷新令牌和访问令牌。
- 使用 GmailClient.getInstance(String, String) 方法将 GmailClient 类的实例获取到 IGmailClient 对象中。
- 使用 IGmailClient.getAllContacts() 方法将联系人读入数组。
- 遍历数组以访问每个联系人。
以下代码示例展示了如何从 Java 帐户导入 Gmail 联系人。
OAuthUser user = new OAuthUser();
// 设置clientId、clientSecret和email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// 您必须使用生成的 AuthorizationCodeUrl 手动检索 AuthorizationCode
// 设置授权码
String authorizationCode = "<<authCode>>";
// 从上一步输出中复制代码验证器
// 设置codeVerifier
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) 方法访问组中的联系人。
- 遍历数组以访问每个联系人。
以下代码示例展示了如何从 Java 中的特定 Gmail 组中导入联系人。
OAuthUser user = new OAuthUser();
// 设置clientId、clientSecret和email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// 您必须使用生成的 AuthorizationCodeUrl 手动检索 AuthorizationCode
// 设置授权码
String authorizationCode = "<<authCode>>";
// 从上一步输出中复制代码验证器
// 设置codeVerifier
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,而不受评估限制。
结论
在本文中,您学习了如何使用 Java 以编程方式从帐户导入 Gmail 联系人。此外,您还了解了如何访问 Gmail 中特定电子邮件组的联系人。除此之外,您还可以浏览 文档 以阅读有关 Aspose.Email for Java 的更多信息。此外,您可以通过我们的 论坛 提问。