embulk-input-gmail 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,142 @@
1
+ package org.embulk.input.gmail;
2
+
3
+ import java.io.IOException;
4
+ import java.nio.file.Paths;
5
+ import java.security.GeneralSecurityException;
6
+ import java.util.ArrayList;
7
+ import java.util.Collections;
8
+ import java.util.HashMap;
9
+ import java.util.List;
10
+ import java.util.Map;
11
+ import java.util.Optional;
12
+
13
+ import com.google.api.client.auth.oauth2.Credential;
14
+ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
15
+ import com.google.api.client.http.javanet.NetHttpTransport;
16
+ import com.google.api.client.json.JsonFactory;
17
+ import com.google.api.client.json.jackson2.JacksonFactory;
18
+ import com.google.api.services.gmail.Gmail;
19
+ import com.google.api.services.gmail.model.ListMessagesResponse;
20
+ import com.google.api.services.gmail.model.Message;
21
+ import com.google.api.services.gmail.model.MessagePart;
22
+ import com.google.api.services.gmail.model.MessagePartHeader;
23
+
24
+ /**
25
+ * GmailWrapper
26
+ */
27
+ public class GmailWrapper {
28
+ private static final String APPLICATION_NAME = "Embulk Input Plugin Gmail";
29
+
30
+ private final Gmail service;
31
+
32
+ /**
33
+ * Constructor
34
+ */
35
+ public GmailWrapper(String clientSecretPath, String tokensDirectory) throws IOException, GeneralSecurityException {
36
+ Credential credential = GoogleCredentialCreator.getCredentials(Paths.get(clientSecretPath), tokensDirectory);
37
+ NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
38
+ JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
39
+
40
+ this.service = new Gmail.Builder(transport, jsonFactory, credential)
41
+ .setApplicationName(APPLICATION_NAME).build();
42
+ }
43
+
44
+ public Result search(String user, String query) throws IOException {
45
+ ListMessagesResponse listResponse = service.users().messages().list(user).setQ(query).execute();
46
+ List<com.google.api.services.gmail.model.Message> messages = listResponse.getMessages();
47
+
48
+ if(messages == null || messages.isEmpty()) {
49
+ return new Result(
50
+ Collections.emptyList(),
51
+ Collections.emptyList());
52
+ }
53
+
54
+ List<GmailWrapper.Message> success = new ArrayList<>();
55
+ List<GmailWrapper.Message> failed = new ArrayList<>();
56
+ for (com.google.api.services.gmail.model.Message message : messages) {
57
+ // get full message.
58
+ com.google.api.services.gmail.model.Message fullMessage = service.users().messages().get(user, message.getId()).execute();
59
+
60
+ // get Payload.
61
+ MessagePart payload = fullMessage.getPayload();
62
+
63
+ // put Headers.
64
+ Map<String, String> headers = new HashMap<>();
65
+ for (MessagePartHeader header : payload.getHeaders()) {
66
+ headers.put(header.getName(), header.getValue());
67
+ }
68
+
69
+ // get Body of `text/plain`.
70
+ // supported structure:
71
+ // 1. text/plain
72
+ // 2. multipart/alternative
73
+ // - text/plain
74
+ // 3. multipart/mixed
75
+ // - text/plain
76
+ MessagePart part;
77
+ if (payload.getParts() == null) {
78
+ part = payload;
79
+ if (!(part.getMimeType().equals("text/plain"))) {
80
+ failed.add(new GmailWrapper.Message(headers, null));
81
+ continue;
82
+ }
83
+ } else {
84
+ Optional<MessagePart> bodyPart = payload.getParts().stream().filter(p -> p.getMimeType().equals("text/plain")).findFirst();
85
+ if (!(bodyPart.isPresent())) {
86
+ failed.add(new GmailWrapper.Message(headers, null));
87
+ continue;
88
+ }
89
+ part = bodyPart.get();
90
+ }
91
+
92
+ // get body string
93
+ byte[] rawBody = part.getBody().decodeData();
94
+ String body = new String(rawBody, "UTF-8");
95
+
96
+ success.add(new Message(headers, body));
97
+ }
98
+
99
+ Result result = new Result(success, failed);
100
+ return result;
101
+ }
102
+
103
+ class Result {
104
+ private List<GmailWrapper.Message> success;
105
+ private List<GmailWrapper.Message> failed;
106
+
107
+ public Result(
108
+ List<GmailWrapper.Message> success,
109
+ List<GmailWrapper.Message> failed) {
110
+ this.success = success;
111
+ this.failed = failed;
112
+ }
113
+
114
+ public List<GmailWrapper.Message> getSuccessMessages() {
115
+ return success;
116
+ }
117
+
118
+ public List<GmailWrapper.Message> getFailedMessages() {
119
+ return failed;
120
+ }
121
+ }
122
+
123
+ class Message {
124
+ private Map<String, String> headers;
125
+ private Optional<String> body;
126
+
127
+ public Message(
128
+ Map<String, String> headers,
129
+ String body) {
130
+ this.headers = Optional.of(headers).get();
131
+ this.body = Optional.ofNullable(body);
132
+ }
133
+
134
+ public Map<String, String> getHeaders() {
135
+ return headers;
136
+ }
137
+
138
+ public Optional<String> getBody() {
139
+ return body;
140
+ }
141
+ }
142
+ }
@@ -0,0 +1,56 @@
1
+ package org.embulk.input.gmail;
2
+
3
+ import java.io.BufferedReader;
4
+ import java.io.File;
5
+ import java.io.IOException;
6
+ import java.nio.file.Files;
7
+ import java.nio.file.Path;
8
+ import java.nio.file.Paths;
9
+ import java.security.GeneralSecurityException;
10
+ import java.util.Collections;
11
+ import java.util.List;
12
+
13
+ import com.google.api.client.auth.oauth2.Credential;
14
+ import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
15
+ import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
16
+ import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
17
+ import com.google.api.client.googleapis.extensions.java6.auth.oauth2.GooglePromptReceiver;
18
+ import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
19
+ import com.google.api.client.http.javanet.NetHttpTransport;
20
+ import com.google.api.client.json.JsonFactory;
21
+ import com.google.api.client.json.jackson2.JacksonFactory;
22
+ import com.google.api.client.util.store.FileDataStoreFactory;
23
+ import com.google.api.services.gmail.GmailScopes;
24
+
25
+ /**
26
+ * GoogleCredentialCreator
27
+ */
28
+ public class GoogleCredentialCreator {
29
+
30
+ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
31
+ private static final List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_READONLY);
32
+
33
+ private GoogleCredentialCreator() {}
34
+
35
+ public static Credential getCredentials(Path clientSecretPath, String tokenDirectory) throws IOException, GeneralSecurityException {
36
+ NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
37
+ GoogleClientSecrets clientSecret;
38
+ try (BufferedReader br = Files.newBufferedReader(clientSecretPath)) {
39
+ clientSecret = GoogleClientSecrets.load(JSON_FACTORY, br);
40
+
41
+ GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
42
+ transport, JSON_FACTORY, clientSecret, SCOPES)
43
+ .setDataStoreFactory(new FileDataStoreFactory(new File(tokenDirectory)))
44
+ .setAccessType("offline")
45
+ .build();
46
+ GooglePromptReceiver receier = new GooglePromptReceiver();
47
+ return new AuthorizationCodeInstalledApp(flow, receier).authorize("user");
48
+ }
49
+ }
50
+
51
+ public static void main(String[] args) throws IOException, GeneralSecurityException {
52
+ GoogleCredentialCreator.getCredentials(
53
+ Paths.get(args[0]),
54
+ args[1]);
55
+ }
56
+ }
@@ -0,0 +1,5 @@
1
+ package org.embulk.input.gmail;
2
+
3
+ public class TestGmailInputPlugin
4
+ {
5
+ }
@@ -0,0 +1,23 @@
1
+ package org.embulk.input.gmail;
2
+
3
+ import java.io.IOException;
4
+ import java.nio.file.Paths;
5
+ import java.security.GeneralSecurityException;
6
+
7
+ import static org.junit.Assert.*;
8
+
9
+ import org.junit.Test;
10
+
11
+ /**
12
+ * TestGoogleCredentialCreator
13
+ */
14
+ public class TestGoogleCredentialCreator {
15
+ @Test
16
+ public void testGetCredentials() {
17
+ try {
18
+ GoogleCredentialCreator.getCredentials(Paths.get("./src/test/resources/client_secret.json"), "./src/test/resources/tokens");
19
+ } catch (IOException|GeneralSecurityException e) {
20
+ // TODO: fail
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,3 @@
1
+ client_secret.json
2
+ tokens/
3
+
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: embulk-input-gmail
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - mikoto2000
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ name: bundler
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '10.0'
33
+ name: rake
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: Loads records from Gmail.
42
+ email:
43
+ - mikoto2000@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - LICENSE.txt
50
+ - README.md
51
+ - build.gradle
52
+ - classpath/commons-codec-1.10.jar
53
+ - classpath/commons-logging-1.2.jar
54
+ - classpath/embulk-input-gmail-0.1.0.jar
55
+ - classpath/google-api-client-1.26.0.jar
56
+ - classpath/google-api-client-java6-1.26.0.jar
57
+ - classpath/google-api-services-gmail-v1-rev83-1.23.0.jar
58
+ - classpath/google-http-client-1.26.0.jar
59
+ - classpath/google-http-client-jackson2-1.26.0.jar
60
+ - classpath/google-oauth-client-1.26.0.jar
61
+ - classpath/google-oauth-client-java6-1.26.0.jar
62
+ - classpath/guava-20.0.jar
63
+ - classpath/httpclient-4.5.5.jar
64
+ - classpath/httpcore-4.4.9.jar
65
+ - classpath/j2objc-annotations-1.1.jar
66
+ - classpath/jackson-core-2.9.6.jar
67
+ - classpath/jsr305-3.0.2.jar
68
+ - config/checkstyle/checkstyle.xml
69
+ - config/checkstyle/default.xml
70
+ - gradle/wrapper/gradle-wrapper.jar
71
+ - gradle/wrapper/gradle-wrapper.properties
72
+ - gradlew
73
+ - gradlew.bat
74
+ - lib/embulk/input/gmail.rb
75
+ - src/main/java/org/embulk/input/gmail/GmailInputPlugin.java
76
+ - src/main/java/org/embulk/input/gmail/GmailWrapper.java
77
+ - src/main/java/org/embulk/input/gmail/GoogleCredentialCreator.java
78
+ - src/test/java/org/embulk/input/gmail/TestGmailInputPlugin.java
79
+ - src/test/java/org/embulk/input/gmail/TestGoogleCredentialCreator.java
80
+ - src/test/resources/.gitignore
81
+ homepage: https://github.com/mikoto2000/embulk-input-gmail
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.6.8
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Gmail input plugin for Embulk
105
+ test_files: []