Java를 사용하여 Gmail에서 연락처 생성, 업데이트 및 삭제

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를 설치한 후 Gmail과 통신할 수 있도록 Google 개발자 콘솔에서 프로젝트를 만들어야 합니다. 생성하려면 이 가이드를 따르세요.

이제 Gmail 계정 인증을 처리하기 위해 GoogleOAuthHelper라는 도우미 클래스를 만듭니다. 또한 사용자 정보를 저장할 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 및 이메일 설정 
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 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 및 이메일 설정 
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();

// 필수 항목 가져오기
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 연락처를 삭제하는 방법을 살펴보겠습니다. 다음은 이 작업을 수행하는 단계입니다.

다음 코드 샘플은 Java에서 Gmail의 연락처를 삭제하는 방법을 보여줍니다.

OAuthUser user = new OAuthUser();

// clientId, clientSecret 및 이메일 설정 
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();

// 필수 항목 가져오기
Contact contact = contacts[0];

// 연락처 삭제
client.deleteContact(contact.getId().getGoogleId());

무료 API 라이선스 받기

무료 임시 라이선스를 사용하여 평가 제한 없이 Java용 Aspose.Email을 사용할 수 있습니다.

결론

이 기사에서는 Java에서 Gmail 계정의 연락처를 만들고 업데이트하는 방법을 배웠습니다. 또한 프로그래밍 방식으로 Gmail 연락처를 삭제하는 방법을 살펴보았습니다. 또한 문서를 방문하여 Java용 Aspose.Email의 다른 기능을 탐색할 수 있습니다. 질문이 있는 경우 포럼에 게시할 수 있습니다.

또한보십시오