Gmail là một trong những ứng dụng trực tuyến thường được sử dụng để gửi và nhận email. Ngoài ra, nó cho phép làm việc với lịch, danh bạ, trò chuyện, v.v. và cung cấp nhiều dịch vụ cộng tác khác. Gần đây, trong một bài báo, chúng tôi đã đề cập đến cách nhập danh bạ từ tài khoản Gmail. Hôm nay, bạn sẽ học cách tạo, cập nhật và xóa danh bạ trong tài khoản Gmail bằng Java.
- API Java để quản lý danh bạ Gmail
- Tạo một liên hệ trên Gmail
- Cập nhật địa chỉ liên hệ trên Gmail
- Xóa địa chỉ liên hệ trên Gmail
API Java để tạo, cập nhật và xóa danh bạ Gmail
Để tạo và thao tác với danh bạ trong tài khoản Gmail, chúng tôi sẽ sử dụng Aspose.Email for Java. Đây là một API giàu tính năng cho phép bạn tạo và gửi email cũng như làm việc với các ứng dụng email phổ biến. Bạn có thể tải xuống API hoặc cài đặt nó bằng cách sử dụng các cấu hình Maven sau.
Kho:
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>http://repository.aspose.com/repo/</url>
</repository>
Sự phụ thuộc:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-email</artifactId>
<version>22.3</version>
<classifier>jdk16</classifier>
</dependency>
Sau khi cài đặt API, bạn cần tạo một dự án trên Bảng điều khiển dành cho nhà phát triển của Google, dự án này sẽ cho phép bạn giao tiếp với Gmail. Để tạo một tài khoản, bạn có thể làm theo hướng dẫn này.
Bây giờ, hãy tạo một lớp trợ giúp có tên là GoogleOAuthHelper để đảm nhận việc xác thực tài khoản Gmail. Ngoài ra, hãy tạo một lớp có tên OAuthUser để lưu trữ thông tin người dùng. Sau đây là cách thực hiện đầy đủ của cả hai lớp.
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>
* Bảng điều khiển dành cho nhà phát triển https://console.developers.google.com/projectselector/apis/credentials?pli=1
* Tài liệu 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) {
// phớt lờ
}
return result.toString();
}
}
Tạo Liên hệ trên Gmail trong Java
Sau đây là các bước tạo liên hệ trên Gmail bằng Java.
- Đầu tiên, tạo người dùng Google, nhận mã thông báo truy cập và khởi tạo đối tượng IGmailClient.
- Sau đó, tạo một đối tượng của lớp Liên hệ.
- Đặt các thuộc tính của liên hệ như tên, tiền tố, nghề nghiệp, v.v.
- Để đặt địa chỉ bưu điện, hãy tạo một phiên bản của PostalAddress và đặt các thuộc tính của nó.
- Thêm địa chỉ mới tạo vào bộ sưu tập bằng phương thức Contact.getPhysicalAddresses(). Add (PostalAddress).
- Đặt chi tiết số điện thoại bằng lớp PhoneNumber.
- Thêm chi tiết số điện thoại vào bộ sưu tập bằng phương pháp Contact.getPhoneNumbers(). Add (PhoneNumber).
- Tạo một phiên bản của lớp EmailAddress, đặt địa chỉ email và gán cho địa chỉ liên hệ.
- Cuối cùng, gọi phương thức IGmailClient.createContact (Liên hệ) để tạo liên hệ Gmail.
Mẫu mã sau đây cho biết cách tạo liên hệ trên Gmail bằng Java.
OAuthUser user = new OAuthUser();
// Đặt clientId, clientSecret và email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";
// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";
// Nhận mã làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Sử dụng Mã thông báo truy cập trong API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Tạo một liên hệ
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");
// Đặt địa chỉ bưu điện
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);
// Đặt số điện thoại
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);
// Đặt các chi tiết khác
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");
// Đặt địa chỉ email
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);
// Tạo ra liên lạc
String contactUri = client.createContact(contact);
Cập nhật Địa chỉ liên hệ trên Gmail bằng Java
Bạn cũng có thể cập nhật thông tin chi tiết của một địa chỉ liên hệ Gmail sau khi truy cập nó. Sau đây là các bước để cập nhật địa chỉ liên hệ trong tài khoản Gmail bằng Java.
- Đầu tiên, tạo người dùng Google, nhận mã thông báo truy cập và khởi tạo đối tượng IGmailClient.
- Sau đó, lấy các liên hệ trong một mảng bằng phương thức IGmailClient.getAllContacts().
- Sau đó, tìm nạp liên hệ cần thiết từ mảng trong đối tượng Liên hệ.
- Cuối cùng, cập nhật chi tiết liên hệ và gọi phương thức IGmailClient.updateContact (contact).
Mẫu mã sau đây cho biết cách cập nhật địa chỉ liên hệ trong Gmail bằng Java.
OAuthUser user = new OAuthUser();
// Đặt clientId, clientSecret và email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";
// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";
// Nhận mã làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Sử dụng Mã thông báo truy cập trong API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Nhận tất cả các địa chỉ liên hệ
Contact[] contacts = client.getAllContacts();
// Tìm nạp một yêu cầu
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");
// Cập nhật liên hệ
client.updateContact(contact);
Xóa địa chỉ liên hệ trên Gmail trong Java
Cuối cùng, hãy xem cách xóa liên hệ Gmail bằng Java. Sau đây là các bước để thực hiện thao tác này.
- Đầu tiên, tạo người dùng Google, nhận mã thông báo truy cập và khởi tạo đối tượng IGmailClient.
- Sau đó, lấy các liên hệ trong một mảng bằng phương thức IGmailClient.getAllContacts().
- Lọc liên hệ mong muốn khỏi mảng trong đối tượng Liên hệ.
- Cuối cùng, gọi phương thức IGmailClient.deleteContact (Contact.Id.GoogleId) để xóa địa chỉ liên hệ.
Mẫu mã sau đây cho biết cách xóa địa chỉ liên hệ trên Gmail bằng Java.
OAuthUser user = new OAuthUser();
// Đặt clientId, clientSecret và email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Bạn phải truy xuất AuthorizationCode theo cách thủ công với AuthorizationCodeUrl đã tạo
// Đặt mã ủy quyền
String authorizationCode = "<<authCode>>";
// Sao chép Trình xác minh mã từ đầu ra của bước trước
// Đặt codeVerifier
String codeVerifier = "<<codeVerifier>>";
// Nhận mã làm mới
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Nhận mã thông báo truy cập
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Sử dụng Mã thông báo truy cập trong API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Nhận tất cả các địa chỉ liên hệ
Contact[] contacts = client.getAllContacts();
// Tìm nạp một yêu cầu
Contact contact = contacts[0];
// Xóa liên lạc
client.deleteContact(contact.getId().getGoogleId());
Nhận giấy phép API miễn phí
Bạn có thể sử dụng Aspose.Email for Java mà không bị giới hạn đánh giá bằng cách sử dụng giấy phép tạm thời miễn phí.
Sự kết luận
Trong bài này, bạn đã học cách tạo và cập nhật danh bạ trong tài khoản Gmail bằng Java. Hơn nữa, bạn đã thấy cách xóa địa chỉ liên hệ Gmail theo chương trình. Bên cạnh đó, bạn có thể truy cập tài liệu để khám phá các tính năng khác của Aspose.Email dành cho Java. Trong trường hợp bạn có bất kỳ câu hỏi nào, bạn có thể đăng lên diễn đàn của chúng tôi.