Gmail es una de las aplicaciones en línea más utilizadas para enviar y recibir correos electrónicos. Además, permite trabajar con calendarios, contactos, chats, etc., y proporciona varios otros servicios de colaboración. Recientemente, en un artículo, hemos cubierto cómo importar contactos desde una cuenta de Gmail. Hoy aprenderá cómo crear, actualizar y eliminar contactos en una cuenta de Gmail usando Java.
- API de Java para administrar contactos de Gmail
- Crear un contacto en Gmail
- Actualizar un contacto en Gmail
- Eliminar un contacto en Gmail
API de Java para crear, actualizar y eliminar contactos de Gmail
Para crear y manipular contactos en una cuenta de Gmail, usaremos Aspose.Email for Java. Es una API rica en funciones que le permite crear y enviar correos electrónicos y trabajar con clientes de correo electrónico populares. Puede descargar la API o instalarla usando las siguientes configuraciones de Maven.
Repositorio:
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>http://repository.aspose.com/repo/</url>
</repository>
Dependencia:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-email</artifactId>
<version>22.3</version>
<classifier>jdk16</classifier>
</dependency>
Después de instalar la API, debe crear un proyecto en Google Developer Console, que le permitirá comunicarse con Gmail. Para crear uno, puede seguir esta guía.
Ahora, cree una clase auxiliar llamada GoogleOAuthHelper para encargarse de la autenticación de una cuenta de Gmail. Además, cree una clase denominada OAuthUser para almacenar la información del usuario. La siguiente es la implementación completa de ambas clases.
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>
* Consola de desarrolladores https://console.developers.google.com/projectselector/apis/credentials?pli=1
* Documentación 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) {
// pasar por alto
}
return result.toString();
}
}
Crear un contacto en Gmail en Java
Los siguientes son los pasos para crear un contacto en Gmail en Java.
- Primero, cree un usuario de Google, obtenga un token de acceso e inicialice un objeto IGmailClient.
- Luego, crea un objeto de la clase Contacto.
- Establecer propiedades del contacto como nombre, prefijo, profesión, etc.
- Para configurar la dirección postal, cree una instancia de PostalAddress y configure sus propiedades.
- Agregue la dirección recién creada a la colección usando el método Contact.getPhysicalAddresses().add(PostalAddress).
- Configure los detalles del número de teléfono usando la clase PhoneNumber.
- Agregue los detalles del número de teléfono a la colección usando el método Contact.getPhoneNumbers().add(PhoneNumber).
- Cree una instancia de la clase EmailAddress, configure la dirección de correo electrónico y asígnela al contacto.
- Finalmente, llame al método IGmailClient.createContact(Contact) para crear un contacto de Gmail.
El siguiente ejemplo de código muestra cómo crear un contacto en Gmail en Java.
OAuthUser user = new OAuthUser();
// Establezca clientId, clientSecret y correo electrónico
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";
// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";
// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Usar token de acceso en la API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Crear un contacto
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");
// Establecer dirección postal
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);
// Establecer número de teléfono
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);
// Establecer otros detalles
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");
// Establecer dirección de correo electrónico
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);
// Crear contacto
String contactUri = client.createContact(contact);
Actualizar un contacto en Gmail en Java
También puede actualizar los detalles de un contacto de Gmail después de acceder a él. Los siguientes son los pasos para actualizar un contacto en una cuenta de Gmail en Java.
- Primero, cree un usuario de Google, obtenga un token de acceso e inicialice un objeto IGmailClient.
- Luego, obtenga los contactos en una matriz usando el método IGmailClient.getAllContacts().
- Después de eso, obtenga el contacto requerido de la matriz en un objeto Contacto.
- Finalmente, actualice los detalles del contacto y llame al método IGmailClient.updateContact(contact).
El siguiente ejemplo de código muestra cómo actualizar un contacto en Gmail en Java.
OAuthUser user = new OAuthUser();
// Establezca clientId, clientSecret y correo electrónico
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";
// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";
// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Usar token de acceso en la API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Obtener todos los contactos
Contact[] contacts = client.getAllContacts();
// Obtener uno requerido
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");
// Actualizar contacto
client.updateContact(contact);
Eliminar un contacto en Gmail en Java
Finalmente, veamos cómo eliminar un contacto de Gmail usando Java. Los siguientes son los pasos para realizar esta operación.
- Primero, cree un usuario de Google, obtenga un token de acceso e inicialice un objeto IGmailClient.
- Luego, obtenga contactos en una matriz usando el método IGmailClient.getAllContacts().
- Filtre el contacto deseado de la matriz en un objeto Contacto.
- Finalmente, llame al método IGmailClient.deleteContact(Contact.Id.GoogleId) para eliminar el contacto.
El siguiente ejemplo de código muestra cómo eliminar un contacto en Gmail en Java.
OAuthUser user = new OAuthUser();
// Establezca clientId, clientSecret y correo electrónico
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Debe recuperar AuthorizationCode manualmente con AuthorizationCodeUrl generado
// Establecer código de autorización
String authorizationCode = "<<authCode>>";
// Copie Code Verifier de la salida del paso anterior
// Establecer códigoVerificador
String codeVerifier = "<<codeVerifier>>";
// Obtener token de actualización
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Obtener token de acceso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Usar token de acceso en la API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Obtener todos los contactos
Contact[] contacts = client.getAllContacts();
// Obtener uno requerido
Contact contact = contacts[0];
// Borrar contacto
client.deleteContact(contact.getId().getGoogleId());
Obtenga una licencia de API gratuita
Puede usar Aspose.Email for Java sin limitaciones de evaluación usando una licencia temporal gratuita.
Conclusión
En este artículo, ha aprendido cómo crear y actualizar contactos en una cuenta de Gmail en Java. Además, ha visto cómo eliminar un contacto de Gmail mediante programación. Además, puede visitar la documentación para explorar otras funciones de Aspose.Email for Java. En caso de que tenga alguna pregunta, puede publicarla en nuestro foro.