[Gmail API] JavaでGmailのフィルタ情報を取得する

Gmail API v1（Java）を使用して、
Gmailのフィルタ情報を取得する方法
についてご紹介します。

**Gmail フィルタとは**
受信したメールを設定したフィルタに応じて管理する機能です。
Gmailの「設定」 -> 「フィルタとブロック中のアドレス」 から設定できます。
作成可能なフィルタは1000個までです。
***フィルタ設定画面***
<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/3ec4d41b-cac4-62be-0c06-d89b76bb0b24.png">

##### フィルタの条件の設定UI
<img width=320 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/fa804a7b-9696-27f8-0163-46ff404ddd3e.png">

##### フィルタの条件が一致した場合のアクションの設定UI
<img width=320 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/831c1eab-6ea1-d5ae-bd53-3773b0663c14.png">

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Gmail API] JavaでGmail APIを使う](https://qiita.com/doran/items/a078e966bfd93c4b19c2)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[フィルタリストを取得](#1-フィルタリストを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[フィルタ情報を取得](#2-フィルタ情報を取得)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[Gmail UIとの紐付け](#3-gmail-uiとの紐付け)|
||1|[フィルタの条件](#31-フィルタの条件)|
||2|[フィルタの条件が一致した場合のアクション](#32-フィルタの条件が一致した場合のアクション)|

## 1. フィルタリストを取得
Gmailフィルタリストを取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.MAIL_GOOGLE_COM
GmailScopes.GMAIL_MODIFY
GmailScopes.GMAIL_READONLY
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();
	
	Gmail.Users.Settings.Filters filters = settings.filters();
	Gmail.Users.Settings.Filters.List list = filters.list("メールアドレス");

	ListFiltersResponse res = list.execute();
	System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/filters
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

### 1.3. レスポンスの内容

#### ListFiltersResponse

|メソッド|戻り値|説明|
|---|---|---|
|getFilter|List\<[Filter](#filter)\>|フィルタのリスト|

#### Filter

|メソッド|戻り値|説明|
|---|---|---|
|getId|String|フィルタID|
|getCriteria|[FilterCriteria](#filtercriteria)|フィルタの条件|
|getAction|[FilterAction](#filteraction)|フィルタの条件が一致した場合のアクション|

#### FilterCriteria

|メソッド|戻り値|説明|
|---|---|---|
|getFrom|String|送信者(または表示名)メールアドレス|
|getTo|String|受信者(または表示名)メールアドレス|
|getSubject|String|件名|
|getQuery|String|指定されたクエリに一致するメッセージのみ取得<br>Gmailの検索ボックスと同じ形式|
|getNegatedQuery|String|指定されたクエリに一致しないメッセージのみ取得<br>Gmailの検索ボックスと同じ形式|
|getHasAttachment|Boolean|メッセージに添付ファイルがあるか|
|getExcludeChats|Boolean|応答でチャットを除外するか|
|getSize|Integer|すべてのヘッダーと添付ファイルを含む、メッセージ全体のサイズ(バイト単位)|
|getSizeComparison|[SizeComparison(enum)](#sizecomparison)|サイズフィールドをメッセージサイズと比較する方法|

#### FilterAction

|メソッド|戻り値|説明|
|---|---|---|
|getAddLabelIds|List\<String\>|メッセージに追加するラベルのリスト|
|getRemoveLabelIds|List\<String\>|メッセージから削除するラベルのリスト|
|getForward|String|メッセージの転送先となるメールアドレス|

#### SizeComparison

|定義値|内容|
|---|---|
|unspecified|未設定|	
|smaller|指定されたサイズより小さいメッセージを検索|
|larger|指定されたサイズより大きいメッセージを検索|

## 2. フィルタ情報を取得
フィルタの情報を取得します。

取得したいフィルタIDを指定します。
[1. フィルタリストを取得(Filter)](#filter)の
getId()で取得した値を設定します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
GmailScopes.MAIL_GOOGLE_COM
GmailScopes.GMAIL_MODIFY
GmailScopes.GMAIL_READONLY
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
	Gmail gmail = getGmail();
	Gmail.Users users = gmail.users();
	Gmail.Users.Settings settings = users.settings();
	
	Gmail.Users.Settings.Filters filters = settings.filters();
	Gmail.Users.Settings.Filters.Get get = filters.get("メールアドレス","フィルタID");

	Filter res = get.execute();
	System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
GET:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/filters/{フィルタID}
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

### 2.3. レスポンスの内容

#### Filter

[1.3. レスポンスの内容(Filter)](#filter)と同じです。

## 3. Gmail UIとの紐付け

#### 3.1. フィルタの条件

GmailのUI([フィルタの条件の設定UI](#フィルタの条件の設定ui))と
[FilterCriteria](#filtercriteria)を紐づけた一覧を用意しました。

|UI|Criterianのメソッド|
|---|---|
|From|from|
|To|to|String|
|件名|subject|
|含む|query|
|含まない|negatedQuery|
|添付ファイルあり|hasAttachment|
|チャットは除外する|excludeChats|

#### 3.2. フィルタの条件が一致した場合のアクション
GmailのUI([フィルタの条件が一致した場合のアクションの設定UI](#フィルタの条件が一致した場合のアクションの設定ui))と
[FilterAction](#filteraction)を紐づけた一覧を用意しました。

|UI|Actionのメソッド|LabelID|
|---|---|---|
|受信トレイをスキップ(アーカイブする)|removeLabelIds|INBOX|
|既読にする|removeLabelIds|UNREAD|
|スターを付ける|addLabelIds|STARRED|
|ラベルを付ける|addLabelIds|任意のラベルID|
|転送する|forward||
|削除する|addLabelIds|TRASH|
|迷惑メールにしない|removeLabelIds|SPAM|
|常に重要マークを付ける|addLabelIds|IMPORTANT|
|重要マークを付けない|removeLabelIds|IMPORTANT|
|適用するカテゴリ|addLabelIds|任意のラベルID(カテゴリ)|

<br>
<br>
おしまい。。