[Gmail API] Javaでメールボックス内スレッドのラベル追加・削除、スレッドの削除をする

Gmail API v1（Java）を使用して、
Gmailのメールボックス内スレッドのラベルを更新・削除する方法と
スレッドを削除、スレッドをゴミ箱に移動したりゴミ箱から削除する方法
についてご紹介します。

**スレッドとは**
件名と宛先が同じで関連する複数の一連のメールのやりとりをまとめて表示する機能です。

**ラベルとは**
スレッドにつける印みたいなものです。
ラベルを作ることでラベル毎に整理、管理することができます

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

本文中の引数にある「メールアドレス」の指定は、
OAuth 2.0使用の場合は「me」（自身）と指定してください。
「me」は認証されたユーザーを示します。

|No||目次|
|---|---|---|
|1||[スレッドのラベル更新・削除](#1-スレッドのラベル更新削除)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[スレッドを削除](#2-スレッドを削除)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[スレッドをゴミ箱に移動](#3-スレッドをゴミ箱に移動)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|
|4||[スレッドをゴミ箱から削除](#4-スレッドをゴミ箱から削除)|
||1|[スコープ](#41-スコープ)|
||2|[実行](#42-実行)|
||3|[レスポンスの内容](#43-レスポンスの内容)|


## 1. スレッドのラベル更新・削除
指定したスレッドのラベルを追加・削除します。

指定するラベルは、
[⧉[Gmail API] Javaでメールボックス内のラベルを取得する](https://qiita.com/doran/items/859f752a4bdf35167873#label)
で取得できます。

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

### 1.2. 実行
指定したスレッドのラベルを追加・削除します。

追加の場合
ModifyThreadRequest.setAddLabelIdsでラベルを指定します。

削除の場合
ModifyThreadRequest.setRemoveLabelIdsでラベルを指定します。

存在しないラベルを指定するとエラーになります。

```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();
    Gmail.Users.Threads threads = users.threads();

    ModifyThreadRequest content = new ModifyThreadRequest();
    content.setAddLabelIds(Collections.singletonList("INBOX"));
    Gmail.Users.Threads.Modify modify = threads.modify("メールアドレス","スレッドID",content);

    com.google.api.services.gmail.model.Thread res = modify.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/threads/{スレッドID}/modify
が実行されます。

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

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

|メソッド|引数|説明|
|---|---|---|
|setAddLabelIds|List\<String\>|このスレッドに追加するラベルIDのリスト<br>最大100個|
|setRemoveLabelIds|List\<String\>|このスレッドから削除するラベルIDのリスト<br>最大100個|

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

#### Thread
(com.google.api.services.gmail.modelパッケージ)

|メソッド|戻り値|説明|
|---|---|---|
|getId|String|スレッドID|
|getSnippet|String|メッセージテキスト|
|getHistoryId|String|このスレッドを変更した最後の履歴レコードID|
|getMessages|List\<[Message](#message)\>|スレッド内のメッセージのリスト|

#### Message

|メソッド|戻り値|説明|
|---|---|---|
|getId|String|メッセージID|
|getThreadId|String|メッセージが属するスレッドID|
|getLabelIds|List\<String\>|このメッセージに適用されるラベルのIDのリスト|
|getSnippet|String|メッセージテキストの短い部分|
|getHistoryId|String|このメッセージを変更した最後の履歴レコードの ID|
|getInternalDate|Long|内部メッセージ作成タイムスタンプ(エポックミリ秒)|
|getPayload|[MessagePart](#messagepart)|メッセージ部分の解析された電子メール構造。
|getSizeEstimate|Integer|メッセージの推定サイズ(バイト単位)|
|getRaw|String|RFC2822形式で Base64URLエンコードされた文字列の電子メールメッセージ全体|

#### MessagePart

|メソッド|戻り値|説明|
|---|---|---|
|getPartId|String|メッセージ部分ID|
|getMimeType|String|メッセージ部分のMIMEタイプ|
|getFilename|String|添付ファイルのファイル名|
|getHeaders|List\<[MessagePartHeader](#messagepartheader)\>|メッセージ部分のヘッダーのリスト|
|getBody|[MessagePartBody](#messagepartbody)|メッセージ部分の本文|
|getParts|List\<[MessagePart](#messagepart)\>|子のMIMEメッセージ部分|

#### MessagePartHeader

|メソッド|戻り値|説明|
|---|---|---|
|getName|String|セパレータの前のヘッダーの名前|
|getValue|String|区切り文字の後のヘッダーの値|

#### MessagePartBody

|メソッド|戻り値|説明|
|---|---|---|
|getAttachmentId|String|添付ファイルID|
|getSize|Integer|メッセージ部分データのバイト数|
|getData|String|MIME メッセージ部分の本文データ(base64 url エンコード文字列)|

## 2. スレッドを削除
指定したスレッドを削除します。

### 2.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
GmailScopes.MAIL_GOOGLE_COM
```
[⧉[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.Threads threads = users.threads();

    Gmail.Users.Threads.Delete delete = threads.delete("メールアドレス","スレッドID");

    delete.execute();
}
```
#### 2.2.1. HTTPリクエスト
DELETE:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/threads/{スレッドID}
が実行されます。

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

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

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

## 3. スレッドをゴミ箱に移動
指定したスレッドをゴミ箱に移動します。

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

### 3.2. 実行
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();
    Gmail.Users.Threads threads = users.threads();

    Gmail.Users.Threads.Trash trash = threads.trash("メールアドレス","スレッドID");

    com.google.api.services.gmail.model.Thread res = trash.execute();
    System.out.println(res);
}
```
#### 3.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/threads/{スレッドID}/trash
が実行されます。

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

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

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

#### Thread

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

## 4. スレッドをゴミ箱から削除
ゴミ箱に移動したスレッドを削除します。

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

### 4.2. 実行
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();
    Gmail.Users.Threads threads = users.threads();

    Gmail.Users.Threads.Untrash untrash = threads.untrash("メールアドレス","スレッドID");

    com.google.api.services.gmail.model.Thread res = untrash.execute();
    System.out.println(res);
}
```
#### 4.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/threads/{スレッドID}/untrash
が実行されます。

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

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

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

#### Thread

[1.3. レスポンスの内容(Thread)](#thread)と同じです。
<br>
<br>
おしまい。。