Gmail é um dos aplicativos online mais usados para enviar e receber e-mails. Além disso, permite trabalhar com calendários, contatos, chats, etc., e oferece vários outros serviços de colaboração. Recentemente, em um artigo, abordamos como importar contatos de uma conta do Gmail. Hoje, você aprenderá como criar, atualizar e excluir contatos em uma conta do Gmail usando Java.
- API Java para gerenciar contatos do Gmail
- Criar um contato no Gmail
- Atualizar um contato no Gmail
- Excluir um contato no Gmail
API Java para criar, atualizar e excluir contatos do Gmail
Para criar e manipular contatos em uma conta do Gmail, usaremos Aspose.Email for Java. É uma API rica em recursos que permite criar e enviar e-mails e trabalhar com clientes de e-mail populares. Você pode baixar a API ou instalá-la usando as seguintes configurações do Maven.
Repositório:
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>http://repository.aspose.com/repo/</url>
</repository>
Dependência:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-email</artifactId>
<version>22.3</version>
<classifier>jdk16</classifier>
</dependency>
Depois de instalar a API, você precisa criar um projeto no Google Developer Console, que permitirá a comunicação com o Gmail. Para criar um, você pode seguir este guia.
Agora, crie uma classe auxiliar chamada GoogleOAuthHelper para cuidar da autenticação de uma conta do Gmail. Além disso, crie uma classe chamada OAuthUser para armazenar informações do usuário. A seguir está a implementação completa de ambas as classes.
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>
* Console de desenvolvedores https://console.developers.google.com/projectselector/apis/credentials?pli=1
* Documentação 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) {
// ignorar
}
return result.toString();
}
}
Criar um contato no Gmail em Java
A seguir estão as etapas para criar um contato no Gmail em Java.
- Primeiro, crie um usuário do Google, obtenha um token de acesso e inicialize um objeto IGmailClient.
- Em seguida, crie um objeto da classe Contact.
- Defina as propriedades do contato, como nome, prefixo, profissão, etc.
- Para definir o endereço postal, crie uma instância de PostalAddress e defina suas propriedades.
- Adicione o endereço recém-criado à coleção usando o método Contact.getPhysicalAddresses().add(PostalAddress).
- Defina os detalhes do número de telefone usando a classe PhoneNumber.
- Adicione detalhes do número de telefone à coleção usando o método Contact.getPhoneNumbers().add(PhoneNumber).
- Crie uma instância da classe EmailAddress, defina o endereço de e-mail e atribua-o ao contato.
- Por fim, chame o método IGmailClient.createContact(Contact) para criar um contato do Gmail.
O exemplo de código a seguir mostra como criar um contato no Gmail em Java.
OAuthUser user = new OAuthUser();
// Definir clientId, clientSecret e email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Você precisa recuperar AuthorizationCode manualmente com AuthorizationCodeUrl gerado
// Definir código de autorização
String authorizationCode = "<<authCode>>";
// Copie o verificador de código da saída da etapa anterior
// Definir codeVerifier
String codeVerifier = "<<codeVerifier>>";
// Obter token de atualização
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Obter token de acesso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Usar token de acesso na API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Criar um contato
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");
// Definir endereço 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);
// Definir número de telefone
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);
// Definir outros detalhes
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");
// Definir endereço de e-mail
EmailAddress eAddress = new EmailAddress();
eAddress.setAddress("email@gmail.com");
contact.getEmailAddresses().add(eAddress);
// Criar contato
String contactUri = client.createContact(contact);
Atualizar um contato no Gmail em Java
Você também pode atualizar os detalhes de um contato do Gmail após acessá-lo. A seguir estão as etapas para atualizar um contato em uma conta do Gmail em Java.
- Primeiro, crie um usuário do Google, obtenha um token de acesso e inicialize um objeto IGmailClient.
- Em seguida, obtenha os contatos em uma matriz usando o método IGmailClient.getAllContacts().
- Depois disso, busque o contato necessário do array em um objeto Contact.
- Por fim, atualize os detalhes do contato e chame o método IGmailClient.updateContact(contact).
O exemplo de código a seguir mostra como atualizar um contato no Gmail em Java.
OAuthUser user = new OAuthUser();
// Definir clientId, clientSecret e email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Você precisa recuperar AuthorizationCode manualmente com AuthorizationCodeUrl gerado
// Definir código de autorização
String authorizationCode = "<<authCode>>";
// Copie o verificador de código da saída da etapa anterior
// Definir codeVerifier
String codeVerifier = "<<codeVerifier>>";
// Obter token de atualização
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Obter token de acesso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Usar token de acesso na API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Obter todos os contatos
Contact[] contacts = client.getAllContacts();
// Buscar um necessário
Contact contact = contacts[0];
contact.setJobTitle("Manager IT");
contact.setDepartmentName("Customer Support");
contact.setCompanyName("Aspose");
contact.setProfession("Software Developer");
// Atualizar contato
client.updateContact(contact);
Excluir um contato no Gmail em Java
Por fim, vamos ver como excluir um contato do Gmail usando Java. A seguir estão as etapas para realizar esta operação.
- Primeiro, crie um usuário do Google, obtenha um token de acesso e inicialize um objeto IGmailClient.
- Em seguida, obtenha os contatos em uma matriz usando o método IGmailClient.getAllContacts().
- Filtre o contato desejado do array em um objeto Contact.
- Por fim, chame o método IGmailClient.deleteContact(Contact.Id.GoogleId) para excluir o contato.
O exemplo de código a seguir mostra como excluir um contato no Gmail em Java.
OAuthUser user = new OAuthUser();
// Definir clientId, clientSecret e email
user.clientId = "<<clientID>>";
user.clientSecret = "<<clientSecret>>";
user.email = "<<email>>";
// Você precisa recuperar AuthorizationCode manualmente com AuthorizationCodeUrl gerado
// Definir código de autorização
String authorizationCode = "<<authCode>>";
// Copie o verificador de código da saída da etapa anterior
// Definir codeVerifier
String codeVerifier = "<<codeVerifier>>";
// Obter token de atualização
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user);
user.refreshToken = refreshToken;
// Obter token de acesso
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user);
// Usar token de acesso na API
IGmailClient client = GmailClient.getInstance(accessToken, user.email);
// Obter todos os contatos
Contact[] contacts = client.getAllContacts();
// Buscar um necessário
Contact contact = contacts[0];
// Excluir contato
client.deleteContact(contact.getId().getGoogleId());
Obtenha uma licença de API gratuita
Você pode usar o Aspose.Email para Java sem limitações de avaliação usando uma licença temporária gratuita.
Conclusão
Neste artigo, você aprendeu como criar e atualizar contatos em uma conta do Gmail em Java. Além disso, você viu como excluir um contato do Gmail programaticamente. Além disso, você pode visitar a documentação para explorar outros recursos do Aspose.Email para Java. Caso você tenha alguma dúvida, você pode postar em nosso fórum.