Read Google Gmail Messages
Updated: Aug 28, 2026
package com.northconcepts.datapipeline.examples.google.gmail;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.List;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.GmailScopes;
import com.northconcepts.datapipeline.core.DataReader;
import com.northconcepts.datapipeline.core.DataWriter;
import com.northconcepts.datapipeline.core.LimitReader;
import com.northconcepts.datapipeline.core.StreamWriter;
import com.northconcepts.datapipeline.google.gmail.GmailMessageReader;
import com.northconcepts.datapipeline.job.Job;
/**
*
* CLIENT_SECRET is your OAuth2 client ID created in the Google Developer Console.
* http://localhost:8888/Callback needs to be added as an authorized redirect URIs
* where 8888 is the port number set in line 53.
*/
public class ReadGmailMessages {
private static final int MESSAGE_COUNT = 10;
private static final int BATCH_SIZE = 10;
private static final String CLIENT_SECRET = "/integrations.json";
private static final String APPLICATION_NAME = "GmailClient";
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens/gmail";
private static final List SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY);
/** Authorizes the installed application to access user's protected data. */
private static Credential authorize(NetHttpTransport httpTransport) throws Throwable {
// load client secrets
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
new InputStreamReader(ReadGmailMessages.class.getResourceAsStream(CLIENT_SECRET)));
// set up authorization code flow
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
// authorize
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
public static void main(String[] args) throws Throwable {
NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
DataReader reader = new GmailMessageReader(authorize(httpTransport), httpTransport)
.setBatchSize(BATCH_SIZE)
.setApplicationName(APPLICATION_NAME);
reader = new LimitReader(reader, MESSAGE_COUNT);
DataWriter writer = StreamWriter.newSystemOutWriter();
Job.run(reader, writer);
}
}
