[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-添付ファイルなし)|
|||1|[スコープ](#111-スコープ)|
|||2|[実行](#112-実行)|
|||3|[レスポンスの内容](#113-レスポンスの内容)|
||2||[添付ファイルあり](#12-添付ファイルあり)|
|||1|[スコープ](#121-スコープ)|
|||2|[実行](#122-実行)|
|||3|[レスポンスの内容](#123-レスポンスの内容)|
|2|||[下書きを更新](#2-下書きを更新)|
||1||[添付ファイルなし](#21-添付ファイルなし)|
|||1|[スコープ](#211-スコープ)|
|||2|[実行](#212-実行)|
|||3|[レスポンスの内容](#213-レスポンスの内容)|
||2||[添付ファイルあり](#22-添付ファイルあり)|
|||1|[スコープ](#221-スコープ)|
|||2|[実行](#222-実行)|
|||3|[レスポンスの内容](#223-レスポンスの内容)|
|3|||[下書きを削除](#3-下書きを削除)|
||1||[スコープ](#31-スコープ)|
||2||[実行](#32-実行)|
||3||[レスポンスの内容](#33-レスポンスの内容)|
|4|||[下書きを送信](#4-下書きを送信)|
||1||[スコープ](#41-スコープ)|
||2||[実行](#42-実行)|
||3||[レスポンスの内容](#43-レスポンスの内容)|

## 1. 下書きを作成
メールボックス内に下書きを作成します。

### 1.1. 添付ファイルなし
添付ファイルがない下書きを作成する場合です。

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

#### 1.1.2. 実行
Draftにメッセージをセットして送信します。

createMimeMessage()、createMessage()の説明は、
[⧉[Gmail API] Javaでメッセージ本文を作成する](https://qiita.com/doran/items/e5bff14b8de85f74ff8b)
を参照ください。
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();

    Gmail.Users.Drafts drafts = users.drafts();
    
    Draft content = new Draft();
    MimeMessage mime = createMimeMessage("Toメールアドレス","件名","本文");
    Message message = createMessage(mime);
    content.setMessage(message);
    
    Gmail.Users.Drafts.Create create = drafts.create("メールアドレス",content);

    Draft res = create.execute();
    System.out.println(res);
}
```
##### 1.1.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/drafts
が実行されます。

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

##### 1.1.2.3. リクエストボディ
Gmail.Users.Draftsのsetメソッドにより、リクエストボディを設定できます。

|メソッド|引数|説明|
|---|---|---|
|setMessage|[Message](#messageset)|下書きのメッセージの内容|

#### Message(Set)

|メソッド|引数|説明|
|---|---|---|
|setId|String|メッセージID|
|setThreadId|String|メッセージが属するスレッドID|
|setLabelIds|List\<String\>|このメッセージに適用されるラベルIDリスト|
|setSnippet|String|メッセージテキストのスナップショット|
|setHistoryId|String|このメッセージを変更した最後の履歴レコードID|
|setInternalDate|Long|内部メッセージ作成タイムスタンプ(エポックミリ秒)|
|setPayload|[MessagePart](#messagepartset)|メッセージ部分の解析された内容|
|setSizeEstimate|Integer|メッセージの推定サイズ(バイト単位)|
|setRaw|String|Base64 URLエンコードされたメッセージ|

#### MessagePart(Set)

|メソッド|引数|説明|
|---|---|---|
|setPartId|String|メッセージ部分ID|
|setMimeType|String|メッセージ部分のMIMEタイプ|
|setFilename|String|添付ファイルのファイル名
|setHeaders|List\<[Header](#headerset)\>|メッセージ部分のヘッダーリスト|
|setBody|[MessagePartBody](#messagepartbodyset)|メッセージ部分の本文|
|setParts|List\<[MessagePart](#messagepartset)\>|子のMIMEメッセージ部分|

#### Header(Set)

|メソッド|引数|説明|
|---|---|---|
|setName|String|セパレータの前のヘッダーの名前。例："To"|
|setValue|String|区切り文字の後のヘッダー値|

#### MessagePartBody(Set)

|メソッド|引数|説明|
|---|---|---|
|setAttachmentId|String|添付ファイルID|
|setSize|Integer|メッセージ部分データのバイト数|
|setData|String|Base64 URLエンコードされたメッセージ部分の本体データ|

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

#### Draft

|メソッド|戻り値|説明|
|---|---|---|
|getId|String|ドラフトID|
|getMessage|[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 エンコード文字列)|

### 1.2. 添付ファイルあり
添付ファイルがある下書きを作成する場合です。

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

#### 1.2.2. 実行
Draftにメッセージをセットして送信します。
複数の送信予定のファイルを設定して下書きを作成しています。

createMimeMessage()、createMessage()の説明は、
[⧉[Gmail API] Javaでメッセージ本文を作成する](https://qiita.com/doran/items/e5bff14b8de85f74ff8b)
を参照ください。
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();

    Gmail.Users.Drafts drafts = users.drafts();
    
    Draft content = new Draft();
    Map<String,String> files = new HashMap<>();
    files.put("ファイル名1", "ファイルパス1");
    files.put("ファイル名2", "ファイルパス2");
    
    MimeMessage mime = createMimeMessage("Toメールアドレス","件名","本文",files);
    Message message = createMessage(mime);
    content.setMessage(message);
    Gmail.Users.Drafts.Create create = drafts.create("メールアドレス",content);

    Draft res = create.execute();
    System.out.println(res);
}
```
##### 1.2.2.1. HTTPリクエスト
POST:　https:\//gmail.googleapis.com/upload/gmail/v1/users/{メールアドレス}/drafts
が実行されます。

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

##### 1.2.2.3. リクエストボディ
Gmail.Users.Draftsのsetメソッドにより、リクエストボディを設定できます。

[1.1. 添付ファイルなし(1.1.2.3. リクエストボディ)](#1123-リクエストボディ)と同じです。

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

#### Draft

[1.1. 添付ファイルなし(1.1.3. レスポンスの内容)](#113-レスポンスの内容)と同じです。

## 2. 下書きを更新
指定した下書きを更新します。
更新の場合、下書きで設定されたメッセージは完全に破棄され、更新で指定した
新しいメッセージに更新されます。

### 2.1. 添付ファイルなし
添付ファイルがない下書きを更新する場合です。

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

#### 2.1.2. 実行
Draftにメッセージをセットして下書きを更新します。
ドラフトIDは、[DraftのgetId()](#draft)で取得できる値を指定してください。

createMimeMessage()、createMessage()の説明は、
[⧉[Gmail API] Javaでメッセージ本文を作成する](https://qiita.com/doran/items/e5bff14b8de85f74ff8b)
を参照ください。
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();

    Gmail.Users.Drafts drafts = users.drafts();
    
    Draft content = new Draft();
    MimeMessage mime = createMimeMessage("Toメールアドレス","新しい件名","本文");
    Message message = createMessage(mime);
    content.setMessage(message);
    
    Gmail.Users.Drafts.Update update = drafts.update("メールアドレス","ドラフトID",content);

    Draft res = update.execute();
    System.out.println(res);
}
```
##### 2.1.2.1. HTTPリクエスト
PUT:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/drafts/{ドラフトID}
が実行されます。

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

##### 2.1.2.3. リクエストボディ
Gmail.Users.Draftsのsetメソッドにより、リクエストボディを設定できます。

[1.1.2.3. リクエストボディ](#1123-リクエストボディ)と同じです。

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

#### Draft

[1.1.3. レスポンスの内容](#113-レスポンスの内容)と同じです。

### 2.2. 添付ファイルあり
添付ファイルがある下書きを更新する場合です。

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

#### 2.2.2. 実行
Draftにメッセージをセットして送信します。
複数の送信予定のファイルを設定して下書きを更新しています。

createMimeMessage()、createMessage()の説明は、
[⧉[Gmail API] Javaでメッセージ本文を作成する](https://qiita.com/doran/items/e5bff14b8de85f74ff8b)
を参照ください。
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();

    Gmail.Users.Drafts drafts = users.drafts();
    
    Draft content = new Draft();
    Map<String,String> files = new HashMap<>();
    files.put("ファイル名1", "ファイルパス1");
    files.put("ファイル名2", "ファイルパス2");
    
    MimeMessage mime = createMimeMessage("Toメールアドレス","件名","本文",files);
    Message message = createMessage(mime);
    content.setMessage(message);
    Gmail.Users.Drafts.Update update = drafts.update("メールアドレス","ドラフトID",content);

    Draft res = create.execute();
    System.out.println(res);
}
```
##### 2.2.2.1. HTTPリクエスト
GET:　https:\//gmail.googleapis.com/upload/gmail/v1/users/{メールアドレス}/drafts/{ドラフトID}
が実行されます。

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

##### 2.2.2.3. リクエストボディ
[1.1. 添付ファイルなし(1.1.2.3. リクエストボディ)](#1123-リクエストボディ)と同じです。

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

#### Draft

[1.1. 添付ファイルなし(1.1.3. レスポンスの内容)](#113-レスポンスの内容)と同じです。

## 3. 下書きを削除
指定した下書きを削除します。

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

#### 3.2. 実行
下書きを削除します。
ドラフトIDは、[DraftのgetId()](#draft)で取得できる値を指定してください。

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

    Gmail.Users.Drafts drafts = users.drafts();
    Gmail.Users.Drafts.Delete delete = drafts.delete("メールアドレス","ドラフトID");

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

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

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

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

## 4. 下書きを送信
指定した下書きを送信します。

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

#### 4.2. 実行
Draftに送信したいドラフトIDをセットして下書きを送信します。
ドラフトIDは、[DraftのgetId()](#draft)で取得できる値を指定してください。

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

    Gmail.Users.Drafts drafts = users.drafts();
    Draft content = new Draft();
    content.setId("ドラフトID");
    Gmail.Users.Drafts.Send send = drafts.send("メールアドレス",content);

    Message res = send.execute();
    System.out.println(res);
}
```
##### 4.2.1. HTTPリクエスト
添付ファイルがない場合、
POST:　https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/drafts/send

添付ファイルがある場合、
POST:　https:\//gmail.googleapis.com/upload/gmail/v1/users/{メールアドレス}/drafts/send

が実行されます。

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

##### 4.2.3. リクエストボディ
Gmail.Users.Draftsのsetメソッドにより、リクエストボディを設定できます。

[1.1.2.3. リクエストボディ](#1123-リクエストボディ)と同じです。

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

#### Message

[1.1.3. レスポンスの内容(Message)](#message)と同じです。

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