GMail APIというのが最近できたらしい。
Java Quickstart
https://developers.google.com/gmail/api/quickstart/java
上記の説明では、gradleを使うようになっている。
gradleプラグインが標準で入っているEclipse 4.5をインストールしておく。もちろんPleiadesを使う。
Eclipseで、新規→その他→Gradle プロジェクト で、プロジェクトを作成する。
Library.javaとLibraryTest.javaが自動で作成されるが削除する。
「Gradle タスク」ビューでbuildを右クリックして「Gradle タスクの実行」をクリックすると、以下のエラーが出た。
--------------------------------------------------------
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileJava'.
> Could not find tools.jar
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
--------------------------------------------------------
プロジェクトルートフォルダに、gradle.propertiesを作成し、以下のようにJDKのパスを設定した。
org.gradle.java.home=C:/Program Files/Java/jdk1.8.0_40
これで上記エラーは出なくなったが、違うエラーになった。
--------------------------------------------------------
C:\eclipse4.5\workspace\GMailAPI\src\main\java\GmailQuickstart.java:16: エラー: シンボルを見つけられません
private static FileDataStoreFactory DATA_STORE_FACTORY;
--------------------------------------------------------
依存性の解決がされていない。
自分でjarダウンロードのタスクを書いて実行しないといけない。
build.gradleに以下を追加する。libsフォルダはルートに作成しておく。
-------------------------------------------------
task copyDependencies(type:Copy) {
from (configurations.compile)
into 'libs' //ダウンロード先ディレクトリ
}
-------------------------------------------------
「実行の構成」から、Gradleの実行構成を作り、タスクに「copyDependencies」を入力して実行すると、
libsにjarがダウンロードされる。
その後、Eclipse上で「Javaのビルド・パス」から、libsにダウンロードしたjarをビルド・パスに入れる。
GmailQuickstart.javaのコンパイルエラーがなくなるので、Eclipseから普通に実行する。
以下のメッセージが表示される。
-------------------------------------------------
Please open the following address in your browser:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=xxxxxxxxx-xxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:23189/Callback&response_type=code&scope=https://www.googleapis.com/auth/gmail.labels
Attempting to open that address in the default browser now...
-------------------------------------------------
ブラウザで上記URLが自動的に開き、Googleの承認画面が表示されるので、「承認」をクリック。
以下のメッセージが表示された。
Received verification code. You may now close this window...
再度、GmailQuickstartを実行すると、めでたくGMailのラベル一覧が表示された。
※出力結果は割愛
###########################################################
次に、以下のコードでメール(メッセージ)の検索を試みる。
---------------------------------------------------------
Gmail service = getGmailService();
String user = "me";
ListMessagesResponse listResponse = service.users().messages().list(user).setQ("検索ワード").execute();
List<Message> messages = listResponse.getMessages();
if (messages.size() == 0) {
System.out.println("No messages found.");
} else {
System.out.println("messages:");
for (Message message : messages) {
System.out.printf("- %s\n", message);
}
}
---------------------------------------------------------
実行すると、権限がないとのエラーになる。
---------------------------------------------------------
Credentials saved to C:\Users\nob\.credentials\gmail-api-quickstart
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Insufficient Permission",
"reason" : "insufficientPermissions"
} ],
"message" : "Insufficient Permission"
}
---------------------------------------------------------
↓に着目する。このフォルダを一旦削除して、再実行すると再度ブラウザで承認画面が開く。
Credentials saved to C:\Users\nob\.credentials\gmail-api-quickstart
しかし、相変わらず「メールボックス ラベルの管理」しか表示されない。
GmailQuickstart.javaのここに着目する。
private static final List<String> SCOPES = Arrays.asList(GmailScopes.GMAIL_LABELS);
以下のように、GMAIL_READONLYを追加する。
private static final List<String> SCOPES = Arrays.asList(GmailScopes.GMAIL_LABELS, GmailScopes.GMAIL_READONLY);
再度実行すると、リクエストの許可画面で、「メール メッセージと設定の表示」も表示された。
承認後、再実行すると、検索が実行できた。
しかし、出力結果を見ると、以下のようにidとthreadIdしかゲットできていない。
-------------------------------------------------------
- {"id":"14f5f0xxxxxxxxxx","threadId":"14f5eefxxxxxxxxxx"}
- {"id":"14f5eexxxxxxxxxx","threadId":"14f5eefxxxxxxxxxx"}
-------------------------------------------------------
メールの内容(送信者、受信者、サブジェクト、本文、etc...)をゲットしたい場合は、
idを元に再度getする必要がある。
以下は、検索して日付とサブジェクトと本文の一部(snippetと言う)をゲットする例。
---------------------------------------------------------
Gmail service = getGmailService();
String user = "me";
Long max = 5L; //最大件数
ListMessagesResponse listResponse = service.users().messages().list(user).setQ("検索ワード").setMaxResults(max).execute();
List<Message> messages = listResponse.getMessages();
System.out.println("ヒットした件数: " + messages.size());
for (Message message : messages) {
Message detailMessage = service.users().messages().get(user, message.getId()).execute();
List<MessagePartHeader> headers = detailMessage.getPayload().getHeaders(); //ヘッダー一覧
String date = "";
String subject = "";
for(MessagePartHeader header : headers) {
if ("Date".equals(header.getName())) { //日付
date = header.getValue();
}
else if ("Subject".equals(header.getName())) { //サブジェクト
subject = header.getValue();
}
}
System.out.println(date + " " + subject);
System.out.println(detailMessage.getSnippet());
System.out.println();
}
---------------------------------------------------------
setQ("検索ワード")の部分は、GMailブラウザ版と同様の検索機能が色々使える。
送信者を指定する例: from:送信者の名前またはアドレス
期間を指定する例: after:2015/08/15 before:2015/08/25
しかし、、自分でタスク書いてlibsにダウンロードするなら、gradleである必要があったのかな・・・。
ちなみにlibsにダウンロードされたjarの一覧はこちら。
ちなみにlibsにダウンロードされたjarの一覧はこちら。
commons-codec-1.3.jar
commons-logging-1.1.1.jar
google-api-client-1.20.0.jar
google-api-services-gmail-v1-rev29-1.20.0.jar
google-http-client-1.20.0.jar
google-http-client-jackson2-1.20.0.jar
google-oauth-client-1.20.0.jar
google-oauth-client-java6-1.20.0.jar
google-oauth-client-jetty-1.20.0.jar
guava-jdk5-13.0.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
jackson-core-2.1.3.jar
jetty-6.1.26.jar
jetty-util-6.1.26.jar
jsr305-1.3.9.jar
servlet-api-2.5-20081211.jar
commons-logging-1.1.1.jar
google-api-client-1.20.0.jar
google-api-services-gmail-v1-rev29-1.20.0.jar
google-http-client-1.20.0.jar
google-http-client-jackson2-1.20.0.jar
google-oauth-client-1.20.0.jar
google-oauth-client-java6-1.20.0.jar
google-oauth-client-jetty-1.20.0.jar
guava-jdk5-13.0.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
jackson-core-2.1.3.jar
jetty-6.1.26.jar
jetty-util-6.1.26.jar
jsr305-1.3.9.jar
servlet-api-2.5-20081211.jar
0 件のコメント:
コメントを投稿