Downloading emails from gmail and save them as .eml files.
You must first follow the steps described here to set up.
Replace content of Quickstart.java with the one below.
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.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.*;
import com.google.api.services.gmail.Gmail;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Quickstart
{
/** Application name. */
private static final String APPLICATION_NAME = "Gmail API Java Quickstart";
/** Directory to store user credentials for this application. */
private static final java.io.File DATA_STORE_DIR = new java.io.File(
System.getProperty("user.home"), ".credentials/gmail-java-quickstart");
/** Global instance of the {@link FileDataStoreFactory}. */
private static FileDataStoreFactory DATA_STORE_FACTORY;
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT;
/** Global instance of the scopes required by this quickstart.
*
* If modifying these scopes, delete your previously saved credentials
* at ~/.credentials/gmail-java-quickstart
*/
private static final List<String> SCOPES = Arrays.asList(GmailScopes.GMAIL_READONLY);
static
{
try
{
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
}
catch (Throwable t)
{
t.printStackTrace();
System.exit(1);
}
}
/**
* Creates an authorized Credential object.
* @return an authorized Credential object.
* @throws IOException
*/
public static Credential authorize() throws IOException
{
// Load client secrets.
InputStream in = Quickstart.class.getResourceAsStream("/client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("offline")
.build();
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
return credential;
}
/**
* Build and return an authorized Gmail client service.
* @return an authorized Gmail client service
* @throws IOException
*/
public static Gmail getGmailService() throws IOException {
Credential credential = authorize();
return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
}
/**The gmail service
*/
private Gmail service;
private String userId;
public Quickstart(Gmail service)
{
this.service = service;
userId = "me";
}
/**
* List all Messages of the user's mailbox with labelIds applied.
* @param labelIds Only return Messages with these labelIds applied.
* @throws IOException
*/
private List<Message> listMessagesWithLabels(String... labelIds) throws IOException
{
ArrayList<String> labelIdsAsList = new ArrayList<String>();
for(String labelId:labelIds)
{
labelIdsAsList.add(labelId);
}
ListMessagesResponse response = service.users().messages().list(userId).setLabelIds(labelIdsAsList).execute();
List<Message> messages = new ArrayList<Message>();
while (response.getMessages() != null)
{
messages.addAll(response.getMessages());
if (response.getNextPageToken() != null)
{
String pageToken = response.getNextPageToken();
response = service.users().messages().list(userId).setLabelIds(labelIdsAsList).setPageToken(pageToken).execute();
}
else
{
break;
}
}
/*for (Message message : messages)
{
System.out.println(message.toPrettyString());
}*/
return messages;
}
/**parse the list of messages and download as .eml
*/
private void parseMessages(List<Message> messages) throws IOException
{
System.out.println("There are "+messages.size()+" messages");
for(int i=0;i<messages.size();i++)
{
String id = messages.get(i).getId();
Message msg = getMessage(id);
String decodedString = new String(msg.decodeRaw());
String filename = "./"+i+".eml";
System.out.print("Saving "+filename+" ... ");
Files.write(Paths.get(filename), decodedString.getBytes());
System.out.println("done!");
}
}
/**
* Get Message with given ID.
*
* @param messageId ID of Message to retrieve.
* @return Message Retrieved Message.
* @throws IOException
*/
public Message getMessage(String messageId) throws IOException
{
//Message message = service.users().messages().get(userId, messageId).execute();
Gmail.Users.Messages.Get messagesGet = service.users().messages().get(userId, messageId);
messagesGet.setFormat("raw");
Message message = messagesGet.execute();
return message;
}
/**@return the list of labels
*/
private List<Label> getLabels() throws IOException
{
// Print the labels in the user's account.
String user = "me";
ListLabelsResponse listResponse = service.users().labels().list(user).execute();
List<Label> labels = listResponse.getLabels();
return labels;
}
public static void main(String[] args)
{
try
{
// Build a new authorized API client service.
Gmail service = getGmailService();
Quickstart qs = new Quickstart(service);
//readLabels(service);
List<Message> messages = qs.listMessagesWithLabels("INBOX");
qs.parseMessages(messages);
}
catch(IOException e)
{
e.printStackTrace();
}
}
}