![使用 Java 在 Gmail 中創建、更新和刪除聯繫人](images/Create-Update-and-Delete-Gmail-Contacts.png#center)
Gmail 是發送和接收電子郵件的常用在線應用程序之一。此外,它還允許處理日曆、聯繫人、聊天等,並提供各種其他協作服務。最近,在 一篇文章 中,我們介紹瞭如何從 Gmail 帳戶導入聯繫人。今天,您將學習如何使用 Java 在 Gmail 帳戶中創建、更新和刪除聯繫人。
用於創建、更新和刪除 Gmail 聯繫人的 Java API
要在 Gmail 帳戶中創建和操作聯繫人,我們將使用 Aspose.Email for Java。它是一個功能豐富的 API,可讓您創建和發送電子郵件以及使用流行的電子郵件客戶端。您可以 下載 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.3</version>
<classifier>jdk16</classifier>
</dependency>
安裝 API 後,您需要在 Google Developer Console 上創建一個項目,這將允許您與 Gmail 進行通信。要創建一個,您可以遵循 本指南。
現在,創建一個名為 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();
}
}
用 Java 在 Gmail 上創建聯繫人
以下是使用 Java 在 Gmail 上創建聯繫人的步驟。
- 首先,創建一個 Google 用戶,獲取訪問令牌,並初始化一個 IGmailClient 對象。
- 然後,創建 Contact 類的對象。
- 設置聯繫人的屬性,例如姓名、前綴、職業等。
- 要設置郵政地址,請創建 PostalAddress 的實例並設置其屬性。
- 使用 Contact.getPhysicalAddresses().add(PostalAddress) 方法將新創建的地址添加到集合中。
- 使用 PhoneNumber 類設置電話號碼詳細信息。
- 使用 Contact.getPhoneNumbers().add(PhoneNumber) 方法將電話號碼詳細信息添加到集合中。
- 創建 EmailAddress 類的實例,設置電子郵件地址,並將其分配給聯繫人。
- 最後調用IGmailClient.createContact(Contact)方法創建Gmail聯繫人。
以下代碼示例顯示瞭如何使用 Java 在 Gmail 上創建聯繫人。
OAuthUser user = new OAuthUser();
// 設置clientId、clientSecret和email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// 您必須使用生成的 AuthorizationCodeUrl 手動檢索 AuthorizationCode
// 設置授權碼
String authorizationCode = "<<authCode>>";
// 從上一步輸出複制代碼驗證器
// 設置代碼驗證器
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 contact = new Contact();
contact.setPrefix("Prefix");
contact.setGivenName("GivenName");
contact.setSurname("Surname");
contact.setMiddleName("MiddleName");
contact.setDisplayName("DisplayName");
contact.setSuffix("Suffix");
contact.setJobTitle("JobTitle");
contact.setDepartmentName("DepartmentName");
contact.setCompanyName("CompanyName");
contact.setProfession("Profession");
contact.setNotes("Notes");
// 設置郵寄地址
PostalAddress address = new PostalAddress();
address.setCategory(PostalAddressCategory.getWork());
address.setAddress("Address");
address.setStreet("Street");
address.setPostOfficeBox("PostOfficeBox");
address.setCity("City");
address.setStateOrProvince("StateOrProvince");
address.setPostalCode("PostalCode");
address.setCountry("Country");
contact.getPhysicalAddresses().add(address);
// 設置電話號碼
PhoneNumber pnWork = new PhoneNumber();
pnWork.setNumber("323423423423");
pnWork.setCategory(PhoneNumberCategory.getWork());
contact.getPhoneNumbers().add(pnWork);
PhoneNumber pnHome = new PhoneNumber();
pnHome.setNumber("323423423423");
pnHome.setCategory(PhoneNumberCategory.getHome());
contact.getPhoneNumbers().add(pnHome);
PhoneNumber pnMobile = new PhoneNumber();
pnMobile.setNumber("323423423423");
pnMobile.setCategory(PhoneNumberCategory.getMobile());
contact.getPhoneNumbers().add(pnMobile);
// 設置其他細節
contact.getUrls().setBlog("Blog.com");
contact.getUrls().setBusinessHomePage("BusinessHomePage.com");
contact.getUrls().setHomePage("HomePage.com");
contact.getUrls().setProfile("Profile.com");
contact.getEvents().setBirthday(new Date());
contact.getEvents().setAnniversary(new Date());
contact.getInstantMessengers().setAIM("AIM");
contact.getInstantMessengers().setGoogleTalk("GoogleTalk");
contact.getInstantMessengers().setICQ("ICQ");
contact.getInstantMessengers().setJabber("Jabber");
contact.getInstantMessengers().setMSN("MSN");
contact.getInstantMessengers().setQQ("QQ");
contact.getInstantMessengers().setSkype("Skype");
contact.getInstantMessengers().setYahoo("Yahoo");
contact.getAssociatedPersons().setSpouse("Spouse");
contact.getAssociatedPersons().setSister("Sister");
contact.getAssociatedPersons().setRelative("Relative");
contact.getAssociatedPersons().setReferredBy("ReferredBy");
contact.getAssociatedPersons().setPartner("Partner");
contact.getAssociatedPersons().setParent("Parent");
contact.getAssociatedPersons().setMother("Mother");
contact.getAssociatedPersons().setManager("Manager");
// 設置電子郵件地址
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);
// 創建聯繫人
String contactUri = client.createContact(contact);
在 Java 中更新 Gmail 上的聯繫人
您還可以在訪問後更新 Gmail 聯繫人的詳細信息。以下是使用 Java 更新 Gmail 帳戶中的聯繫人的步驟。
- 首先,創建一個 Google 用戶,獲取訪問令牌,並初始化一個 IGmailClient 對象。
- 然後,使用 IGmailClient.getAllContacts() 方法獲取數組中的聯繫人。
- 之後,從 Contact 對像中的數組中獲取所需的聯繫人。
- 最後更新聯繫人詳情,調用IGmailClient.updateContact(contact)方法。
以下代碼示例顯示瞭如何使用 Java 更新 Gmail 中的聯繫人。
OAuthUser user = new OAuthUser();
// 設置clientId、clientSecret和email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// 您必須使用生成的 AuthorizationCodeUrl 手動檢索 AuthorizationCode
// 設置授權碼
String authorizationCode = "<<authCode>>";
// 從上一步輸出複制代碼驗證器
// 設置代碼驗證器
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();
// 獲取所需的一個
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");
// 更新聯繫人
client.updateContact(contact);
在 Java 中刪除 Gmail 上的聯繫人
最後,讓我們看看如何使用 Java 刪除 Gmail 聯繫人。以下是執行此操作的步驟。
- 首先,創建一個 Google 用戶,獲取訪問令牌,並初始化一個 IGmailClient 對象。
- 然後,使用 IGmailClient.getAllContacts() 方法獲取數組中的聯繫人。
- 從 Contact 對象的數組中過濾所需的聯繫人。
- 最後調用IGmailClient.deleteContact(Contact.Id.GoogleId)方法刪除聯繫人。
以下代碼示例顯示瞭如何使用 Java 刪除 Gmail 上的聯繫人。
OAuthUser user = new OAuthUser();
// 設置clientId、clientSecret和email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// 您必須使用生成的 AuthorizationCodeUrl 手動檢索 AuthorizationCode
// 設置授權碼
String authorizationCode = "<<authCode>>";
// 從上一步輸出複制代碼驗證器
// 設置代碼驗證器
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();
// 獲取所需的一個
Contact contact = contacts[0];
// 刪除聯繫人
client.deleteContact(contact.getId().getGoogleId());
獲取免費的 API 許可證
你可以使用 Aspose.Email for Java,沒有評估限制,使用免費臨時許可證。
結論
在本文中,您學習瞭如何使用 Java 在 Gmail 帳戶中創建和更新聯繫人。此外,您還了解瞭如何以編程方式刪除 Gmail 聯繫人。此外,您可以訪問文檔來探索Aspose.Email for Java的其他特性。如果您有任何問題,可以發帖到我們的論壇。