[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
```
[⧉[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();
	
	Filter content = new Filter();
	FilterCriteria criteria = new FilterCriteria();
	criteria.setFrom("xxxxxxxx@example.jp");
	content.setCriteria(criteria);
	FilterAction action = new FilterAction();
	action.setAddLabelIds(Arrays.asList("IMPORTANT"));
	content.setAction(action);

	Gmail.Users.Settings.Filters.Create create = filters.create("メールアドレス", content);
	Filter res = create.execute();
	System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/filters
が実行されます。

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

#### 1.2.3. リクエストボディ
Filterのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|getCriteria|[FilterCriteria](#filtercriteriaset)|フィルタの条件|
|getAction|[FilterAction](#filteractionset)|フィルタの条件が一致した場合のアクション|

#### FilterCriteria(Set)

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

#### FilterAction(Set)

|メソッド|引数|説明|
|---|---|---|
|setAddLabelIds|List\<String\>|メッセージに追加するラベルのリスト|
|setRemoveLabelIds|List\<String\>|メッセージから削除するラベルのリスト|
|setForward|String|メッセージの転送先となるメールアドレス|

#### SizeComparison

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

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

#### 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|メッセージの転送先となるメールアドレス|

## 2. フィルタを削除
指定したフィルタを削除します。

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

### 2.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_BASIC
```
[⧉[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.Delete delete = filters.delete("メールアドレス","フィルタID");
	delete.execute();
}
```
#### 2.2.1. HTTPリクエスト
DELETE:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/filters/{フィルタID}
が実行されます。

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

#### 2.2.3. リクエストボディ
リクエストボディはありません。

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

レスポンスはありません。
削除に失敗した場合、例外が発生します。

## 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>
おしまい。。