2015年8月24日月曜日

GMail APIを使ってJavaからGMail検索

















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の一覧はこちら。

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


0 件のコメント:

コメントを投稿